Jump to content

    

uClinux+jffs2 без u-boot

Всем доброго времени суток! У меня возникла проблема с запуском uClinux. Суть такова:

Есть аппаратная конфигурация - заведомо рабочая.

- есть собранный образ uClinux cо следующими настройками:

 

#### To enable MTD

 

[*] Memory Technology Device (MTD) support --->

--- Memory Technology Device (MTD) support

[ ] Debugging (NEW)

[ ] MTD concatenating support (NEW)

[*] MTD partitioning support

[ ] RedBoot partition table parsing (NEW)

[ ] Command line partition table parsing (NEW)

[ ] TI AR7 partitioning support (NEW)

 

*** User Modules And Translation Layers ***

[*] Direct char device access to MTD devices

-*- Common interface to block layer for MTD 'translation layers

[ ] TI AR7 partitioning support (NEW)

*** User Modules And Translation Layers ***

[*] Direct char device access to MTD devices

-*- Common interface to block layer for MTD 'translation layers

[*] Caching block device access to MTD devices

 

+включена physical device map (это название на память)

 

#### To enable CFI flash

 

RAM/ROM/Flash chip drivers --->

[*] Detect flash chips by Common Flash Interface (CFI) probe

[ ] Detect non-CFI AMD/JEDEC-compatible flash chips (NEW)

[ ] Flash chip driver advanced configuration options (NEW)

[ ] Support for Intel/Sharp flash chips # for neek

[*] Support for AMD/Fujitsu flash chips # others

[ ] Support for ST (Advanced Architecture) flash chips (NEW)

[ ] Support for RAM chips in bus mapping (NEW)

[ ] Support for ROM chips in bus mapping (NEW)

[ ] Support for absent chips in bus mapping (NEW)

 

#### To enable flash filesystem support

 

File systems -->

Miscellaneous filesystems --->

[*] Journalling Flash File System v2 (JFFS2) support

 

Так же включены нужные mtd утилиты

 

В основных настройках ядра параметры offset addres и linking addres = 0х0

 

defaul command string = root=/dev/mtdblock0 rw rootfstype=jffs2

 

Всё настроено на работу с двумя partitions

0x600000-0xA00000 - rootfs

0x000000-0x600000 - kernel

При запуске ядра mtd-parts их выводит, под номером 0 - считает rootfs 1 - kernel

 

- есть образ rootfs.jffs2

- размеры партиций взяты с запасом по размеру

 

Зашиваю образ ядра

//после компиляции у меня на выходе elf формат образа, поэтому сначала преобразую во flash

$SOPC_KIT_NIOS2/bin/elf2flash --base=0x0 --end=0xffffff --reset=0x0 --input=soft --output=flash.flash --boot=$SOPC_KIT_NIOS2/components/altera_nios2/boot_loader_cfi.srec

//так зашиваю

$SOPC_KIT_NIOS2/bin/nios2-flash-programmer "flash.flash" --base=0x0 --mmu --sidp=0x21208B8 --id=0x3BD3BE2B --accept-bad-sysid --device=1 --instance=0 '--cable=USB-Blaster [uSB-0]' --program --verbose

 

Так загружаю образ ФС

// из bin во flash

$> *bin2flash --input=rootfs.jffs2 –output=rootfs.flash --location=0x0060 0000 –verbose

//зашиваю

> *nios2-flash-programmer ”jffs2.flash” --base=0x0 –mmu --program --verbose

 

Зашивается в логе зашивается всё по правильным адресам т.е. ядро в партицию начиная с 0х0, фс в партицию начиная с 0х600000

При загрузке выдает ошибку:

freeing unused kernel memory 72k freed <0xC618D000 - c619E000>

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

 

Помогите примонтировать файловую систему)

 

Лог загрузки:

post-71762-1336661773_thumb.jpg

Edited by Boom-Zoom

Share this post


Link to post
Share on other sites
В основных настройках ядра параметры offset addres и linking addres = 0х0

defaul command string = root=/dev/mtdblock0 rw rootfstype=jffs2

...

Лог загрузки:

 

Сравните лог и то что задано в командной строке - они не совпадают. У вас ядро получает параметр initrd=0x00600000, 0x00400000 от загрузчика - либо там поменяйте на то что нужно либо в ядре включите опцию

CONFIG_CMDLINE_FORCE=y

иначе ядро пытается смонтировать рамдиск которого вы судя по всему не предполагаете записывать по указанному адресу.

Edited by sasamy

Share this post


Link to post
Share on other sites
Сравните лог и то что задано в командной строке - они не совпадают. У вас ядро получает параметр initrd=0x00600000, 0x00400000 от загрузчика - либо там поменяйте на то что нужно либо в ядре включите опцию

CONFIG_CMDLINE_FORCE=y

иначе ядро пытается смонтировать рамдиск которого вы судя по всему не предполагаете записывать по указанному адресу.

Да, действительно перепутал параметр в команде, поправил, но ничего не изменилось.

CONFIG_CMDLINE_FORCE=y - через make menuconfig такого найти не смог, возможно опция может по другому называться?

 

Читая про процесс загрузки linux узнал что ядро стартуя монтирует временную урезанную файловую систему в ОЗУ только для чтения, потом запускает самые необходимые драйверы, а далее монтирует КФС.

Есть ряд вопросов:

- init находится в ФС которая монтируется в ОЗУ или в КФС?

- как проверить монтируется ли ФС в ОЗУ?

- можно ли обойтись без ФС монтируемой в ОЗУ?

- и как проверить что init скомпилился и попал туда куда нужно?

 

P.S. Включил поддрежку Init в busybox

Edited by Boom-Zoom

Share this post


Link to post
Share on other sites

Обычно "большие" линуксы грузятся через промежуточную файловую систему, которая может находится в ОЗУ. Во встраиваемых линуксах это не так популярно.

Init это самый первый процесс, который должен быть запущен ядром, если его нет, значит ничего работать не будет. Можно попробовать передать ядру параметр init=/bin/sh и тогда, при загрузке вы должны попасть в shell. Еще, я бы посоветовать что же вы такого записали в файловой системе, может там действительно нет init.

Share this post


Link to post
Share on other sites
Можно попробовать передать ядру параметр init=/bin/sh и тогда, при загрузке вы должны попасть в shell. Еще, я бы посоветовать что же вы такого записали в файловой системе, может там действительно нет init.

Надо будет попробовать задать nit=/bin/sh. Проверял логи, init компилится.

 

Сейчас ситуация такова: я сбросил настройки в дефолтные, настроил по мануалу опции ядра + включил опции отладки фс и ядра, подсунул ему командную строку

root=/dev/mtdblock1 rw rootfstype=jffs2 mtdparts=physmap-flash.0:6M(kernel)ro,-(rootfs) init=/bin/BusyBox/init (дефаултная настройка я пологаю /sbin/init)

в итоге партиции создаются те которые мне нужны сответствующего размера (в логе только косяк перед уходом последний раз компилил забыл скобки поставить в командной строке,поэтому второй раздел partition_001 называется).

Пишет что файловую систему он монтирует, что радует конечно. Но инит найти не может.

И я не могу понять куда лезет jffs2_scan_ereaseblock, зачем ей адреса в середине партиции ядра и в конце флешки? Мозгом чую что в настройках ядра какая то несогласованность, но вот как её исправить...

 

Вот выдержки из лога:

physmap-flash physmap-flash.0 could not reserve memory region

physmap-flash probe of physmap-flash.0 failed whith error -12

old jffs2 bitmask found at

you cannot use older jffs2 filesystem whith newer kernel

not init found

 

Подскажите что делать если кто то сталкивался, а пока курю форумы и мануалы.

post-71762-1337020252_thumb.jpg

post-71762-1337020358_thumb.jpg

Edited by Boom-Zoom

Share this post


Link to post
Share on other sites

Как вы пишите корневую файловую систему во flash?

Share this post


Link to post
Share on other sites
Как вы пишите корневую файловую систему во flash?

да

 

Вобщем все получилось! Ура!! :rolleyes:

Покурил буржуйские форумы начал копать в сторону настроек mtd утилит и параметров компиляции jffs2, но опасения не подтвердились. После долгих изысканий отключил в настройках ядра параметр^

 

-enable UBI (из буржуйского описания смутно представляю что он делает, попозже разберусь для себя)

после чего пропали ошибки:

old jffs2 bitmask found at

you cannot use older jffs2 filesystem whith newer kernel, а так же обращения по неправильным адресам

 

Немного поправил размеры партиций, но не думаю что в этом дело...

 

Далее init=/bin/sh спасло ситуацию!))) огромное спасибо за совет! Init на кфс присутствует, но почему то указав его ядру запуск не происходит :wacko:

 

Но вот две ошибки остались, хотя работает и с ними:

physmap-flash physmap-flash.0 could not reserve memory region

physmap-flash probe of physmap-flash.0 failed whith error -12

 

Файлы создаются, данные в них записываюся и сохраняются, после отключения и включения питания всё на месте.

Есть только одна мелочь которая беспокоит:

когда происходит запись на флеш сыпятся сообщения как на третьем логе.

post-71762-1337091595_thumb.jpg

post-71762-1337091606_thumb.jpg

post-71762-1337091611_thumb.jpg

Share this post


Link to post
Share on other sites

На вопрос я забавно ответил) Мне показалоль написано "Так..."

При помощи JTAG, работаю с cyclone II, использую несколько утилит командной строки идущих в комплекте с Quartus'ом 11, пример командной строки в первом посте есть.

Edited by Boom-Zoom

Share this post


Link to post
Share on other sites

Странно что /bin/sh отработал, а /bin/init - нет.

 

UBI это может быть UBIFS, файловая система для nand памяти большого объема.

 

>>Файлы создаются, данные в них записываюся и сохраняются, после отключения и включения питания всё на месте.

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

 

>>сыпятся сообщения как на третьем логе.

может вы дебаг в ядре лишний включили?

Share this post


Link to post
Share on other sites

Решил всётаки запустить инит. В процессе разбирательств выяснил что инит в КФС присутствует в elf формате, когда патаешься его запустить пишет can't execute, если компилишь инит не стандартный, а из busybox инит получается бинарный при его запуске выводится сообщении смысл коготорого в том что инит первый запускаемый процесс и система виснет. Загрузив zImage от производителя и попробовав запустить инит (elf формат), он нормально исполняется - пытается монтировать vfs proc и sysfs выводит лого и возвращается в консоль. Перепробовал много вариантов конфигурации, начал разбираться с логикой запуска инит... В следствии чего возникли вопросы:

- как будет вести себя инит если inittab пустой или отсутствует, или он его не находит?

- по какой причине может не запустится elf файл (предпологаем что скомпилирован он с нужными параметрами), может ли он начать исполнение, но не найдя каких то зависимостей выдать такое сообщение?

- и почему инит исполняемый файл, а не скрипт?

Edited by Boom-Zoom

Share this post


Link to post
Share on other sites

1. Если нет /etc/inittab то ничего страшного случиться не должно

2. Причин не запуска elf файла может быть много. Вы уверенны что вы собрали его под правильную архитектуру? Запустите запустите на вашем ПК команду file <путь к Init> и посмотрите что вам выдаст. Еще можете запустить strace и посмотреть на каком именно месте он перестает выполняться. Если не помогло, то используйте gdb, но обычно strace должно хватить.

3. А почему init должен быть скриптом? Init может запускать init-скрипты, но сам, быть скриптом не обязан.

 

"из busybox инит получается бинарный" - должна получиться символьная ссылка на busybox.

Share this post


Link to post
Share on other sites
1. Причин не запуска elf файла может быть много. Вы уверенны что вы собрали его под правильную архитектуру? Запустите запустите на вашем ПК команду file <путь к Init> и посмотрите что вам выдаст. Еще можете запустить strace и посмотреть на каком именно месте он перестает выполняться. Если не помогло, то используйте gdb, но обычно strace должно хватить.

 

2. "из busybox инит получается бинарный" - должна получиться символьная ссылка на busybox.

1. elf точно не для ПК, strace попробую.

2 точно-ссылка

 

Сижу копаюсь в кишках... нашёл интересный сайт про uclinux где подробно расписан процесс его загрузки...

Share this post


Link to post
Share on other sites

Вопрос надо закрыть... Решил проблему, elf был слинкован динамически, а нужные библиотеки не компилировались, слинковал статически и всё заработало.

Share this post


Link to post
Share on other sites
... нашёл интересный сайт про uclinux где подробно расписан процесс его загрузки...

 

Так поделитесь, мало ли кому пригодится

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this