Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arm QEMU-在“之后没有内核输出”;“引导内核”;_Arm_Kernel_Qemu - Fatal编程技术网

Arm QEMU-在“之后没有内核输出”;“引导内核”;

Arm QEMU-在“之后没有内核输出”;“引导内核”;,arm,kernel,qemu,Arm,Kernel,Qemu,我尝试在QEMU自己创建的机器中引导预编译内核 已配置串行外围设备,并且我可以成功引导此计算机的预编译U-boot映像 在U-Boot中,所有串行IO都工作得很好(内存地址和UART地址也在机器设置中准备好)。使用选项-nographic,我可以在UBoot命令提示符下读写 我可以在Uboot中发出bootm命令,将内核加载到RAM并引导它。我看到的最后一个字符串是“解压缩Linux…完成。引导内核…” 在那里我有一个黑屏 主要的区别是内核可以工作,因为使用远程GDB会话,我看到它使用print

我尝试在QEMU自己创建的机器中引导预编译内核

已配置串行外围设备,并且我可以成功引导此计算机的预编译U-boot映像

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

我可以在Uboot中发出bootm命令,将内核加载到RAM并引导它。我看到的最后一个字符串是“解压缩Linux…完成。引导内核…”

在那里我有一个黑屏

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

问题:在内核的早期阶段,console=TTYS0115200的设置在哪里完成?我试图搜索内核源代码,但找不到调试问题的地方

内核如何在设置串口之前知道要传递给串口的内容?有RAM环缓冲器吗


有什么线索吗?

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

chosen {
    bootargs = "console=ttyS0,115200n8 maxcpus=2, envaddr = <0xfa0f0000>";
};
已选择{
bootargs=“console=ttys0115200n8 maxcpus=2,envaddr=”;
};
最终,U-Boot将二进制.dtb文件加载到内存中,并将指向该文件的指针传递给内核,内核随后可以推断控制台参数并显示控制台输出

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


如果这个答案对你有帮助,请考虑把它标记为最终答案-谢谢。祝你好运,让你的QEMU启动和控制台输出工作

一条注释-引导参数的初始设置与Uboot-console=TTYS0115200相同。就是这样-我没有在我制作的Qemu机器中处理DTS。