1.设备驱动模型简介
-> 设备驱动模型其实是Linux内核为了管理硬件上的设备和对应的驱动制定的一套软件体系。
-> 类(class)、总线(bus)、设备(device)、驱动(driver)、mdev(自动创建设备节点和设备类)sysfs等都属于设备驱动模型的范畴。
2.为什么需要设备驱动模型
-> 2.6版本中正式引入设备驱动模型,目的是在设备越来越多,功耗要求等新特性要求的情况下让驱动体系更易用、更优秀。
-> 设备驱动模型负责统一实现和维护一些特性.
-> kobject需要处理的基本任务有如下:电源管理、热插拔、对象生命周期、用户空间和驱动空间的交互等基础设施。
3.设备驱动模型的底层架构Kobjec
-> Kobject是代表驱动模型中的一个对象。总线、驱动、设备都继承了它。
-> Linux内核源码中对kobject结构体的定义在include/linux/kobject.h文件中,实现在lib/kobjet.c,struct kobject结构体的定义如下所示:
struct kobject {
const char *name; //表示kobject对象的名字,对应sysfs下的一个目录
struct list_head entry; //在kobject中嵌入双向链表list_head结构
struct kobject *parent; //指向当前kobject父对象的指针
struct kset *kset; //表示当前kobject对象所属的集合
struct kobj_type *ktype; //表示当前kobject对象所属类型
struct kernfs_node *sd; /* sysfs directory entry */ //用于VFS文件系统的目录项,是设备
//与文件之间的桥梁,sysfs中的符号链接就是通过kernfs_node内的联合体实现的
struct kref kref; //是对kobject的引用计数,当引用计数为0时,就回调之前注册的release //函数释放该对象
#ifdef CONFIG_DEBUG_KOBJECT_RELEASE
struct delayed_work release;
#endif
unsigned int state_initialized:1; //初始化的标志位,在对象被初始化时置位,用于表示对象已被
//初始化
unsigned int state_in_sysfs:1; //表示kobject对象在sysfs中的状态,在对应目录中被创建则置
//1,否则为0
unsigned int state_add_uevent_sent:1; //添加设备的uevent事件是否发送标志,添加设备时会向
//用户空间发送uevent事件,请求新增设备
unsigned int state_remove_uevent_sent:1; //删除设备的uevent事件是否发送标志,删除设备时
//会向用户空间发送uevent事件,请求卸载设备
unsigned int uevent_suppress:1;
};
-> 各种对象最基本单元,提供一些公用型服务如:对象引用计数、维护对象链表、对象上锁、对用户空间的表示等。
-> 设备驱动模型中的各种对象其内部都会包含一个kobject。
-> 地位相当于面向对象体系架构中的总基类。
4.kobj_type
struct kobj_type定义了kobject的类型,该结构体既有操作的函数,也有默认的公共属性,该结构体定义如下:
使用该kobject设备的共同属性
struct kobj_type {
void (*release)(struct kobject *kobj);//释放kobject和其占用的函数
const struct sysfs_ops *sysfs_ops; //操作一个属性数组的方法
struct attribute **default_attrs; //属性数组的方法
const struct kobj_ns_type_operations *(*child_ns_type)(struct kobject *kobj);
const void *(*namespace)(struct kobject *kobj);
};
属性数组
struct attribute {
const char *name; //属性的名字
struct module *owner;//指向用于该属性的模块,已经不常使用
mode_t mode; //属性读写权限
};
操作属性数组的方法
struct sysfs_ops
{
ssize t (*show) (struct kobject *, struct attribute *, char *);/*读属性操作函数*/
ssize t (*store) (struct kobject *,struct attribute *,const char *buf, size_t count);/*写属性操作函数*/
}
-> release:函数指针,当引用计数为0时,在kobject释放时调用。
-> sysfs_ops:定义了读写属性文件时调用的函数。
-> default_attrs:定义了这类kobject默认属性,指向attribute数组的指针。
5.kset
struct kset {
struct list_head list; //连接链表
spinlock_t list_lock; //链表的自旋锁
struct kobject kobj; //内嵌的kobject结构体,说明kset本身也是一个目录
const struct kset_uevent_ops *uevent_ops; //热插拔事件
};
-> kset的主要作用是做顶层kobject的容器类。
-> kset的主要目的是将各个kobject(代表着各个对象)组织出目录层次架构。
-> 可以认为kset就是为了在sysfs中弄出目录,从而让设备驱动模型中的多个对象能够有层次有逻辑性的组织在一起。