
Я успешно включил 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.