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

How does the ARM Linux kernel map console output to a hardware device on boot?

我目前正在努力确定如何通过 QEMU 获得模拟环境以在命令行上正确显示输出。我有一个使用 virt 参考板、cortex-a9CPU 和为 ARM 交叉编译的 4.1 Linux 内核完美显示的环境。但是,如果我将 4.1 内核换成 2.6 或 3.1,突然间我就再也看不到控制台输出了。

虽然解决这个问题是我的主要目标,但我觉得我对 如何 Linux 以及硬件在用户空间配置之前通过启动脚本进行初始集成缺乏批判性的理解什么都没有机会执行。我知道设备树,并且对它的工作原理有一个粗略的了解。但是我 运行 进入不同内核版本破坏控制台可用性的问题完全让我感到困惑。有人可以解释 Linux 最初如何将控制台输出映射到 ARM 架构上的硬件设备吗?

谢谢!

答案在很大程度上取决于内核版本、设置的配置选项、硬件,也可能取决于内核命令行参数。

对于现代内核,答案是它在设备树 blob 中查找它传递的设备描述,其中一些将是串行端口,并初始化这些。内核配置或命令行将指定其中哪些用于控制台。对于早期的内核,特别是如果你一直回到 2.6,设备树的使用不太普遍,对于某些硬件,引导加载程序只是说 "this is a versatile express board"(例如)并且内核有 compiled-in数据结构来告诉它它支持的每个板的设备在哪里。随着向设备树过渡的进行,开发板被一个接一个地转换,有时一次转换几个设备,因此任何特定内核版本的具体情况取决于您使用的是哪种开发板。

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