日期:2014-05-16 浏览次数:20973 次
【设备驱动模型】
设备驱动模型提供了硬件的抽象:使用该抽象完成很多硬件重复的工作,如电源管理、即插即用设备支持、与用户空间的通信等。
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的关系如图所示:

/////////////////////********************************************************************************///////////////////////////
设备驱动模型由三大组件构成:总线、设备、驱动。