gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:22:11 26 4
gpt4 key购买 nike

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

  1. Device在driver core中注册(device_register(),包括设备初始化)
  2. 在设备模型中注册了一个 kobject
  3. 它在 sysfs 中创建一个条目并引发热插拔事件
  4. 检查公交车和司机,看哪一个与设备匹配
  5. 探查
  6. 设备绑定(bind)到驱动

我的主要疑问是,在第 1 步中,什么时候调用 device_register() 并且应该已经在 device 结构中设置了哪些字段?

它是由设备连接的总线调用的吗?代码中有任何示例吗?

我是不是误会了什么? :)

最佳答案

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}

关于linux - Linux 内核配置设备的顺序是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2952501/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com