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

Jai*_*ano 8 linux kernel linux-device-driver linux-kernel hotplugging

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

  1. 设备已在驱动程序核心中注册(device_register()包括设备初始化)
  2. kobject已在设备模型中注册
  3. 它在sysfs中创建一个条目并引发一个hotplug事件
  4. 检查总线和驱动程序以查看哪个与设备匹配
  5. 探测
  6. 设备绑定到驱动程序

我的主要疑问是,在第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
...
}
Run Code Online (Sandbox Code Playgroud)

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}