日期:2014-05-16  浏览次数:20749 次

Linux驱动开发学习归纳-2

【设备驱动模型】

设备驱动模型提供了硬件的抽象:使用该抽象完成很多硬件重复的工作,如电源管理、即插即用设备支持、与用户空间的通信等。

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和kobj_type之间的关系如图所示:


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包含在一个更大的自定义结构体中。
另外,kobject可以通过kset组织成层次化的结构,kset是具有相同类型的kobject的集合,这也说明kset本身也对应一个目录。

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的关系如图所示:



/////////////////////********************************************************************************///////////////////////////

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