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

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