У меня есть встроенная система ARM с процессором AT91SAM9G45. Я пытаюсь собрать ядро Linux с initramfs для этой системы. Версия ядра - 4.14.79.
После загрузки образа ядра и initramfs на устройство у меня появляется следующее:
Ядро определенно находит образ initramfs, распаковывает его и устанавливает в память.
Определение ядра находит все файлы в образе initramfs, я вижу это в отладочных сообщениях, которые я добавил в исходный код ядра Linux.
После распаковки образа 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, и сообщение о панике ядра после этого.
Так в чем причина этого сообщения? Я не могу это выяснить.