当引导嵌入式设备中的内核时,需要向Linux内核提供设备树,而在普通x86 pc上引导内核不需要设备树--为什么?
据我所知,在x86 pc上,内核对硬件的“探测”(如果我错了就纠正我的话),那么为什么内核不能探测硬件和嵌入式系统呢?
发布于 2017-10-22 12:03:55
他们只是叫它别的东西。
说PC/AT兼容的后代的操作系统假定存在诸如PCI总线之类的东西是不正确的。他们不知道。
他们也不调查。从20世纪90年代中期以来,只需戳一些I/O或内存地址来查看它们是否工作,就不再需要对硬件进行探测。
相反,它们枚举根总线。
这是一种不能通过与总线控制器设备硬件通信来枚举的总线,就像与其他可枚举总线一样。这是一种纯粹作为系统固件和操作系统的构造而存在的总线。它是通过查询系统固件来列举的,其上的内容由主板制造商烘焙到系统固件中,以匹配主板上的内容。
这和设备树在概念上没有什么区别。就像一个设备树,它必须创建,以匹配实际的董事会。就像设备树一样,它是一个设备节点列表,其中包含资源信息(以及其他内容)。就像设备树一样,它是操作系统的外部,并不是要探测到硬连接到操作系统自己代码中的东西列表。
即插即用BIOS规范具有固件向操作系统提供内存中的简单设备树,其中一个节点将是(例如)指定PCI总线的PNP0A03节点,给出分配给它的I/O和内存资源,从而找到它的位置。
ACPI取代了这一点,但理念依然不变。在ACPI中,有一个名为区分系统描述表的表,该表由一个辅助系统描述符表增强,该表(包含来自其他几个ACPI表的信息)提供了很多相同的内容。
(如果您想从固件开发人员那里看到这一点,请查看Coreboot中的一个例子。它有大量的ACPI源语言文件,其中的一些文件被编译成一个字节码二进制映像,并将其合并到固件中。该选择由一个配置工具控制,该工具提示一个特定主板被锁定。)
例如,在FreeBSD上,即插即用是由内核内的pnpbios总线驱动程序枚举的(自那时起已被删除),以及(现在) acpi总线驱动程序枚举了这些信息。在Linux中,有一个(仍然) drivers/pnp/pnpbios总线驱动程序来读取即插即用的BIOS表,ACPI表是通过分散在arch/arm64/kernel/和arch/x86/kernel/中的代码读取的。
可枚举根总线可以,但通常不会(按ACPI进行某些侵犯)与根总线上的设备上可枚举的内容重叠。例如,虽然有用于ATA总线的PNPxxxx ID,但系统固件不会在根总线上列出PCI到ATA桥设备,并使用它们。这些设备是通过枚举根总线时查找PCI总线,然后在枚举PCI总线时找到PCI到ATA桥来发现的。
这件事的简单事实是,在不同名称的平台上,同样的基本原则在运行。有一个与系统中其他不可枚举设备相匹配的出炉设备列表,并且固件或任何正在使用的引导加载程序提供了一种机制,使操作系统能够读取该列表并配置其上的设备,从而使操作系统能够在依次枚举这些设备。
Documentation/driver-model/platform.txt。Linux内核。https://unix.stackexchange.com/questions/399619
复制相似问题