设备驱动主要由 :总线、设备驱动、设备 三部分构成;
设备驱动模型主要由 :Kset、Kobject、Ktype 三部分组成;
Kset 是同类型Kobject对象的集合,可以说是一个容器
Kobject 是总线 驱动 设备的是那种对象的一个基类,实现公共接口
Ktype 记录了Kobject的一些属性。
《总线、设备驱动、设备》 与 《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);
};
设备驱动模型主要由 :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);
};