【问题标题】:How does the ARM Linux kernel map console output to a hardware device on boot?ARM Linux 内核如何在启动时将控制台输出映射到硬件设备?
【发布时间】:2019-07-22 12:51:14
【问题描述】:

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

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

谢谢!

【问题讨论】:

  • Debug linux kernelNXP forum 类似,主要是printascii 是一种用于打印字符串的轮询模式工具。 printk 本身不会立即打印,并且在输出任何内容之前发生崩溃,尤其是在内核中的中断基础结构等完成之前。

标签: linux-kernel console arm qemu device-tree


【解决方案1】:

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

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

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

【讨论】:

  • 我认为earlyprintk 需要DEBUG_LL,这是编译时间。它类似于上面的 cmets。我猜 QEMU 有代码来模拟板的串行端口(硬件库)。
  • 是的,QEMU 模拟串行端口。但是串行端口在物理地址空间中的位置因板而异。 DEBUG_LL 肯定会硬编码串行端口的地址,如果在错误的硬件上运行会崩溃。不过,我认为一些 earlyprintk 工作不需要 DEBUG_LL(或者这可能是 earlycon?)
  • This commitarch/arm/Kconfig.debug 似乎说 DEBUG_LL 是必需的。我看到了原始的“earlyprintk”补丁,它也被轮询到 PC 串行端口的 I/O。 Here 他们建议 earlycon,所以也许这是更好的选择。显然 Qemu 模拟了 pl101。
  • 是的,最初肯定是 earlyprintk 想要 LL_DEBUG,但我认为以后可能会有所改进。 QEMU 确实实现了 PL011,但它在“virt”板上的地址与 vexpress-a9 中的地址或通用 pb 板中的地址不匹配。地址错误 -> 内核崩溃。
  • 您应该首先找出预期与“virt”板一起工作的内核的第一个版本是什么。在此之前尝试任何事情都是行不通的......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-18
  • 1970-01-01
  • 2011-03-30
  • 2013-05-25
  • 2018-04-27
  • 2011-10-26
  • 1970-01-01
相关资源
最近更新 更多