2010-06-01 89 views
8

正如我讀取與在Linux設備驅動程序第三版Linux設備模型,一個新的設備被配置爲當章後理解,內核(2.6)如下或多或少序列:Linux內核配置設備的順序是什麼?

  1. 所述裝置註冊在驅動核心(device_register(),什麼包括設備初始化)
  2. 一個kobject是在設備型號
  3. 它創建在sysfs一個條目,並引發一個熱插拔事件
  4. 總線和驅動程序檢查,查看登記在哪個一個與設備
  5. 0匹配
  6. 探頭
  7. 設備被綁定到駕駛員

我主要的疑問是,在步驟1中,當device_register()叫什麼領域應該已經在device結構來設置?

它是否與設備所連接的總線調用?代碼中的任何示例?

我誤解了什麼嗎? :)

回答

3

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}

0

結構總線型指向功能匹配的指針,其作用是匹配與設備關聯的驅動程序。因此,當設備與總線相關聯時,只要設備連接到總線,那麼總線負責搜索設備。

如果不是這樣,請糾正我。