Ядро Linux зависает на этапе «Запуск ядра ...»

Ядро Linux зависает на этапе «Запуск ядра ...»

Я успешно включил Secure Boot на встроенном устройстве. Проблема в том, что когда я загружаюсь в этом режиме, процесс, похоже, зависает сразу после строки:

Starting kernel ...

как только U-boot скопирует ядро ​​в память и выдаст bootmкоманду.

В отладчике я могу зафиксировать, что ПК застрял на yieldинструкции, за которой следует присваивание pc = pc-4— то есть, по сути, это цикл.

Я никогда раньше не поднимал Linux на таком низком уровне, поэтому не уверен, с чего начать поиски. Однако я заметил, что мне удалось успешно загрузить образ ядра, когда он не находился в безопасном режиме, поэтому это может быть более уместным вопросом для поставщика.

1) Где вообще можно найти диагностическую информацию U-boot относительно этапа передачи выполнения?

2) В какой момент выполнение полностью передается ядру? То есть, когда U-boot прекращает свое существование?

решение1

Может быть, вы можете сделать дамп памяти ранних отпечатков linux, используя следующую процедуру. Причина может быть в том, что ядро ​​загружается, но зависло до инициализации консоли. Также поместите отпечатки в точку входа ядра uboot и подтвердите передачу управления ядру.

Найдите System.mapфайл. Используйте следующую команду для определения log_bufадреса:

grep __log_buf System.map

Это выведет что-то вроде

c0352d88 B __log_buf

Выполните горячую перезагрузку платы (содержимое оперативной памяти не должно быть стерто).

В Uboot дамп памяти __log_buf(c0352d88). Он дамп консоли ядра. Таким образом, вы можете определить, где именно происходит зависание.

решение2

Я столкнулся с той же проблемой и нашел решение. Проблема в одном из , u-boot structure fieldкоторый хранит sizeиз , uncompressed linux kernel.не u-bootзаполняет это поле несжатым размером, который linux kernelиспользует позже для изменения своего размера stack, тем самым переводя систему в неопределенное состояние.

После того, как u-bootпечатает Starting kernel...сообщение, следующее сообщение должно быть Uncompressing Linux... done, booting the kernelпосле того, как u-boot передает a SMM Handlerядру, чтобы взять на себя выполнение, и, возможно, kernelищет это поле. Если вы работаете в x86системе на основе, распаковка будет в следующих каталогах файлов:

arch/x86/boot/uncompressed/head_32.S
arch/x86/boot/uncompressed/piggy.S

Решение — использовать последнюю версию u-boot здесь:https://github.com/andy-shev/u-boot

Однако если вы используете пользовательский u-boot, вам необходимо обратить внимание на это поле.

решение3

x86? Загрузитесь с earlycon=efifbили earlyprintk=vga. Я упоминаю оба варианта, поскольку во время коммита 69c1f396f25b805aeff08f06d2e992c315ee5b1e произошло изменение с earlyprintk на earlycon.

Связанный контент