Паника ядра с кодом выхода = 0x00000004 после / init - PullRequest
0 голосов
/ 22 января 2019

У меня есть встроенная система ARM с процессором AT91SAM9G45. Я пытаюсь собрать ядро ​​Linux с initramfs для этой системы. Версия ядра - 4.14.79.

После загрузки образа ядра и initramfs на устройство у меня появляется следующее:

  1. Ядро определенно находит образ initramfs, распаковывает его и устанавливает в память.

  2. Определение ядра находит все файлы в образе initramfs, я вижу это в отладочных сообщениях, которые я добавил в исходный код ядра Linux.

  3. После распаковки образа initramfs ядро ​​пытается запустить процесс / init. Процессы / init запускаются и мгновенно возвращают 0 (0 означает отсутствие ошибок), а затем мгновенно выдают сообщение о панике ядра:

Освобождение неиспользуемой памяти ядра: 384 КБ

Эта архитектура не имеет защиты памяти ядра.

run_init_process ДО / init

run_init_process ПОСЛЕ / init, результат = 0

Паника ядра - не синхронизируется: попытка убить init! ExitCode = 0x00000004

"run_init_process_BEFORE / init" и "run_init_process / init, result = 0" являются сообщениями отладки, которые я добавил в исходный код Linux.

Образ initramfs создается с использованием busybox.

Нет разницы, какой исходный скрипт или исполняемый файл я пытаюсь запустить. Результаты одинаковы. Если скрипт / init пытается отобразить какое-то сообщение и в течение нескольких секунд находится в спящем режиме, ядро ​​не показывает сообщение и не ждет, а мгновенно выдает сообщение о панике.

Итак, я статически скомпилировал эту простую программу и попытался ее запустить:

#include <stdio.h>

int main(int argc, char *argv)
{
  printf("Hello world!\n");
  sleep(999999999);
}

Тот же результат, без "Hello world!" и без сна:

Освобождение неиспользуемой памяти ядра: 384 КБ

Эта архитектура не имеет защиты памяти ядра.

run_init_process ДО / привет

run_init_process ПОСЛЕ / привет, результат = 0

Ядро паники - не синхронизируется: попытка убить init! ExitCode = 0x00000004

Если я скомпилирую эту программу с помощью компилятора gcc x86_64, результат будет -8:

Тот же результат, без "Hello world!" и спать:

Освобождение неиспользуемой памяти ядра: 384 КБ

Эта архитектура не имеет защиты памяти ядра.

run_init_process ДО / привет

run_init_process ПОСЛЕ / привет, результат = -8

Ядро паники - не синхронизируется: попытка убить init! ExitCode = 0x00000004

Таким образом, это означает, что ядро ​​Linux определяет, является ли файл исполняемым на текущей платформе.

Если я скомпилирую программу hello.c без статического связывания, результат будет -2 (и сообщение о панике ядра после этого). Если я помещаю .so файлы в образ initramfs в папке / lib, результат равен 0, и после этого появляется сообщение о панике ядра. Если я добавлю .so файлы, которые скомпилированы с помощью компилятора x86_64, результатом будет -13, и сообщение о панике ядра после этого.

Так в чем причина этого сообщения? Я не могу это выяснить.

...