LINUX.ORG.RU

Сообщения just_a_student

 

настройки прокси-сервера в Buildroot

Здравствуйте!
В университете для подключения к сети необходимо было настроить прокси, что я и сделал через System Settings -> Network -> Network Proxy -> Manual. (Ubuntu 12.04 LTS)
Дома соответственно я эти настройки отключил (поменяв Manual на None).
Интернет через браузер и apt-get работают отлично, но при попытке собрать проект в Buildroot столкнулся с тем, что он пытается скачать пакеты через прокси сервер, который был прописан ранее и был отключен.
Пробовал это:

export http_proxy=""
export https_proxy=""
export ftp_proxy=""
не помогло.
Команда
env | grep proxy
ничего не выдает.

Как я понял от сюда, проблема актуальна, но решение зависит от конкретной программы.

Подскажите пожалуйста, как изменять настройти прокси сервера в Buildroot?
Мануал Buildroot мне не помог
Заранее спасибо!

just_a_student
()

Запись данных по физическому адресу

Здравствуйте!
Для одного теста нужно, по заранее известному физическому адресу, записать данные.
Подскажите пожалуйста, какой функцией это можно сделать из модуля ядра?
Писать нужно именно по физическому адресу, без маппирования.
Спасибо.

just_a_student
()

не меняется конфиг

Пытаюсь изменить в .config параметр

CONFIG_X86_PAT=y
на
# CONFIG_X86_PAT is not set

Однако стоит мне запустить сборку, как файл конфигурации упорно перезаписывается с прежним параметром.
Другой параметр, который тоже меняю, при этом остается в измененным.
Почему так? Как исправить?

just_a_student
()

маппирование CMA области на /dev/mem

Здравствуйте!
Мне нужно выделить 256-512 Мб непрерывной(!) физической памяти и иметь прямой доступ к ней из пространства пользователя.
Для выделения памяти я решил использовать патч CMA.
По моей задумке все должно происходить так:
1. CMA выделят нужное кол-во памяти во время загрузки системы.
2. Парсится вывод CMA патча, который имеет вид, например: «CMA: reserved 256 MiB at 27400000» и из него извлекаются данные: размер CMA области = 256*1024*1024 байта и физический адрес этой области = 0х27400000 (это значение только для моей системы разумеется).
3. Маппирую нужное кол-во байт функцией mmap() в файл /dev/mem с оффсетом = 0х27400000. Естественно, параметр CONFIG_STRICT_DEVMEM отключен.

Все вроде как просто, но следующий код приводит к segmentation fault(объем памяти тут взял = 1Мб):

int file;
void* start;

file=open("/dev/mem", O_RDWR | O_SYNC);

if ( (start = mmap(0, 1024*1024, PROT_READ | PROT_WRITE, MAP_SHARED, file, 0x27400000)) == MAP_FAILED ){
    perror("mmap");
}

for (int offs = 0; offs<50; offs++){
     cout<<((char *)start)[offs];
}

Выводит следующее: mmap: Invalid argument.

Но если в этом коде оффсет поменять на ноль или на многие другие значения (которые я брал из /proc/iomem), то код работает прекрасно и выводит мусор, как и ожидается.
Судя по информации из того же /proc/iomem физический адрес CMA зоны (0х27400000 на моей системе) всегда находится в System RAM. И этот участок система никак не позволяет мне смаппировать.

Подскажите пожалуйста, как можно это сделать?
Заранее спасибо!

 cma,

just_a_student
()

kernel panic - not syncing: No init found

Здравствуйте!
Есть загрузочная флешка linux для одноплатного компьютера с ядром 3.10.22 и файлом initrd.img-3.10.22, сделанная так, чтобы постоянная файловая система не монтировалась, а работа велась в initrd, который крутится в оперативной памяти. Загрузчик - Grub2. При запуске соответственно выдает ошибку:

kernel panic - not syncing: No init found
Хотя файл init в initrd точно есть, он точно корректен и этот же initrd отлично работает на другой загрузочной флешке с ядром 3.10.12
В чем может быть проблема? Как лечить?
На всякий случай привожу содержимое grub.cfg:
insmod part_msdos
set default=0
set timeout=1
insmod ext2

menuentry "My_Linux" {
  set root=(hd0,msdos1)
  linux /boot/vmlinuz-3.10.22
  initrd /boot/initrd.img-3.10.22 
  }

Заранее спасибо!

just_a_student
()

видимая оперативная память в 32 битной системе

На ноуте 6Гб оперативной памяти. Поставил на него 32 битную убунту.
Вот вывод команды free -m:

             total       used       free     shared    buffers     cached
Mem:          5970       1223       4746          0        160        572
Значит ли это что несмотря на 32 битное ядро мне каким то образом доступна вся оперативная память, или я все же могу использовать только 2Гб из шести?
Заранее спасибо!

just_a_student
()

Ошибка при установке Grub 2

Делаю загрузочную флешку. Отформатировал ее ext3.
Попытка поставить граб командой:

 sudo grub-install --boot-directory=/media/kirill/flash  /dev/sdd 
оканчивается ошибкой:
 
/usr/sbin/grub-bios-setup: предупреждение: Файловая система «ext2» не поддерживает встраивание.[br]
/usr/sbin/grub-bios-setup: ошибка: встраивание невозможно, но оно необходимо для междисковой установки.
При этом флешка отформатирована в ext3.
Как тут быть? Заранее спасибо!

just_a_student
()

модули ядра написанные не на С

Мне вот просто интересно стало, возможно ли писать модули ядра не на С?
Во всех учебниках/справочниках используется именно этот язык, и даже не обсуждается возможность использования других.
Откуда такая безальтернативность?

just_a_student
()

не проходит вызов ioctl();

Здравствуйте!
Столкнулся с непонятной для меня ошибкой:
Есть драйвер, в котором объявлена структура file_operations:

static struct file_operations fops = {
	.owner        = THIS_MODULE,
	.open         = Open,
	.release      = Close,
        .compat_ioctl = Ioctl,
	.mmap         = Mmap,
};
Из кода тестовой программы происходит вызов:
::ioctl(arg1, arg2, arg3);
где: arg1 = 3 (файловый дескриптор), arg2 - целое число, arg3 - указатель на первый элемент массива. Все аргументы корректные.
Проблема в том, что функция Ioctl(), описанная в коде драйвера при этом не вызывается. Это установлено точно, с помощью отладочных выводов. А вызов ioctl из тестовой программы возвращает -1 (при том что в коде драйвера в Ioctl() в принципе нет return -1;).
При этом, все остальные функции из file_operations успешно вызываются из тестовой программы (установлено так же с помощью отладочных выводов).

Подскажите пожалуйста, в чем может быть причина этой проблемы и как от нее избавится?
Заранее спасибо!

just_a_student
()

kernel BUG at mm/memory.c при вызове remap_pfn_range()

Здравствуйте!
Пытаюсь заставить работать на новом ядре драйвер и тестовую программу к нему, которые были написаны лет пять назад для этого же железа, но для старого ядра. В те времена все работало отлично.
Компьютер одноплатный. Загрузочная карта памяти содержит linux с ядром 3.10.12 и файлом initrd.img, сделанным так, чтобы постоянная файловая система не монтировалась, а работа велась в initrd, который крутится в оперативной памяти. Ядро было довольно сильно урезано, для экономии памяти.
Драйвер создан для сигнального процессора, который связан с одноплатным компьютером через PCI шину (и компьютер и плата содержащая процессор вставляются в PCI слоты в одной стойке). Драйвер успешно распознает процессор и загружается в систему.
Этот драйвер позволяет загружать данные с хоста (одноплатного компьютера) прямо в память сигнального процессора. Тестовая программа собственно это и делает.
В коде драйвера, в структуре file_operations, определена функция .mmap, которая, насколько я понимаю, производит отображение памяти процессора в пространство ядра. Функция mmap заключается в вызове функции remap_pfn_range(). Именно на вызове этой функции вылетает следующая ошибка и вся система перестает работать (здесь linkdrv это драйвер, а BoardTest это тестовая программа):

--------[ cut here ]--------
kernel BUG at mm/memory.c :2377! 
invalid opcode: 0000 [#1] SMP DEBUG_PAGEALLOC
Modules linked in: linkdrv(0)
CPU: 1 PID: 851 Comm: BoardTest Tainted: G   0 3.10.12 #10
Hardware name:      /F15, BIOS F15r1-Q.11 10/17/2006 
task: f6581950 ti: f5c5c000 task.ti: f5c5c000 
EIP: 0060:[<c10aeac4>] EFLAGS: 00010246 CPU: 1 
EIP is at remap_pfn_range+0x75/0x191
ЕАХ: 00000000 EBX: b72f5000 ECX: b72f5000 EDX: 00000000 
ESI: f6616c08 EDI: 00040000 EBP: f5c5ded8 ESP: f5c5de9c
 DS: 007b ES: 007b FS: 00d8 GS: 0033 SS: 0068 
CR0: 80050033 CR2: b760а890 CR3: 35c2f000 CR4: 000007d0 
DR0: 00000000 DR1: 00000000 DR2: 00000000 DR3: 00000000 
DR6: ffff0ff0 DR7: 00000400 
Stack:
 f5c5ded8 с10b2b9с f67d3540 00000200 f65175ac 00000003 
 00000000 b72f5000 00000000 f5c5ded0 f678ce00 f6616c08 
 f8028123 00000000 00000027 f6616c08 b74f5000 f5c5df24 
Call Trace:
 [<c10b2b9c>] ? vma_merge+0x148/0xlc5
 [<f80281Z3>] Mmар+0х4а/0х51 [linkdrv]
 [<c10b3fl6>] mmap_region+0x20d/0x3c8
 [<c10b4330>] do_mmap_pgoff+0x25f/0x2d5
 [<c10a9a3c>] vw_mmap_pgoff+0x54/0x7d
 [<c10b2d96>] SyS_mmap_pgoff+0xllf/0x159
 [<c14a2558>] syscall_call+0x7/0xb 
Code: 04 75 ec 89 7e 4c ff 75 ec 89 f9 8d 55 0c 89 f0 53 e8 88 36
EIP: [<c10aeac4>] remap_pfn_range+0x75/0x191  SS:ESP 0068:f5c5de9c 
---[ end trace b23282ceb98d656f ]---
Я нашел только один аналогичный случай на stackoverflow, но там проблема состояла в отображении большого объема памяти (1Гб и более). Здесь же такой проблемы не стоит. На всякий случай я все равно сделал так как советовали там в ответе (включив в ядре опцию CONFIG_TRANSPARENT_HUGEPAGE), но это разумеется не помогло. Пробовал так же использовать ядро с defconfig, но результат оставался тем же.

Подскажите пожалуйста, в чем может быть причина этой ошибки и в чем она вообще заключается? Насколько я понимаю, проблема больше в ядре(ведь драйвер раньше работал). Возможно нужно что-то изменить в конфигах? Если так, то что именно?

Заранее спасибо за любую помощь!

just_a_student
()

компиляция в Code::Blocks программ для i386 из под 64х процессора

Здравствуйте.
Извиняюсь за очень глупый вопрос, но не нашел в сети ответа:
Нужно компилировать программу для 32 битного процессора, а сам я работаю на 64 битном. Как настроить Code::Blocks так чтобы он это делал? Я отмечал пункт «i386» в меню Project->Build Options (к команде g++ добавляется опция -march=i386), но при сборке мне выдается ошибка: «заданный процессор не поддерживает набор команд x86-64». На 32 битной машине этот проект компилируется без проблем.
Очень не хочется из-за такой ерунды с виртуальной машиной заморачиваться.
Заранее спасибо!

just_a_student
()

Не линкуется проект с boost::thread

Здравствуйте!
Пытаюсь собрать проект в Code::Blocks на Ubuntu. В проекте используется библиотека boost::thread. Файл /usr/lib/libboost_thread.so добавлен в Build Options -> Linker settings. Раньше, более мелкие проекты на boost::thread собирались без проблем, а теперь выдаются ошибки про undefined reference to `operator new'.
Например:

obj/Debug/Boards.o||In function `Boards::Boards(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)':
/home/kirill/BoardTest/Boards.cpp|34|undefined reference to `operator new(unsigned long)'

obj/Debug/Boards.o||In function `boost::exception_ptr boost::exception_detail::get_static_exception_object<boost::exception_detail::bad_alloc_>()':
/usr/include/boost/exception/detail/exception_ptr.hpp|125|undefined reference to `operator new(unsigned long)'

obj/Debug/Boards.o||In function `boost::exception_ptr boost::exception_detail::get_static_exception_object<boost::exception_detail::bad_exception_>()':
/usr/include/boost/exception/detail/exception_ptr.hpp|125|undefined reference to `operator new(unsigned long)'
И так далее. Раньше подключения /usr/lib/libboost_thread.so было всегда достаточно.
Подскажите пожалуйста, что еще ему нужно подключить, чтобы он перестал ругаться?
Заранее спасибо!

 

just_a_student
()

Проблема со сборкой проекта в Code Blocks

Здравствуйте!
Столкнулся с небольшой технической проблемой при попытке собрать проект в Code Blocks.
Проект состоит из двух каталогов: в верхнем лежит main.cpp + еще несколько .cpp и .h файлов. В него вложен второй каталог Libr, в котором находится библиотека в виде набора .h файлов. Все инклуды прописаны корректно, все файлы добавленны в проект. Никаких синтаксических и прочих ошибок нет.
Проблема вот в чем: в файлах библиотеки Libr большинство классов и функций помещено в нэймспэйс DspLink. И Code Blocks не хочет собирать проект, жалуясь на каждую функцию из этого неймспейса примерно так:

undefined reference to `DspLink::Boards::Boards(std::string, std::string)'
Ошибки эти возникают тех .cpp файлах, которые находятся в каталоге верхнего уровня. Прочем во вкладке Symbols этот неймспейс со всем содержимым отображается, то есть Code Blocks его видит.
Подскажите пожалуйста, что нужно сделать, чтобы проект скомпилировался?
Заранее спасибо!

P.S.
Когда то у меня была аналогичная проблема при сборке проекта в котором использовалась библиотека boost::thread. Все инклуды были прописаны верно, но все равно выскакивали ошибки типа:
undefined reference to `boost::thread...
Тогда выходом было прописать файл /usr/lib/libboost_thread.so в build options во вкладке Linker settings. Возможно, что в данном случае нужно сделать что-то подобное, правда библиотека представлена набором хедеров а не .so файлом.

just_a_student
()

Подключение нужного заголовочного файла

Здравствуйте!
Сразу скажу, что в программировании модулей я новичок.
Пытаюсь скомпилировать драйвер под ядро 3.10.12, написанный довольно давно для ядра 2.6.
Изначально в тексте драйвера были следующие инклуды:

#include <linux/uio_driver.h>
#include <linux/pci.h>
Компилятор выдавал кучу ошибок. После добавления заголовочных файлов:
#include <linux/module.h>
#include <linux/init.h>
осталась единственная ошибка только в объявлении одной функции «probe»:
/.../driver.c:50:22: ошибка: expected «=», «,», «;», «asm» or «__attribute__» before «probe»
/.../driver.c:169:11: ошибка: «probe» undeclared here (not in a function)

Объявление этой функции выглядит так:
 static int __devinit probe(...)

На сколько я понял, компилятор не знает что такое __devinit, принимая это за имя функции. Это странно, потому что, на сколько я знаю от сюда, __devinit определен в linux/init.h, который я уже подключил. Подозреваю, что нужно еще что-нибудь подключить, но не знаю что.
Подскажите пожалуйста, какой заголовочный файл нужно еще подключить, чтобы устранить эту ошибку?
Заранее спасибо!

just_a_student
()

Библиотечные файлы в initrd.img

Здравствуйте!
Есть загрузочная флешка linux с ядром 3.10.12 и файлом initrd.img, сделанная так, чтобы постоянная файловая система не монтировалась, а работа велась в initrd, который крутится в оперативной памяти.
Файл initrd.img создавался давно (два-три года назад) для ядра версии 2.6.32.48.
В этом RAM диске есть папка /lib со следующим содержанием:

modules
ld-linux.so.2
libc.so.6
libdl.so.2     
libm-2.11.1.so  
libpthread-2.11.1.so  
librt-2.11.1.so  
libz.so.1        
libc-2.11.1.so 
libdl-2.11.1.so  
libgcc_s.so.1  
libm.so.6      
libpthread.so.0       
librt.so.1       
libz.so.1.2.3.3

В папку /lib/modules я устанавливаю модули своего нового ядра 3.10.12, а остальные библиотечные файлы лежат тут давно, с момента создания этого initrd.
Если эти файлы убрать из initrd, то я получаю kernel panic. Если оставить - то система запускается
Объясните мне пожалуйста, что это за библиотечные файлы в папке /lib, файла initrd.img? Имеют ли они отношение к конкретному ядру, или универсальны? Если они относятся к конкретному ядру, то где мне их взять после компиляции? Самостоятельный поиск в интернете результата не дал.
Заранее спасибо!

just_a_student
()

Grub Error 15 из-за имени файла ядра

Здравствуйте.
Есть загрузочная флешка, на которой стоит первый Grub. Скомпилировал я сначала монолитное ядро версии 3.8.9 и положил файл vmlinuz-3.8.9 в папку /boot на флешке. Внес соответствующие изменения в файл menu.lst Все работало хорошо. Потом я убрал ядро 3.8.9 и скомпилировал ядро 3.10.12, занес так же его на флешку и отредактировал menu.lst При запуске Grub выдал:

Error 15: file not found
Странность вот в чем: если переименовать этот же файл ядра 3.10.12 на предыдущее: vmlinuz-3.8.9, и внести соответствующие изменения в файл menu.lst, то все грузится нормально. Но файл ядра тот же: 3.10.12 !!
Вариант, что я забывал отредактировать menu.lst исключен: все проделал и перепроверил помногу раз.
Кто-нибудь сталкивался с такой проблемой? В чем вообще может быть причина? Как лечить? Может быть в какие-то еще конфиги Grub нужно вносить изменения?
Заранее спасибо

just_a_student
()

Установка ядра на флешку

Здравствуйте! Заранее извинюсь за то, что вопрос скорее всего глупый, и попрошу желающих постебаться над новичком покинуть тему.

В общем есть флешка (карта памяти compact flash) с установленным на ней линуксом. На флешке два раздела: один под Grub, второй под ядро, initrd и System.map. Проект на этой флешке сделан уже давно (два-три года назад). Стоит там два ядра версий 2.6.х. Скрипт init в файлах initrd откорректирован так, чтобы постоянная файловая система не монтировалась, а работа велась в initramfs, которая крутится в оперативной памяти. Все работает великолепно.

Я сейчас пробую поставить в этот проект новое ядро. Делаю это так: компилирую ядро, копирую bzImage и System.map на флешку и вношу соответствующие изменения в меню Grub. Оба файла, разумеется, переименовываю как положено. Initrd беру от старого проекта.
Проблема в следующем: если я компилирую монолитное ядро, то оно хоть и с руганью, но загружается и работает. Но если при конфигурации я допускаю подключение модулей, то ничего не происходит: просто мигающий курсор после выбора этого ядра в загрузчике и все. Точно знаю, что старые ядра для этого проекта модульные.

Подскажите пожалуйста, в чем может быть проблема? Возможно это никак не связанно с модульностью? А если связанно, то как мне перенести вновь откомпилированное ядро на флешку так, чтобы оно запустилось.
Заранее спасибо!

just_a_student
()

initramfs вместо обычной файловой системы

Здравствуйте! Я читал, что в некоторых встраиваемых системах, работающих на Linux начальная файловая система initramfs, загружаемая в оперативную память, используется вместо обычной файловой системы. Расскажите пожалуйста, как на стадии установки сделать так, чтобы в качестве рабочей фс оставалась именно initramfs. Ну и чтобы в ней был busybox или что то подобное, разумеется. Если это слишком обширный вопрос, чтобы его здесь расписывать, то поделитесь пожалуйста ссылками на статьи, где этот случай описывается. Заранее спасибо!

just_a_student
()

Не могу добавлять сообщения в Talks

Здравствуйте. У меня отсутствует ссылка [Добавить сообщение] в разделе форума «Talks». Как мне получить возможность писать в этот раздел форума? Спасибо

just_a_student
()

Восстановление Grub

Здравствуйте! Решил ради интереса поменять стандартный Grub2 на старый, но более понятный Grub. Выполнил команды:

apt-get purge grub2 grub-pc
apt-get install grub-legacy-doc grub
и перезагрузился... Меню grub не появилось, и открылась консоль grub rescue> Я нашел довольно подробную заметку о том, как мне загрузиться из этой консоли: http://webhamster.ru/site/page/index/articles/comp/196

Но когда я дошел до пункта, где нужно попасть в нормальное меню загрузки, выполнив команду

grub rescue> insmod normal
я получил ответ: error: file not found. Скажите пожалуйста, возможно ли как то избежать этой ошибки и загрузиться из этой консоли? или уже только через Live CD возможно все восстановить? Заранее спасибо!

just_a_student
()

RSS подписка на новые темы