日期:2014-05-16 浏览次数:20818 次
【设备驱动模型】
设备驱动模型提供了硬件的抽象:使用该抽象完成很多硬件重复的工作,如电源管理、即插即用设备支持、与用户空间的通信等。
sysfs文件系统:Linux设备驱动模型由大量的数据结构和算法构成,非常复杂,因此引入sysfs文件系统来显示设备驱动模型的复杂关系。sysfs是一个只存在于内存中的文件系统。内核通过这个文件系统将设备信息导出到用户空间。sysfs文件系统是内核对象(kobject)、属性(kobj_type)及他们之间的相互关系的一种表现机制。用户可以从sysfs文件系统中读出内核数据,也可以将用户空间的数据写入内核中,从而设置驱动程序的属性和状态。
Linux 内核结构 和 sysfs文件系统 的对应关系:
Linux内核中的结构 sysfs中的结构
kobject <-----------------------------------> 目录
kobj_type <----------------------------------> 属性文件
对象之间的关系<--------------------------> 符号链接
在sysfs文件系统中,设备使用树形目录来表示,树形目录中的每个目录都对应于内核中的一个kobject对象。
59 struct kobject { 60 const char *name; 61 struct list_head entry; 62 struct kobject *parent; 63 struct kset *kset; 64 struct kobj_type *ktype; 65 struct sysfs_dirent *sd; 66 struct kref kref; 67 unsigned int state_initialized:1; 68 unsigned int state_in_sysfs:1; 69 unsigned int state_add_uevent_sent:1; 70 unsigned int state_remove_uevent_sent:1; 71 unsigned int uevent_suppress:1; 72 };每个kobject对象都有一些属性,这些属性有kobj_type结构体表示。
107 struct kobj_type { 108 void (*release)(struct kobject *kobj); 109 struct sysfs_ops *sysfs_ops; 110 struct attribute **default_attrs; 111 };
kobject始终代表sysfs文件系统中的一个目录,kobject对象的成员name是sysfs文件系统中的目录名。
kobject在sysfs文件系统中的位置由parent指针指定。
kobj_type是kobject的属性。attribute结构体表示一个属性。sysfs_ops表示对属性的操作函数。
28 struct attribute { 29 const char *name; 30 struct module *owner; 31 mode_t mode; 32 };
77 struct sysfs_ops { 78 ssize_t (*show)(struct kobject *, struct attribute *,char *); 79 ssize_t (*store)(struct kobject *,struct attribute *,const char *, size_t); 80 };在编写设备驱动时,一般把kobject包含在一个更大的自定义结构体中。
154 struct kset { 155 struct list_head list; 156 spinlock_t list_lock; 157 struct kobject kobj; 158 struct kset_uevent_ops *uevent_ops; 159 };kset与kobject的关系如图所示:
/////////////////////********************************************************************************///////////////////////////
设备驱动模型由三大组件构成:总线、设备、驱动。