Перейти к содержанию
    

Embedded linux bootstraping, ликбез

Странно, если образ рамдиска не GZIP-ить, тогда ядро его находит ...

Ммм... Никогда не пробовал не GZIP-ить.

Мож чего в uboot надо сказать по поводу GZIP? Ну или при создания образа для uboot?

 

Как вариант пользуйте непакованный и разберитесь с initramfs. Оно конечно ядро перелинковывать каждый раз при изменении файловой системы не ахти как удобно, но типа рекомендуемый путь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо, нашел причину ошибочной загрузки образа, см. предыдущее сообщение (рассинхронизировались сообщения на форуме).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

К стати не понял что за второй параметр у 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

Что указано после запятой?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сам пока не понял :)

Чего то еще не то ... ядро упорно говорит что не может init найти (он лежит в корне рамдиска - linuxrc) я уж и init=/linuxrc параметр для ядра добавил, а все равно не видит ...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Уперся ...

В качестве 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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Еще, если попробовать залить не GZIP-нутый образ рамдиска (с двумя либами), получаетяс:

RAMDISK: ext2 filesystem found at block 0

RAMDISK: Loading 4000KiB [1 disk] into ram disk... done.

VFS: Mounted root (ext2 filesystem).

Freeing init memory: 92K

EXT2-fs error (device ram0): ext2_check_page: bad entry in directory #14: directory entry across blocks - offset=0, inode=3844988932, rec_len=12556, name_len=159

Warning: unable to open an initial console.

Kernel panic - not syncing: No init found. Try passing init= option to kernel.

Заметьте, появилась строка "RAMDISK: Loading 4000KiB [1 disk] into ram disk... done."

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чтобы не заморачиватся с либами на этапе загрузки лучше пересоберите 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 скрипт, ситуацию с библиотеками это не маняет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В дополнение,

Поскольку 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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Итак ... взял образ рамдиска отсюда 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

Причем от настройки индианы это не зависит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Итак ... взял образ рамдиска отсюда 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 (см. выше).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Итак ... взял образ рамдиска отсюда 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

 

А для разных вариантов - разные тулчейны, собирается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Итак, с налету 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Итак, с налету uClib не собирается (под ARM), ошибки всеми цветами радуги валятся, в зависимости от включеных опций ...

Для uClibc тулчейн собирается при сборке buildroot, у меня Atmel - atmel_buildroot и использую.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А разве для glib и uClib разные тулчейны нужны?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А разве для glib и uClib разные тулчейны нужны?

Да, buildroot и нужен в первую очередь, для того, чтобы собрать toolchain именно для использования с uClibc.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...