Linux内核配置设备的顺序是什么?

时间:2010-06-01 19:05:16

标签: linux linux-kernel kernel linux-device-driver hotplugging

正如我在阅读Linux设备驱动程序第3版中与Linux设备模型相关的章节后所理解的,当配置新设备时,内核(2.6)或多或少地遵循以下顺序:

  1. 设备已在驱动程序核心(device_register()中注册,包括设备初始化)
  2. kobject已在设备型号中注册
  3. 它在sysfs中创建一个条目并引发一个hotplug事件
  4. 检查总线和驱动程序以查看哪一个与设备匹配
  5. 探针
  6. 设备绑定到驱动程序
  7. 我的主要疑问是,在步骤1中,何时调用device_register()以及应该在device结构中设置哪些字段?

    是否由设备连接的总线调用?代码中的任何例子?

    我误解了什么吗? :)

2 个答案:

答案 0 :(得分: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
...
}

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()之后,您将看到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。初始化设备和2.添加设备。 pci_device_add执行步骤1,pci_bus_add_device执行步骤2.

感兴趣的文件是:drivers / pci / {pci.c,bus.c,probe.c}

答案 1 :(得分:0)

struct bus type 中有指向函数匹配的指针,其作用是匹配与设备关联的驱动程序。因此,当设备与总线相关联时,一旦设备连接到总线,那么总线负责搜索设备。

如果不是这样,请纠正我。