Linux 内核如何发现 PCI 设备?

QnA*_*QnA 0 c linux-device-driver linux-kernel pci

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

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

oak*_*kad 5

实际上,BIOS 不需要参与。

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

扫描将递归进行,遍历所发现的网桥并从遇到的每个设备读取配置空间数据(请参阅PCI 配置空间)。

对于每个设备发现,如果没有积极的,内核将寻找的实例pci_driver对象与匹配pci_device_id。然后它将调用该probe对象的方法(其余的是特定于驱动程序实现的)。

如果合适的话pci_driver没有找到实例,内核将发出一个事件给用户空间守护进程(udevhotpug或其他),其可以装载适当的模块和创建必要的pci_driver对象。