LINUX.ORG.RU

Сообщения vglv

 

Kernel panic с exitcode = 0x00000004 после запуска /linuxrc

Возникает kernel panic с exitcode = 0x00000004 после запуска /linuxrc (или /init, или /bin/busybox) из рамдиска.

Имеется встраиваемая система с процессором AT91SAM9G45, для которой необходимо собрать ядро linux (в текущий момент версия 4.14.79) и образ файловой системы, которая должна находиться в оперативной памяти.

1. Ядро определенно находит cpio.gz-образ рамдиска, определенно правильно его распаковывает в память и определенно правильно запускает необходимый файл. «Правильно запускает» в данном случае означает, что функция запуска исполняемого файла возвращает ноль, после чего сразу возникает kernel panic. В том случае, если файл не найден, отсутствуют права доступа или он не является исполняемым, функция возвращает другое значение (ненулевое). Все это я выяснил с помощью дебага.

2. Образ файловой системы (rootfs) я компилировал разными способами, как с помощью buxybox, так и с помощью buildroot (который тоже включает в себя busybox). Разницы нет, kernel panic один и тот же. При сборке rootfs и ядра использую кросс-компилятор для ARM.

В чем может быть причина? Какие параметры сборки ядра я мог упустить? Или какие опции командной строки при передаче параметров ядру?

Вывод консоли при запуске ядра выложил в виде скриншота: http://i12.pixs.ru/storage/3/3/4/Snimokekra_4974857_31163334.png

Строчка !!! ramdisk_execute_command 2 /init 0 означает, что был запущен файл /init и функция запуска возвратила 0 (т. е. функция не вернула ошибку). Если бы я передал ядру заведомо несуществующий файл, н-р, /init12vn7dv21er, то строка выглядела бы так: !!! ramdisk_execute_command 2 /init -2, что означало бы, что файл не найден.

 , , , ,

vglv
()

U-Boot + FIT (Linux Kernel 4.19 + Device Tree Blob)

Здравствуйте.

Имеется устройство с процессором AT91SAM9G45 (ARM-архитектура). На нем установлен U-Boot версии 2010.09

Я пытаюсь скомпилировать и запустить на нем новейшее ядро Linux (по меньшей мере, версии не меньше 4.15).

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

Error: unrecognized/unsupported machine ID (r1 = 0x000008a4).

Available machine support:

ID (hex)        NAME
ffffffff        Generic DT based system
ffffffff        Atmel AT91SAM9

Please check your kernel config and/or bootloader.
К слову говоря, zImage пишется в RAM-память устройства по адресу 0x72000000, а затем распаковывается на адрес 0x70000000, точка входа в kernel - 0x70008000.

Попытался загрузить ядро на устройстве другим образом, а именно с помощью Flattened Image Tree.

В FIT-изображение входит zImage ядра линукса и dtb-данные. Соответственно, я также загружаю FIT по адресу 0x72000000, он распаковывается на 0x70000000, находит конфигурацию в FIT Image, находит dtb в этой конфигурации, затем пытается запустить ядро и ядро виснет.

Анализ и дебаг кода ядра показал мне, что ядро пытается прочесть значение ячейки по адресу 0xc0000000 и определить, соответствует ли оно магическому числу 0xd00dfeed, которое означает dtb-данные.

В справке (https://www.kernel.org/doc/Documentation/devicetree/booting-without-of.txt) я прочел, что прошивка устройства передает ядру значение регистра r2, и ядро проверяет значение ячейки по адресу, записанному в регистре r2, равняется ли оно магическому числу 0xd00dfeed или значению ATAG_CORE (соответствующее старому способу загрузки).

Интересуют следующие вопросы:

1. Можно ли каким-нибудь образом повлиять на значение регистра r2, которое прошивка будет передавать ядру линукса? Данные dtb записаны обычно по адресу 0x7227ce0d или около того, и по этому адресу действительно находится число 0xd00dfeed. Но ядро проверяет почему-то по адресу 0xc0000000, и каким образом мне изменить этот адрес, непонятно.

2. Можно ли каким-нибудь образом повлиять на значение регистра r1? Это необходимо для первого способа загрузки ядра.

3. Можно ли в U-Boot каким-нибудь образом посмотреть текущие значения регистров r1 и r2? В списке команд U-Boot я ничего не нашел.

 , , ,

vglv
()

Сборка ядра для embedded system

Здравствуйте. Необходимо собрать ядро для embedded-устройства из исходников, располагающихся по адресу: https://github.com/linux4sam/linux-at91 В устройстве установлен процессор AT91SAM9G45

В результате, после загрузки ядра на устройство с помощью u-boot и при попытке запуска ядра возникает сообщение:

Error: unrecognized/unsupported machine ID (r1 = 0x000008a4).

Available machine support:

ID (hex)        NAME
ffffffff        Generic DT based system
ffffffff        Atmel AT91SAM9

Please check your kernel config and/or bootloader.

Насколько я понял, u-boot сообщает, что требуется ядро с machine id = 0x000008a4, но в kernel определен machine id = 0xffffffff

Само ядро сконфигурировано с опцией CONFIG_SOC_AT91SAM9: Описание опции:

Select this if you are using one of those Atmel SoC:
AT91SAM9260, 
AT91SAM9261, 
AT91SAM9263, 
AT91SAM9G15, 
AT91SAM9G20, 
AT91SAM9G25, 
AT91SAM9G35, 
AT91SAM9G45, 
AT91SAM9G46, 
AT91SAM9M10, 
AT91SAM9M11, 
AT91SAM9N12, 
AT91SAM9RL, 
AT91SAM9X25, 
AT91SAM9X35, 
AT91SAM9XE

Т. е. сама опция уже включает в себя поддержку AT91SAM9G45, но при этом u-boot не хочет запускать ядро, скомпилированное с этой опцией. Если в u-boot задать setenv machid=0xffffffff, то ядро просто не запустится.

Каким образом можно решить эту проблему? Насколько я знаю, из ядра убрали поддержку конкретно процессора AT91SAM9G45. Можно ли как-нибудь (патчами, или м. б. существуют форки исходников) добавить ее снова?

 , , ,

vglv
()

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