Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/56.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
Linux kernel ARM Linux内核如何在引导时将控制台输出映射到硬件设备?_Linux Kernel_Console_Arm_Qemu_Device Tree - Fatal编程技术网

Linux kernel ARM Linux内核如何在引导时将控制台输出映射到硬件设备?

Linux kernel ARM Linux内核如何在引导时将控制台输出映射到硬件设备?,linux-kernel,console,arm,qemu,device-tree,Linux Kernel,Console,Arm,Qemu,Device Tree,我目前正在努力确定如何通过QEMU获得仿真环境,以便在命令行上正确显示输出。我有一个使用virt参考板、一个cortex-a9CPU和为ARM交叉编译的4.1linux内核的环境,它显示得非常好。然而,如果我将4.1内核换成2.6或3.1内核,突然我就看不到控制台输出了 虽然解决这个问题是我的主要目标,但我觉得我对Linux和硬件最初是如何集成的缺乏批判性的理解,在用户空间配置通过引导脚本和其他方式无法执行之前。我知道设备树,对它的工作原理有一个松散的理解。但我遇到的另一个内核版本破坏了控制台可

我目前正在努力确定如何通过QEMU获得仿真环境,以便在命令行上正确显示输出。我有一个使用
virt
参考板、一个
cortex-a9
CPU和为ARM交叉编译的4.1linux内核的环境,它显示得非常好。然而,如果我将4.1内核换成2.6或3.1内核,突然我就看不到控制台输出了

虽然解决这个问题是我的主要目标,但我觉得我对Linux和硬件最初是如何集成的缺乏批判性的理解,在用户空间配置通过引导脚本和其他方式无法执行之前。我知道设备树,对它的工作原理有一个松散的理解。但我遇到的另一个内核版本破坏了控制台可用性的问题让我完全困惑。有人能解释一下Linux最初是如何将控制台输出映射到ARM架构上的硬件设备的吗


谢谢大家!

答案在很大程度上取决于哪个内核版本、设置了什么配置选项、什么硬件,还可能取决于内核命令行参数

对于现代内核,答案是它在设备树blob中查找设备的描述,其中一些是串行端口,并初始化这些设备。内核配置或命令行将指定控制台使用的配置或命令。对于早期的内核,尤其是回到2.6版本,设备树的使用就不那么普遍了,对于某些硬件,引导加载程序只是简单地说“这是一个多功能的express板”(例如),内核已经编译成数据结构,告诉它支持的每个板的设备在哪里。随着向设备树的转换的进行,电路板被一个接一个地转换,有时一次转换几个设备,因此任何特定内核版本的具体情况取决于您使用的电路板


我怀疑您遇到的另一件事是,如果内核在启动早期(即在找到串行端口之前)崩溃,那么它将永远不会输出任何东西。因此,如果内核还太早,根本无法正确支持“virt”板,或者您的内核配置缺少一些重要内容,那么很有可能在早期引导时崩溃,而无法向您打印有用的消息。(有时“earlycon”或“earlyprintk”内核参数可以在这里提供帮助,但并不总是如此。)

和类似的主要
printscii
是一种轮询模式工具,用于打印字符串
printk
本身不会立即打印,在输出任何内容之前,尤其是在内核中的中断基础结构等完成之前,会发生崩溃。我认为
earlyprintk
需要调试,这是编译时。这与上面的评论类似。我猜QEMU有代码来模拟主板的串行端口(硬件库)。是的,QEMU模拟串行端口。但串行端口在物理地址空间中的位置因板而异。调试肯定会对串行端口的地址进行硬编码,如果在错误的硬件上运行,则会崩溃。我认为一些earlyprintk工作不需要调试(或者可能是earlycon?),而且似乎说需要调试。我看到了最初的“earlyprintk”补丁,它也被轮询到PC串行端口的I/O。他们正在建议earlycon,所以这可能是更好的选择。显然,Qemu模拟了pl101。是的,很明显,最初Printk希望进行LL_调试,但我认为以后可能会有所改进。QEMU确实实现了PL011,但其在“virt”板中的地址与vexpress-a9中的地址或versatilepb板中的地址不匹配。错误的地址->内核崩溃。您应该首先了解希望与“virt”板一起工作的内核的第一个版本是什么。尝试任何比这更早的事情都是行不通的。。。