一、什么是设备驱动模型
(1)类class、总线bus、设备device、驱动driver 四个结构体
(2)kobject和对象生命周期
(3)sysfs cat 查看属性信息 、 echo 往里面写东西
(4)udev 同步信息
2、设备模型解决了一些什么问题?
(1)设备驱动模型负责统一实现和维护一些特性,诸如:电源管理、热插拔、对象生命周期、用户空间和驱动空间的交互等基础设施
(2)设备驱动模型目的是简化驱动程序编写,但是客观上设备驱动模型本身设计和实现很复杂
二、设备驱动模型的底层架构
1、、kobject
(1)定义在linux/kobject.h中
(2)各种对象最基本单元,提供一些公用型服务如:对象引用计数、维护对象链表、对象上锁、对用户空间的表示这里写代码片
(3)设备驱动模型中的各种对象其内部都会包含一个kobject
(4)地位相当于面向对象体系架构中的总基类
struct kobject {
const char *name; /* 对应sysfs的目录名 */
struct list_head entry; /* kobjetct双向链表 */
struct kobject *parent; /* 指向kset中的kobject,相当于指向父目录 */
struct kset *kset; /*指向所属的kset */
struct kobj_type *ktype; /*负责对kobject结构跟踪*/
struct sysfs_dirent *sd;
struct kref kref; /*kobject引用计数*/
unsigned int state_initialized:1;
unsigned int state_in_sysfs:1;
unsigned int state_add_uevent_sent:1;
unsigned int state_remove_uevent_sent:1;
unsigned int uevent_suppress:1;
};
kobject结构是组成设备模型的基本结构,最初kobject设计只用来跟踪模块引用计数,现已增加支持,
—— sysfs表述:在sysfs中的每个对象都有对应的kobject
—— 数据结构关联:通过链接将不同的层次数据关联
—— 热插拔事件处理:kobject子系统将产生的热插拔事件通知用户空间
kobject一般不单独使用,而是嵌入到上层结构(比如struct device,struct device_driver)当中使用。kobject的创建者需要直接或间接设置的成员有:ktype、kset和parent。kset我们后面再说,parent设置为NULL时,kobject默认创建到/sys顶层目录下,否则创建到对应的kobject目录中。重点来分析ktype成员的类型。
2、kobj_type
(1)很多书中简称为ktype,每一个kobject都需要绑定一个ktype来提供相应功能
(2)关键点1:sysfs_ops,提供该对象在sysfs中的操作方法(show和store)
(2)关键点2:attribute,提供在sysfs中以文件形式存在的属性,其实就是应用接口
struct kobj_type {
void (*release)(struct kobject *kobj); /* 释放 */
const stru`这里写代码片`ct sysfs_ops *sysfs_ops; /* 默认属性实现 */
struct attribute **defa