设备模型数据结构简述

设备驱动主要由 :总线、设备驱动、设备 三部分构成;

设备驱动模型主要由 :Kset、Kobject、Ktype 三部分组成;
Kset 是同类型Kobject对象的集合,可以说是一个容器
Kobject 是总线 驱动 设备的是那种对象的一个基类,实现公共接口
Ktype 记录了Kobject的一些属性。

《总线、设备驱动、设备》 与 《Kset、Kobject、Ktype》之间的联系:
设备驱动的 《总线、设备驱动、设备》在内核中主要是以树状的形式存在的,

由各个节点组成;《Kset、Kobject、Ktype》就负责组成树状的模型,充当各个节点,组成驱动的框架,将《总线、设备驱动、设备》连接起来;

      《总线、设备驱动、设备》 是设备驱动的上层表现形式,《Kset、Kobject、Ktype》 是设备驱动的底层表现形式。



总线结构体简述
 struct bus_type {
const char *name;
struct bus_attribute *bus_attrs; /* 总线的属性 */
struct driver_attribute *drv_attrs; /* 驱动属性*/
struct device_attribute *dev_attrs; //设备属性 
....
const struct dev_pm_ops *pm;//电源管理
struct subsys_private *p;  //总线私有数据
}


总线结构体私有资源 简述
    struct subsys_private {
    struct kset subsys;
    struct kset *devices_kset;  /* 使用kset构建关联的devices链表头 */
    struct kset *drivers_kset;  /* 使用kset构建关联的drivers链表头 */
    struct klist klist_devices;   /* 通过循环可访问devices_kset的链表 */
    struct klist klist_drivers;  /* 通过循环可访问drivers_kset的链表 */
.....
};


设备驱动 结构体简述
struct device_driver {
const char *name;  驱动程序的名字
struct bus_type *bus; 驱动程序所在总线
struct module *owner;
const char *mod_name; /* used for built-in modules */
bool suppress_bind_attrs; /* disables bind/unbind via sysfs */
enum probe_type probe_type;
const struct of_device_id *of_match_table;
const struct acpi_device_id *acpi_match_table;
int (*probe) (struct device *dev);
int (*remove) (struct device *dev);
void (*shutdown) (struct device *dev);
int (*suspend) (struct device *dev, pm_message_t state);
int (*resume) (struct device *dev);
const struct attribute_group **groups;
const struct dev_pm_ops *pm;
struct driver_private *p;  驱动私有资源
};


设备驱动私有资源 简述
struct driver_private {
    struct kobject kobj;
struct klist klist_devices;
struct klist_node knode_bus;
struct module_kobject *mkobj;
struct device_driver *driver;
};

//设备结构体 简述
struct device {
const char *name 设备名称
struct bus_type *bus  设备所在总线
struct kobject kobj;
struct device_private *p;
...
struct device_node *of_node; 关联设备树节点 设备树中的节点描述
等等
}


//kset 是相同类型的 kobject 的集合 (Kset本身也是一个kobject 所以它在sysfs里同样表现为一个目录)
struct kset {
    struct list_head list;//用来链接该目录下的所有kobject对象
    spinlock_t list_lock; //在访问链表时加锁
    struct kobject kobj;  //同一个kset集合中内嵌的kobject,代表的是当前链表第一个 kobj 节点;
    const struct kset_uevent_ops *uevent_ops;//对发往用户空间的uevent的处理,如热拔插
};


//Kobject 是总线 驱动 设备对象的一个基类,实现公共接口
struct kobject {
const char *name;          指向对象名称的指针
struct list_head entry;      双向链表指针,用于将同一个kset集合中的kobject
                                           链接到一起,方便访问; 用来指向平行关系中
                                          的下一个kobject结构体对象

struct kobject *parent;    kobject对应的父kobject节点,在sys系统中表现为上一级目录
 
struct kset *kset;          kobject集合 用来指向父类对象的kset
struct kobj_type *ktype;     kobject 类型   指向一个kobj_type对象
struct kernfs_node *sd;     sysfs文件系统目录
struct kref kref;            初始化引用计数
#ifdef CONFIG_DEBUG_KOBJECT_RELEASE
struct delayed_work release;
#endif
unsigned int state_initialized:1; 初始化标志位
unsigned int state_in_sysfs:1;    是否在 sys 创建对应目录标志位


unsigned int state_add_uevent_sent:1;  添加设备的uevent事件是否发送标志;
                                                                       添加设备时会向用户空间发送 uevent事件
   请求新增设备
  
unsigned int state_remove_uevent_sent:1; 删除设备的uevent 事件是否发送标志;
                                                                             删除设备时会向用户空间发送uevent事件
                                                                             请求卸载设备;
unsigned int uevent_suppress:1;
};

//Ktype 记录了Kobject的一些属性
struct kobj_type {  
    void (*release)(struct kobject *kobj);//用于释放kobject占用的资源  
    const struct sysfs_ops *sysfs_ops;/*Kobject 属性操作集合*/  
    struct attribute **default_attrs; /*Kobject 默认属性数组*/  
    const struct kobj_ns_type_operations *(*child_ns_type)(struct kobject *kobj);  
    const void *(*namespace)(struct kobject *kobj);  
}; 





























  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Linux老A

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值