【问题标题】:QEMU - No kernel output after "Booting kernel"QEMU - “引导内核”后没有内核输出
【发布时间】:2021-08-28 15:48:32
【问题描述】:

我尝试在 QEMU 自建机中启动预编译内核。

串行外设已配置,我可以成功启动本机预编译的 U-boot 映像。

在 U-Boot 中,所有串行 IO 都运行良好(内存寻址和 UART 地址也在机器设置中准备好)。使用选项 -nographic 我可以在 UBoot 命令提示符下读写。

我可以在 Uboot 中发出 bootm 命令将内核加载到 RAM 并启动它。我看到的最后一个字符串是“Uncompressing Linux...done.Booting kernel...”。

我有一个黑屏。

主要区别在于内核工作,因为使用远程 GDB 会话我看到它打印输出,如横幅和使用 printk 函数的更多信息。但是在 QEMU 屏幕上我没有。

问题:在内核的早期阶段,console=ttyS0,115200 的设置是在哪里进行的?我试图在内核源代码中搜索,但找不到调试问题的地方。

内核在设置之前如何知道将什么传递给串行?是否有 RAM 环形缓冲区?

有什么线索吗?

【问题讨论】:

  • 一条评论 - bootargs 的初始设置与 Uboot 相同 - console=ttyS0,115200。

标签: arm kernel qemu


【解决方案1】:

当您为 ARM 机器启动预编译的 U-Boot 映像时,它已经包含:一个内核、一个 initramfs/initrd 文件和一个已编译的设备树二进制 (.dtb) 文件,该文件滚动到 U-Boot 的映像格式可以识别、解压、加载到内存并用于启动引导过程。在这种情况下,console=ttyS0,115200 信息包含在来自原始设备树规范 (DTS) 文件的 .dtb 文件中,该文件将包含如下所示的部分:

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

U-Boot 最终将二进制 .dtb 文件加载到内存中,并将指向它的指针传递给内核,然后内核可以推断控制台参数并显示控制台输出。

当您更喜欢将内核加载到内存并使用 U-Boot bootm 命令时,您必须自己确保 initramfs/initrd 和 .dtb 文件已加载到内存(可能通过 tftp)并且地址是作为参数传递给 bootm。一旦完成,内核就有机会从 .dtb 中获取控制台参数,就像它在 U-Boot 映像案例中所做的那样,然后您应该会看到您的控制台输出。执行此操作的内核代码在 4.19 内核中位于 drivers/of/base.c of_console_check() 中。

【讨论】:

  • 就是这样 - 我没有在我制造的 Qemu 机器中处理 DTS。
猜你喜欢
  • 2019-08-27
  • 2020-11-27
  • 1970-01-01
  • 2018-01-27
  • 2017-10-30
  • 1970-01-01
  • 1970-01-01
  • 2011-06-05
  • 2023-03-30
相关资源
最近更新 更多