LDM数据结构
数据结构
bus
bus结构体用于抽象系统中总线的数据结构,这个可以是实际的总线例如,iic、spi等总线,也可以是虚拟总线,例如使用最多的platform总线。struct bus结构体管理挂载在该bus下的struct device和struct device_driver,负责device和device_driver的匹配,调用probe等工作。其中管理struct device和struct device_driver的功能独立出来成为一个子系统叫subsys_private,该数据结构除了管理该bus下的设备和驱动外还用于处理bus,device和device_driver的一些默认属性(公共属性),uevent事件等。可以看到subsys_private数据结构下有两个链表一个用于挂载device另一个用于挂载device_driver,从而实现bus对device和device_driver管理。
•
device
device结构体用于抽象驱动设备,系统下挂载的形形色色的设备都是通过struct device结构体来描述,其中dts里定义的很多节点都会转换为struct device结构体,用于描述一个设备信息,管理设备用到的资源等。device结构体下一个重要结构是device_private,该结构体成员knode_bus就是用于挂载到上面提到的bus下的subsys_private结构体中的klist_devices。
•
device_driver
device_driver结构体用于描述对struct device结构体描述的设备的驱动方法,比如对于通信协议的实现,对控制器的操作等。这样设备和设备的驱动实现分离单独管理,而设备和驱动分离后两者的匹配工作就是bus完成的,device_driver是用户需要编写的具体操作设备的方法和流程。同样struct device_driver结构体下的driver_private的knode_bus用于链接到struct bus下subsys_private结构体中的klist_drivers。
bus_type
在linux内核中总线用数据结构bus_type表示。
C++
C++
简单解释一下部分成员的含义:
•
init_name: 设备名(如果有的话)
•
id: 设备号
•
bus: 对应的总线
•
driver: 对应的驱动
•
kobj.name: kobj对应的名字,真正的设备名
•
kobj.kset: kobj的父节点
这里着重强调一点kobj.kset,这个值和驱动的父节点有所不同。驱动的父节点指向了总线,而设备的父节点是另一个根节点。这个时候我们可以来看看有了驱动和设备后,kobj树形结构的样子了。
device_private
目录:drivers/base/base.h
device_driver
内核中用结构体device_driver来表示一个驱动。不过大家通常在驱动程序中看到是另外的结构体,比如Platform驱动用的是platform_driver。但是我们打开这个platform_driver就可以看到其中包含了device_driver。所以驱动的核心数据结构还是device_driver。
C++
|shutdown |
|suspend |
|resume |
| |
+----------------------------------+
|p |
| (struct driver_private*) |
| +-----------------------------+
| |driver |
| | (struct device_driver*) |
| |kobj |
| | +------------------------+
| | |name | = device_driver->name
| | |kset | = device_driver->bus->p->drivers_kset
| | |ktype | = driver_ktype
| | +------------------------+
| |klist_devices |
| | |
+----+-----------------------------+
driver_private
最后编辑:SteveChen 更新时间:2024-12-12 08:40