在嵌入式设备中启动内核时,您需要向 Linux 内核提供设备树,而在常规 x86 PC 上启动内核则不需要设备树 - 为什么?
据我了解,在 x86 pc 上,内核“探测”硬件(如果我错了,请纠正我),那么为什么内核不能探测嵌入式系统中的硬件呢?
答案1
外围设备通过一个连接到主处理器公共汽车。一些总线协议支持枚举(也称为发现),即主处理器可以询问“哪些设备连接到该总线?”设备以标准化格式回复一些有关其类型、制造商、型号和配置的信息。有了这些信息,操作系统就可以报告可用设备的列表,并决定为每个设备使用哪个设备驱动程序。有些总线协议不支持枚举,那么主处理器除了猜测之外没有办法找出连接了哪些设备。
所有现代 PC 总线都支持枚举,特别是PCI(原始及其扩展和后续产品,例如 AGP 和 PCIe),大多数内部外围设备都通过它连接,USB(所有版本),通过它连接大多数外围设备,以及火线,小型计算机系统接口,所有现代版本ATA/SATA等。现代显示器连接还支持发现所连接的显示器(HDMI,显示端口,DVI接口,VGA和EDID)。所以在PC上,操作系统可以通过枚举PCI总线来发现连接的外设,当在PCI总线上找到USB控制器时,则枚举USB总线等。注意,操作系统必须假设PCI总线的存在以及探测它的方法;这是 PC 架构上的标准化(“PC 架构”不仅仅意味着 x86 处理器:要成为一台(现代)PC,计算机还必须具有 PCI 总线,并且必须以某种方式启动)。
许多嵌入式系统使用不支持枚举的不太花哨的总线。直到 20 世纪 90 年代中期,在 PCI 取代之前,PC 上都是如此ISA。特别是大多数 ARM 系统的总线不支持枚举。一些不遵循PC架构的嵌入式x86系统也是如此。如果没有枚举,操作系统就必须知道存在哪些设备以及如何访问它们。这设备树是表示此信息的标准格式。
PC 总线支持发现的主要原因是它们被设计为允许模块化架构,在该架构中可以添加和删除设备,例如将扩展卡添加到 PC 中或在外部端口上连接电缆。嵌入式系统通常具有一组固定的设备1,以及由制造商预加载且不会被替换的操作系统,因此不需要枚举。
1如果有 USB 等外部总线,USB 外围设备会自动发现,它们不会在设备树中提及。
答案2
件实际上做需要一个设备树。
他们只是称之为别的东西。
说 PC/AT 兼容的后代操作系统是不正确的认为PCI 总线等事物的存在。他们不。
他们也不探究。自 20 世纪 90 年代中期以来,探测硬件,只是探查一些 I/O 或内存地址来查看它们是否工作,已经不再是必要的了。
相反,他们列举了一个根总线。
与其他可枚举总线不同,此总线无法通过与总线控制器设备硬件通信来枚举。此总线纯粹作为系统固件和操作系统的构造而存在。它通过查询系统固件来枚举,主板制造商会将其上存在的内容嵌入到系统固件中,以匹配主板上的内容。
这和设备树在概念上几乎没有区别。就像设备树一样,它的创建必须与实际的板相匹配。就像设备树一样,它是一个列表设备节点附有资源信息(除其他外)。就像设备树一样,它位于操作系统外部,并且不是要探测硬连接到操作系统自身代码中的事物列表。
这即插即用 BIOS 规范让固件在内存中向操作系统提供一个简单的设备树,其中一个节点将是(例如)PNP0A03
指定 PCI 总线的节点,提供为其分配的 I/O 和内存资源,从而确定其位置是要被发现的。
ACPI 取代了它,但想法保持不变。在ACPI中有一个表叫做差异化系统描述表,增加了一个辅助系统描述符表,它(带有来自其他一些 ACPI 表的信息)提供了大致相同的内容。
(如果您想从固件开发人员的角度了解这一点,请查看 Coreboot 的一个示例。它具有大量 ACPI 源语言文件,其中的一部分被编译成字节码二进制映像,并合并到固件中。该选择由配置工具控制,该工具会提示您选择目标特定主板。)
以 FreeBSD 为例,即插即用 BIOS 规范信息由内核中的总线驱动程序枚举pnpbios
(现已删除),并且(现在)ACPI 信息由acpi
总线驱动程序枚举。在 Linux 中,(仍然)有一个drivers/pnp/pnpbios
总线驱动程序读取即插即用 BIOS 表,并且 ACPI 表由分散在arch/arm64/kernel/
和中的代码读取arch/x86/kernel/
。
可枚举根总线可以,但通常不会(通过 ACPI 进行一些侵犯)与作为根总线上的设备的总线上可枚举的事物重叠。例如,虽然PNPxxxx
ATA 总线有 ID,但系统固件不会在使用它们的根总线上列出 PCI 至 ATA 桥接设备。此类设备的查找方法是在枚举根总线时查找 PCI 总线,然后在枚举 PCI 总线时查找 PCI 至 ATA 桥接器。
事实很简单,在概念名称不同、截然不同的平台上,运行的基本原理是相同的。有一个与系统中其他不可枚举设备相匹配的内置设备列表,并且固件或正在使用的任何引导加载程序为操作系统提供了一种机制来读取该列表并配置其上的设备,从而允许然后枚举操作系统那些轮流使用设备。
进一步阅读
- 康柏计算机公司、Phoenix Technologies 和英特尔公司 (1994-05-05)。即插即用 BIOS 规范。版本 1.0A。英特尔公司。
- ACPI 相关文档的链接。统一可扩展固件接口论坛。 UEFI。
- 帕特里克·莫切尔 (2002)。 ”Linux 内核设备模型”。 2002 年渥太华 Linux 研讨会论文集。第 368–375 页。
- Hiten Pandya 和汤姆·罗兹。 ”电源和资源管理”。 FreeBSD 手册。
- “旧版驱动程序:设备探测”。平台设备和驱动程序。
Documentation/driver-model/platform.txt
。 Linux 内核。 - https://superuser.com/a/1253583/38062