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
...
}
struct deviceのフィールドは、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()を呼び出した後、structdeviceのフィールドが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()関数の2番目の部分を完了します。
つまり、device_register()は次の要素で構成されます。1。デバイスを初期化します。2。デバイスを追加します。pci_device_addはステップ1を実行し、pci_bus_add_deviceはステップ2を実行します。
対象のファイルは次のとおりです:drivers / pci / {pci.c、bus.c、probe.c}