Linux 内核如何发现 PCI 设备?

How does Linux kernel discover PCI devices?

在驱动程序端,pci_register_driver() 在加载驱动程序模块时调用,或者如果模块是内置的,则在启动时调用。 (每当添加 device/driver 时,driver/device 列表都会循环查找匹配项,我得到了那部分。)

但是 where/when pci 设备是否被发现并注册到总线?我想这是特定于架构的,并且会涉及 x86 上的 BIOS,例如 - BIOS 例程探测 PCI 设备,然后在加载内核之前将结果放在 RAM 中某个位置的列表中,并且每个列表条目包含单个 pci 的信息设备包括 vendorId/deviceId 等。内核然后选择列表并在某个时候将它们插入 pci_bus_type.p.klist_devices。但这纯属猜测,谁能给点提示?

其实BIOS不需要参与

PCI 标准化了在总线上发现设备的特定过程。这个过程可以在任何时候(不仅仅是在启动时)由热插拔控制器触发,甚至可以通过 /sys/bus/pci/rescan(参见 pci_rescan_bus)手动触发。

扫描将递归进行,如发现的那样遍历网桥并从遇到的每个设备读取配置 space 数据(参见 PCI configuration space)。

对于找到的每个设备,如果尚未激活,内核将查找具有匹配 pci_device_idpci_driver 对象的实例。然后它将调用该对象的 probe 方法(其余部分是特定于驱动程序实现的)。

如果未找到合适的 pci_driver 实例,内核将向用户 space 守护程序(udevhotpug 或其他)发出事件,这可能会加载一个适当的模块并创建必要的 pci_driver 对象。