为什么嵌入式系统需要设备树而个人电脑不需要?

MOH*_*SIM 20 embedded boot-loader linux-kernel device-tree

在嵌入式设备中引导内核时,您需要向 Linux 内核提供设备树,而在常规 x86 pc 上引导内核不需要设备树——为什么?

据我了解,在 x86 pc 上,内核“探测”硬件(如果我错了,请纠正我),那么为什么内核不能探测嵌入式系统中的硬件?

Gil*_*il' 26

外设通过总线连接到主处理器。一些总线协议支持枚举(也称为发现),即主处理器可以询问“什么设备连接到这条总线?” 设备以标准化格式回复有关其类型、制造商、型号和配置的一些信息。有了这些信息,操作系统就可以报告可用设备的列表并决定为每个设备使用哪个设备驱动程序。一些总线协议不支持枚举,那么主处理器除了猜测之外没有办法找出连接了哪些设备。

所有现代 PC 总线都支持枚举,特别是PCI(原始及其扩展和后继者,例如 AGP 和 PCIe),大多数内部外围设备都通过它连接,USB(所有版本),大多数外部外围设备都通过它连接,如以及FirewireSCSIATA/SATA 的所有现代版本等。现代显示器连接还支持发现连接的显示器(HDMIDisplayPortDVI、带有EDID 的VGA)。所以在PC上,操作系统可以通过枚举PCI总线来发现连接的外设,当它在PCI总线上找到USB控制器时枚举USB总线等。 注意操作系统必须假设PCI总线的存在以及探测它的方法;这是 PC 架构上的标准化(“PC 架构”不仅仅意味着 x86 处理器:要成为(现代)PC,计算机还必须具有 PCI 总线并且必须以某种方式启动)。

许多嵌入式系统使用不支持枚举的不太花哨的总线。直到 1990 年代中期,在 PCI 超过ISA之前,PC 上都是如此。尤其是大多数 ARM 系统具有不支持枚举的总线。一些不遵循 PC 架构的嵌入式 x86 系统也是如此。如果没有枚举,操作系统必须被告知存在哪些设备以及如何访问它们。的设备树是代表该信息的标准格式。

PC 总线支持发现的主要原因是它们被设计为允许在其中添加和移除设备的模块化架构,例如将扩展卡添加到 PC 或在外部端口上连接电缆。嵌入式系统通常有一组固定的设备¹,以及一个由制造商预先加载且不会被替换的操作系统,因此枚举不是必需的。

¹如果有 USB 等外部总线,则自动发现 USB 外围设备,它们不会在设备树中提及。


Jde*_*eBP 19

PC实际上确实需要一个设备树。

他们只是称之为别的东西。

说 PC/AT 兼容的后代的操作系统假设存在诸如 PCI 总线之类的东西是不正确的。他们不。

他们也不探查。自 1990 年代中期以来,探查硬件,只是戳一些 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 进行一些侵犯)与作为根总线上的设备的总线上的可枚举事物重叠。例如,虽然有PNPxxxxATA 总线的 ID,但系统固件不会在根总线上列出使用它们的 PCI 到 ATA 桥接设备。此类设备是通过在枚举根总线时查找PCI 总线,然后在枚举PCI 总线时查找PCI-to-ATA 桥接器来找到的。

事情的简单事实是,在概念名称不同的大相径庭的平台上,相同的基本原理正在运行。有一个与系统中不可枚举的设备相匹配的内置设备列表,固件或正在使用的任何引导加载程序为操作系统提供了一种机制来读取该列表并在其上配置设备,从而允许然后操作系统依次枚举这些设备。

进一步阅读