数据结构​

enter image description here#405px #412px

 

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-09 03:19
最后编辑:SteveChen  更新时间:2024-12-12 08:40
上一篇:
下一篇: