精品(2021-2022年)资料驱动注册的probe函数.docx
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
### 知识点详解 #### 一、探针函数(Probe Function)的作用及流程 **探针函数**(Probe Function)在Linux内核驱动开发中扮演着至关重要的角色。它是设备驱动程序中用于完成初始化工作的关键函数之一。探针函数通常在设备驱动注册的最后阶段被调用,它的主要任务是在设备(Device)与其对应的驱动(Driver)在总线上完成配对后,完成驱动注册的最后工作。这些工作可能包括分配资源、设置中断以及进行其他必要的初始化步骤。 #### 二、探针函数的调用流程 1. **`driver_register` 函数**: 设备驱动的注册通常通过调用`driver_register`函数实现。此函数初始化了设备驱动相关的数据结构,并最终调用`bus_add_driver`函数来完成注册过程。 ```cpp int driver_register(struct device_driver *drv) { klist_init(&drv->klist_devices, klist_devices_get, klist_devices_put); init_completion(&drv->unloaded); return bus_add_driver(drv); } ``` - `klist_init`用于初始化设备列表; - `init_completion`用于初始化等待队列; - `bus_add_driver`则是真正添加驱动到特定总线的过程。 2. **`bus_add_driver` 函数**: 在这个过程中,除了处理Kobject、Klist和Attr等与设备模型相关的操作外,还会调用`driver_attach`函数来将驱动与总线上的设备进行关联。 3. **`driver_attach` 函数**: 这个函数会遍历总线上的所有设备,并调用`__driver_attach`函数来尝试将驱动与设备关联。 4. **`__driver_attach` 函数**: 在这个函数中,会调用`driver_probe_device`来进一步检测驱动是否与设备匹配。 5. **`driver_probe_device` 函数**: 这个函数首先会检查驱动是否与设备匹配,匹配成功后才会调用驱动中的`probe`函数。 ```cpp if (drv->bus->match && !drv->bus->match(dev, drv)) goto Done; if (drv->probe) ret = drv->probe(dev); ``` - `drv->bus->match`: 调用总线的匹配函数,确定设备和驱动是否匹配; - `drv->probe`: 如果驱动中有定义`probe`函数,则调用该函数来完成具体的初始化工作。 #### 三、总线匹配机制 在`driver_probe_device`中有一个非常关键的步骤是检查`drv->bus->match`。这一步骤确保只有当驱动和设备匹配时,`probe`函数才会被调用。匹配机制通常由总线类型决定,比如PCI总线、USB总线等都有自己的匹配策略。如果匹配成功,`probe`函数会被调用来完成实际的初始化工作。 #### 四、设备驱动关联过程 1. **注册驱动**: 当向总线注册一个驱动时,首先会调用`driver_register`,接着是`bus_add_driver`,然后是`driver_attach`,再是`bus_for_each_dev`,最后是`__driver_attach`。 - `bus_for_each_dev`: 遍历总线上的所有设备,执行一次`__driver_attach`,尝试将驱动与设备关联。 - `__driver_attach`: 包含`driver_probe_device`,检查驱动是否与设备匹配。 2. **添加硬件设备**: 当向总线添加一个硬件设备时,首先会调用`device_add`,接着是`bus_attach_device`,然后是`device_attach`,再是`bus_for_each_drv`。 - `bus_for_each_drv`: 遍历总线上的所有驱动,执行一次`__device_attach`,尝试将设备与驱动关联。 - `__device_attach`: 包含`driver_probe_device`,检查设备是否与驱动匹配。 #### 五、结论 通过以上分析可以看出,探针函数在Linux设备驱动程序中起着核心作用,负责完成驱动注册的最后阶段,即设备初始化工作。此外,整个驱动注册和设备关联过程涉及到了多个层次的数据结构和函数调用,体现了Linux内核设计的复杂性和灵活性。理解探针函数及其调用流程对于深入掌握Linux内核驱动开发至关重要。
- 粉丝: 7
- 资源: 43万+
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助