LINUX.ORG.RU

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

 , , , ,


1

1

Возникает 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 (всего исправлений: 1)

Строчка !!! ramdisk_execute_command 2 /init 0 означает, что был запущен файл /init и функция запуска возвратила 0

Ну, ваш «/init» запустился, отработал, и завершился. А ядро не ожидало, что он завершится.

DiMoN ★★★
()
Ответ на: комментарий от DiMoN

А как сделать, чтобы «/init» не завершался? Даже если я пишу там скрипт типа

#!/bin/sh
echo "Hello!"
или
#!/bin/sh
sleep 10
то ядро никаких надписей не выводит и 10 секунд не ждет.

vglv
() автор топика

Скомпилировал статически с помощью кросс-компилятора для ARM программу hello.c:

#include <stdio.h>

int main(int argc, char *argv)
{
  printf("Hello world!\n");
  sleep(999999999);
}
и попытался запустить вместо /init. Результат тот же самый:
Freeing unused kernel memory: 384K
This architecture does not have kernel memory protection.
run_init_process BEFORE /hello
run_init_process AFTER /hello, result = 0
Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000004

---[ end Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000004

RomBOOT
Может быть, версия кросс-компилятора для ARM (2014-05) устарела и не соответствует ядру 4.14.79? Хотя само ядро собрано тем же кросс-компилятором и до момента паники работает.

vglv
() автор топика
10 июля 2019 г.
Ответ на: комментарий от vglv

Возможно в ядре отсутствовала поддержка Floating Point

Понимаю, что ответ, скорее всего, будет не актуальный. По может оказаться полезным, тем кто будет искать подобное в будущем. Столкнулся с похожей ситуацией (busybox в initramfs). Обыскав весь гугл нашел упоминание, что это exitcode=0x00000004 может следствие вызова сигнала SIGILL. После включения

  • Floating Point support ошибка исчезла.
    Kernel type  ---> [*] Floating Point support
    Without this support any userland program attempting to use floating point instructions will receive a SIGILL.
    
OlegSL
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.