Использование статически скомпилированного файла C в качестве rootfs

Я хочу загрузить свою плату imx53-qsb, используя не обычную rootfs, а статически скомпилированный файл hello_world.c, другими словами hello_world_static.out . Для этого я написал файл hello_world.c, скомпилировал его статически и поместил в раздел mmcblk0p1 ext4 на SD-карте. Я поместил свой uImage и u-boot.imx в mmcblk0. После загрузки моей системы я получил панику ядра:

Паника ядра - не синхронизация: инициализация не найдена. Попробуйте передать параметр init= ядру. См. руководство по Linux Documentation/init.txt.

Любое решение? Спасибо


person EngineerN    schedule 26.05.2015    source источник
comment
Пожалуйста, предоставьте код вашего hello_world.c файла. Также сообщите нам, какой именно набор инструментов вы используете для его создания.   -  person Sam Protsenko    schedule 26.05.2015
comment
@SamProtsenko вот мой код hello_world.c ` #include ‹stdio.h› int main(void) { printf(hello, world\n); вернуть 0; } ` Я скомпилировал его с помощью gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux   -  person EngineerN    schedule 27.05.2015


Ответы (1)


Вы должны указать параметр init= в командной строке ядра (из u-boot). Например, если имя вашего двоичного файла init и вы поместили его в каталог /sbin (в разделе rootfs), вы должны добавить init=/sbin/init в командную строку ядра в u-boot (в переменной bootargs).

Например, вы можете сделать следующее (в оболочке u-boot перед запуском команды bootm или booti):

setenv bootargs root=/dev/mmcblk0p1 rw rootfstype=ext4 init=/sbin/init

Кроме того, проверьте, действительно ли у вас есть rootfs на mmcblk0p1. Обычно mmcblk0p1 — это раздел FAT32, который содержит файлы загрузчика и образы для копирования в оперативную память. Rootfs обычно находится на mmcblk0p2 (и отформатирован как ext4).

Подробнее см.:

[1] Documentation/kernel-parameters.txt (найдите параметр init= )

[2] файл README u-boot (ищите строку Boot Linux:)

[3] Документация/init.txt

person Sam Protsenko    schedule 26.05.2015
comment
@samprotsenkok Спасибо за эти ссылки! Но я хочу, чтобы в моем разделе не было rootfs, а был только статический компилируемый файл hello_world. Я попытался изменить загрузочные параметры u-boot следующим образом: optargs=quiet init=/hello_world_static.out и mmcargs=setenv bootargs console=${console} root=${mmcroot} rootfstype=$ {mmcrootfstype} ${optargs}, но все равно не работает. - person EngineerN; 27.05.2015
comment
@samprotsenkok вот мои переменные среды u-boot: bootargs_base=setenv bootargs console=ttymxc0,115200 AND bootargs_mmc=root=/dev/mmcblk0p1 rw rootfstype=ext4 init=/hello_s.out И bootcmd_mmc=run bootargs_base bootargs_mmc;mmc dev 0;mmc read ${loadaddr} 0x800 0x4000;bootm И< /b> bootcmd=run bootcmd_mmc Когда я загружаюсь с этими параметрами, я получаю другую ошибку: Пожалуйста, добавьте правильную опцию загрузки root=; вот доступные разделы: - person EngineerN; 27.05.2015
comment
@EngineerN Да, на самом деле я ничего не говорил о настоящих rootfs, но вам все равно нужен какой-то раздел с именем rootfs, отформатированный как ext4. Любой ваш rootfs - это всего лишь один ваш файл. - person Sam Protsenko; 27.05.2015
comment
@EngineerN Попробуйте это: setenv bootargs console=ttymxc0,115200 root=/dev/mmcblk0p1 rw rootfstype=ext4 init=/hello_s.out, а затем запустите команду загрузки. Кроме того, вы уверены, что ваш первый раздел находится там, где находится ваш двоичный файл? - person Sam Protsenko; 27.05.2015
comment
Ах хорошо. Я только что попробовал то, что вы сказали, но я все еще получаю ту же ошибку. Да, я уверен, я отформатировал раздел как ext4. Когда ставлю нормальный rootfs работает хорошо. Спасибо за помощь, чувак ;) - person EngineerN; 27.05.2015
comment
Что значит такая же ошибка? Какой именно, invalid root= или invalid init=? - person Sam Protsenko; 27.05.2015
comment
Эта ошибка: добавьте правильную опцию загрузки root=; вот доступные разделы: Есть идеи? - person EngineerN; 28.05.2015
comment
Хм, может стоит добавить параметр rootwait в cmdline (т.е. в переменную bootargs в u-boot). Также убедитесь, что у вас есть правильный параметр root= в вашей командной строке ядра (где-то в верхней части вывода журнала ядра, ищите текст Kernel command line:). Вот моя командная строка для запуска моей платы: root=/dev/mmcblk0p2 rw console=ttyO2,115200 init=/init rootfstype=ext4 rootwait. - person Sam Protsenko; 28.05.2015
comment
Ставлю этот setenv bootargs_mmc root=/dev/mmcblk0p1 rw rootfstype=ext4 rootwait init=/hello_s.out но в логе в командной строке ядра есть проблема : Неизвестная команда 'root =/dev/mmcblk0p1' - попробуйте "помощь" Можем ли мы перейти в чат, чтобы поговорить об этом? или ты предпочитаешь остаться здесь? - person EngineerN; 28.05.2015
comment
Давайте продолжим обсуждение в чате. - person Sam Protsenko; 28.05.2015