|
|
  |
Embedded linux bootstraping, ликбез |
|
|
|
Sep 3 2007, 07:51
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
Цитата(3.14 @ Sep 3 2007, 10:19)  Странно, если образ рамдиска не GZIP-ить, тогда ядро его находит ... Ммм... Никогда не пробовал не GZIP-ить. Мож чего в uboot надо сказать по поводу GZIP? Ну или при создания образа для uboot? Как вариант пользуйте непакованный и разберитесь с initramfs. Оно конечно ядро перелинковывать каждый раз при изменении файловой системы не ахти как удобно, но типа рекомендуемый путь.
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
|
Sep 3 2007, 07:59
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
К стати не понял что за второй параметр у initrd=0xa1000000,0x400000 Цитата Kernel command line: root=/dev/ram0 rw initrd=0xa1000000,0x400000 ramdisk_size=4000 console=ttyS0,115200n8 mem=128M Из kernel-parameters.txt Цитата initrd= [BOOT] Specify the location of the initial ramdisk Что указано после запятой?
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
|
Sep 3 2007, 11:08
|

Их либе дих ...
     
Группа: СуперМодераторы
Сообщений: 2 010
Регистрация: 6-09-04
Из: Russia, Izhevsk
Пользователь №: 609

|
Уперся ... В качестве init (linuxrc) у меня ash скрипт работающий через busybox, bysybox я сам не собирал я взял из корневухи для платы colibri (процессор такой же). Если при загрузке пытаться этот скрипт запустить (linuxrc), получаю следующее Цитата RAMDISK: Compressed image found at block 0 VFS: Mounted root (ext2 filesystem). Freeing init memory: 92K Kernel panic - not syncing: No init found. Try passing init= option to kernel. Заглянув в тело самого busybox, заметил строчку "/lib/ld-linux.so.2", из чего сделал вывод, что бузибокс собран не статически и добавил в образ своего рамдиска директорию lib и эту самую библиотеку (из корневухи для colibri), получаю: Цитата RAMDISK: Compressed image found at block 0 VFS: Mounted root (ext2 filesystem). Freeing init memory: 92K /bin/ash: error while loading shared libraKernel panic - not syncing: Attempted to kill init! ries: libm.so.6: cannot open shared object file: No such file or directory Добавляю в lib libm.so.6, получаю: Цитата RAMDISK: Compressed image found at block 0 RAMDISK: ran out of compressed data invalid compressed format (err=1) VFS: Mounted root (ext2 filesystem). Freeing init memory: 92K EXT2-fs error (device ram0): ext2_check_page: bad entry in directory #14: rec_len is smaller than minimal - offset=0, inode=0, rec_len=0, name_len=0 Warning: unable to open an initial console. EXT2-fs error (device ram0): ext2_check_page: bad entry in directory #12: rec_len is smaller than minimal - offset=0, inode=0, rec_len=0, name_len=0 Kernel panic - not syncing: No init found. Try passing init= option to kernel.
--------------------
Усы, борода и кеды - вот мои документы :)
|
|
|
|
|
Sep 3 2007, 19:13
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
Чтобы не заморачиватся с либами на этапе загрузки лучше пересоберите busybox статически. У меня динамический так и не пошел. Не знаю, чего ему точно не хватило, но busybox всегда использую статический. "Loading 4000KiB [1 disk] into ram disk" - это потому что не GZIP-леный. Ядро его копирует в удобный участок памяти (туда, где отмаллочился ramdisk). Если GZIP-леный, то распаковывается прямо на место. Перепроверте соответствие размеров рамдиска параметрам, укажите 4096 вместо 4000. ramdisk_size указывается для распакованного образа. В соответствии с рекомендацией на загрузчики Linux GZIPленный initrd нужно размещать по адресу 16M - sizeof(initrd). Правда могу ошибатся на счет 16M - эта цифра зависима от архитектуры. Только что посмотрел, нашел рекомендации для x86 в Documentation/i386/boot.txt. Для ARM вроде нет указаний куда грузить initrd. Думаю, что initrd лучше разместить в притык к концу памяти, то есть по адресу = размер памяти - размер GZIP-ленного initrd. С учетом memory map конечно. Цитата Добавляю в lib libm.so.6, получаю: Этого по идее не достаточно. Нужно, по крайней мере, всю libc на initrd закатать. Со всеми ссылками. В качестве перчня можно посмотреть на PC. Набор библиотек тот-же. Вероятно нужно libiconv еще. Цитата В качестве init (linuxrc) Обычно /linuxrc -> симлинк на /bin/init /bin/init -> симлинк на /bin/busybox Можно и ash скрипт, ситуацию с библиотеками это не маняет.
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
|
Sep 4 2007, 08:16
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
В дополнение, Поскольку ldd не работает в кросс-варианте, используйте objdump (от кросс-компиллятора) для определения необходимых библиотек. Код arm-linux-objdump -x bin/bash ...... Тут много всякого, найдите седующее: Dynamic Section: NEEDED libtermcap.so.2 NEEDED libdl.so.2 NEEDED libc.so.6 ...... Тут еще много всякого arm-linux- - это для примера - разумеется используйте Ваш вариант именования crosstools.
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
|
Sep 4 2007, 13:02
|

Их либе дих ...
     
Группа: СуперМодераторы
Сообщений: 2 010
Регистрация: 6-09-04
Из: Russia, Izhevsk
Пользователь №: 609

|
Итак ... взял образ рамдиска отсюда http://heavy-online.ru/arm-linux/ . На удивление, все заработало, теперь пошли общие вопросы. Скачал более свежий busybox, насколько я понимаю, если я его собираю (make CROSS_COMPILE=arm-linux-), то при сборе он использует либу glib, причем для x86? По крайней мере, все попытки запустить на моем девайсе самодельно собранный бузибокс закончились неудачей, пробовал и статически собирать и ... . Новую либу тоже надо кросс компилятором собрать? Еще, мне надо как то Z-modem к моему хозяйству прикрутить, чтоб начать ковырятся с драйвером NAND флешки (иначе тонны времени потрачу на обновлении корневухи). Какие могут возникнуть минусы, если пользоваться uClib? Думаю, стоит ли бузибокс с uClib собирать ... Скачал uClib, собирается если указать процессор i386, если указать ARM, вываливается с криком: Цитата ./extra/scripts/conf-header.sh .config > include/bits/uClibc_config.h cc1: error: invalid option `little-endian' cc1: error: invalid option `little-endian' CC ldso/ldso/ldso.oS cc1: error: invalid option `little-endian' make: *** [ldso/ldso/ldso.oS] Ошибка 1 Причем от настройки индианы это не зависит.
--------------------
Усы, борода и кеды - вот мои документы :)
|
|
|
|
|
Sep 4 2007, 14:33
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
Цитата(3.14 @ Sep 4 2007, 16:02)  Итак ... взял образ рамдиска отсюда http://heavy-online.ru/arm-linux/ . На удивление, все заработало, теперь пошли общие вопросы. Скачал более свежий busybox, насколько я понимаю, если я его собираю (make CROSS_COMPILE=arm-linux-), то при сборе он использует либу glib, причем для x86? По крайней мере, все попытки запустить на моем девайсе самодельно собранный бузибокс закончились неудачей, пробовал и статически собирать и ... . Новую либу тоже надо кросс компилятором собрать? Надо собрать кросс-компилятор, потом этим кросс-компилятором собрать glibc. Прописать в PATH путь к кросс-компилятору ВПЕРЕДИ остальных путей. Что-то на подобие: Код cd glibc-2.3.6 configure --target=arm-linux host=arm-linux build=i686-pc-linux-gnu Само собой, надо указать Ваш "arm-linux" Для сравнения у меня под big-endian для IXP425 - это armv5b-softfloat-linux Вообще-то лучше всего взять crosstools http://kegel.comТам очень просто настраивается три файла, собирает все, начиная от binutils и заканчивая gdb. У busybox есть конфигуратор, как в ядре. Запускается по make menuconfig. Цитата Еще, мне надо как то Z-modem к моему хозяйству прикрутить, чтоб начать ковырятся с драйвером NAND флешки (иначе тонны времени потрачу на обновлении корневухи). На ум приходит только minicom. Он использует отдельный пакет, не помню как называется. Посмотрите в составе пакета minicom, что он использует. Можно перекомпилить. Сам я этим не занимался, у меня флеш прошивается по Ethernet. Думаю, что uboot это тоже может. Цитата Какие могут возникнуть минусы, если пользоваться uClib? Думаю, стоит ли бузибокс с uClib собирать ... Скачал uClib, собирается если указать процессор i386, если указать ARM, вываливается с криком:Причем от настройки индианы это не зависит. uClibc никогда не пробовал, именно из-за возможных минусов. Памяти достаточно - 16M Flash 64M SDRAM. Цитата Цитата ./extra/scripts/conf-header.sh .config > include/bits/uClibc_config.h cc1: error: invalid option `little-endian' cc1: error: invalid option `little-endian' CC ldso/ldso/ldso.oS cc1: error: invalid option `little-endian' make: *** [ldso/ldso/ldso.oS] Ошибка 1
Ключи gcc -mlittle-endian и -mbig-endian определены для ARM. Похоже, что у Вас вызывается gcc хоста (x86), для которого эти ключи не определены. См. выше про PATH. Для uClibc есть какой-то конфигуратор? Тогда надо там указать target и host (см. выше).
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
|
Sep 5 2007, 07:18
|

Местный
  
Группа: Свой
Сообщений: 304
Регистрация: 5-07-04
Из: г. Москва
Пользователь №: 259

|
Цитата(3.14 @ Sep 4 2007, 17:02)  Итак ... взял образ рамдиска отсюда http://heavy-online.ru/arm-linux/ . На удивление, все заработало, теперь пошли общие вопросы. Скачал более свежий busybox, насколько я понимаю, если я его собираю (make CROSS_COMPILE=arm-linux-), то при сборе он использует либу glib, причем для x86? По крайней мере, все попытки запустить на моем девайсе самодельно собранный бузибокс закончились неудачей, пробовал и статически собирать и ... . Новую либу тоже надо кросс компилятором собрать? Еще, мне надо как то Z-modem к моему хозяйству прикрутить, чтоб начать ковырятся с драйвером NAND флешки (иначе тонны времени потрачу на обновлении корневухи). Какие могут возникнуть минусы, если пользоваться uClib? Думаю, стоит ли бузибокс с uClib собирать ... Скачал uClib, собирается если указать процессор i386, если указать ARM, вываливается с криком:Причем от настройки индианы это не зависит. У меня: #!/bin/sh export ARCH=arm export CROSS_COMPILE=arm-linux- make clean make ARCH=arm make install А для разных вариантов - разные тулчейны, собирается.
--------------------
Водку пьянствовать и безобразия нарушать!!!
|
|
|
|
|
Sep 5 2007, 08:15
|

Их либе дих ...
     
Группа: СуперМодераторы
Сообщений: 2 010
Регистрация: 6-09-04
Из: Russia, Izhevsk
Пользователь №: 609

|
Итак, с налету uClib не собирается (под ARM), ошибки всеми цветами радуги валятся, в зависимости от включеных опций ... Сфокусировался на glib. 1) распаковал glibc-2.3.6.tar.bz2 2) распаковал glibc-linuxthreads-2.3.6.tar.bz2 3) незная как правильно приложить патчи ioperm.c.diff и Makeconfig.patch, тупо нашел редактируемые строки в изменяемых файлах и руками попроавил 4) объявил переменную: Цитата BUILD_CC=gcc CC=${CROSS_COMPILE}gcc AR=${CROSS_COMPILE}ar \ RANLIB=${CROSS_COMPILE}ranlib AS=${CROSS_COMPILE}as LD=${CROSS_COMPILE}ld \ ../../glibc-2.3.6/configure --prefix=/usr --build=i386-unknown-linux \ --host=arm-linux --target=arm-linux --without-fp \ --without-__thread --enable-add-ons=linuxthreads \ --with-headers=${SYSROOT}/usr/include 2>&1 | tee configure.out В ответ на make 2>&1 tee make.out получаю: Цитата Makeconfig:84: arm/config.make: No such file or directory Makerules:782: Не задано имя файла для `include' /bin/sh: line 0: cd: arm: No such file or directory The GNU C library has not been configured. Run `configure' to configure it before building. Try `configure --help' for more details. make: *** [arm/config.status] Ошибка 1
--------------------
Усы, борода и кеды - вот мои документы :)
|
|
|
|
|
Sep 5 2007, 08:47
|

Местный
  
Группа: Свой
Сообщений: 304
Регистрация: 5-07-04
Из: г. Москва
Пользователь №: 259

|
Цитата(3.14 @ Sep 5 2007, 12:15)  Итак, с налету uClib не собирается (под ARM), ошибки всеми цветами радуги валятся, в зависимости от включеных опций ... Для uClibc тулчейн собирается при сборке buildroot, у меня Atmel - atmel_buildroot и использую.
--------------------
Водку пьянствовать и безобразия нарушать!!!
|
|
|
|
|
Sep 5 2007, 09:08
|
Местный
  
Группа: Участник
Сообщений: 351
Регистрация: 5-04-05
Пользователь №: 3 874

|
Цитата(3.14 @ Sep 5 2007, 12:56)  А разве для glib и uClib разные тулчейны нужны? Да, buildroot и нужен в первую очередь, для того, чтобы собрать toolchain именно для использования с uClibc.
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|