PCI熱插拔代碼會調用pci_do_scan_bus()要經過所有插槽,看看我們是否找到了設備/橋接器,並將它們添加到我們的設備樹:
unsigned int __devinit pci_do_scan_bus(struct pci_bus *bus) {
max = pci_scan_child_bus(bus) //scan bus for all slots and devices in them
pci_bus_add_devices(bus); //add what we find
...
}
在結構設備的領域實際上是作爲調用pci_scan_child_bus()的一部分填充的。這裏是通話圖(排序:)):
pci_scan_child_bus> pci_scan_slot(掃描總線上的插槽)> pci_scan_single_device> pci_device_add> device_initialize。
請注意,device_initialize()是device_register()的第一部分。在調用device_initialize()之後,您會看到struct device的字段填充在pci_device_add中。你可以在內核源代碼的drivers/pci/probe.c目錄下找到它。 struct pci_dev也將被填充,稍後將由設備特定的驅動程序使用。
實際將kobject添加到設備層次結構發生在pci_bus_add_devices中。以下是調用圖:
pci_bus_add_devices> pci_bus_add_device> device_add。
如您所見,此調用流完成device_register()函數的第二部分。
簡而言之,device_register()包括:1.初始化設備並添加設備。 pci_device_add確實步驟1和pci_bus_add_device確實步驟2的興趣
文件是:驅動/ PCI/{pci.c,bus.c,probe.c}