QEMU - не выводится ядро ​​после «загрузки ядра» - PullRequest
0 голосов
/ 07 ноября 2019

Я пытаюсь загрузить предварительно скомпилированное ядро ​​на машине, созданной QEMU.

Настроена последовательная периферия, и я успешно могу загрузить предварительно скомпилированный образ U-boot для этой машины.

В U-Bootвсе последовательные операции ввода-вывода работают отлично (адресация памяти и адрес UART также подготавливаются в настройках машины). Используя опцию -nographic, я могу читать и писать в командной строке UBoot.

Я могу выполнить команду bootm в Uboot, чтобы загрузить ядро ​​в RAM и загрузить его. Последняя строка, которую я вижу: «Распаковка Linux ... готово. Загрузка ядра ...».

И вот у меня черный экран.

Основное отличие состоит в том, что ядро ​​работает, потому что, используя удаленный сеанс GDB, я вижу, что оно печатает выходные данные, такие как Banner, и дополнительную информацию, используя функции printk. Но на экране QEMU у меня его нет.

Вопрос: где в ядре на ранней стадии выполняется установка console = ttyS0,115200? Я пытался искать в исходных кодах ядра и не могу найти место для отладки проблемы.

Как ядро ​​знает, что передать на последовательный порт перед его установкой? Есть ли буфер RAM Ring?

Любые подсказки?

1 Ответ

0 голосов
/ 13 ноября 2019

Когда вы загружаете свой предварительно скомпилированный образ U-Boot для компьютера ARM, он уже включает в себя: ядро, файл initramfs / initrd и двоичный файл скомпилированного дерева устройств (.dtb), свернутый в формат образа, который U-Bootможет распознать, распаковать, загрузить в память и использовать для запуска процесса загрузки. В этом случае информация console = ttyS0,115200 включается в файл .dtb из исходного файла спецификации дерева устройств (DTS), который будет содержать раздел, который выглядит следующим образом:

chosen {
    bootargs = "console=ttyS0,115200n8 maxcpus=2, envaddr = <0xfa0f0000>";
};

Ultimate U-Bootзагружает двоичный файл .dtb в память и передает на него указатель на ядро, которое затем может определить параметры консоли и отобразить вывод консоли.

Когда вместо этого вы предпочитаете загружать ядро ​​в память и использовать U-Boot bootm, вы сами должны убедиться, что файлы initramfs / initrd и .dtb были загружены в память (возможно, через tftp) и что адреса передаются в качестве аргументов в bootm. Как только это будет сделано, у ядра будет возможность извлечь параметры консоли из .dtb, как это было в случае образа U-Boot, и вы должны увидеть вывод своей консоли. Код ядра, предназначенный для этого, находился в ядре 4.19 в файле drivers / of / base.c of_console_check ().

Если этот ответ поможет вам, пожалуйста, пометьте его как окончательный ответ - спасибо. Удачи в загрузке QEMU и работе консоли!

...