linux设备模型

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一:前言

Linux设备模型是一个极其复杂的结构体系,在编写驱动程序的时候,通常不会用到这方面的东西,但是。理解这部份内容,对于我们理解linux设备驱动的结构是大有裨益的。我们不但可以在编写程序程序的时候知其然,亦知其所以然。又可以学习到一种极其精致的架构设计方法。由于之前已经详细分析了sysfs文件系统。所以本节的讨论主要集中在设备模型的底层实现上。上层的接口,如pci.,usb ,网络设备都可以看成是底层的封装。

二:kobject ,kset和ktype

Kobject,kset,kypte这三个结构是设备模型中的下层架构。模型中的每一个元素都对应一个kobject.kset和ktype可以看成是kobject在层次结构与属性结构方面的扩充。将三者之间的关系用图的方示描述如下:

如上图所示:我们知道。在sysfs中每一个目录都对应一个kobject.这些kobject都有自己的parent。在没有指定parent的情况下,都会指向它所属的kset->object。其次,kset也内嵌了kobject.这个kobject又可以指它上一级的parent。就这样。构成了一个空间上面的层次关系。

其实,每个对象都有属性。例如,电源管理,执插拨事性管理等等。因为大部份的同类设备都有相同的属性,因此将这个属性隔离开来,存放在ktype中。这样就可以灵活的管理了.记得在分析sysfs 的时候。对于sysfs中的普通文件读写操作都是由kobject->ktype->sysfs_ops来完成的.

经过上面的分析,我们大概了解了kobject.kset与ktype的大概架设与相互之间的关系。下面我们从linux源代码中的分析来详细研究他们的操作。

三:kobject,kset和ktype的操作

为了说明kobject的操作,先写一个测试模块,代码如下:

#include

#include

#include

#include

#include

#include

#include

MODULE_AUTHOR("eric xiao");

MODULE_LICENSE("Dual BSD/GPL");

void obj_test_release(struct kobject *kobject);

ssize_t eric_test_show(struct kobject *kobject, struct attribute *attr,char *buf);

ssize_t eric_test_store(struct kobject *kobject,struct attribute *attr,const char *buf, size_t count); struct attribute test_attr = {

.name = "eric_xiao",

.mode = S_IRWXUGO,

};

static struct attribute *def_attrs[] = {

&test_attr,

NULL,

};

struct sysfs_ops obj_test_sysops =

{

.show = eric_test_show,

.store = eric_test_store,

};

struct kobj_type ktype =

{

.release = obj_test_release,

.sysfs_ops=&obj_test_sysops,

.default_attrs=def_attrs,

};

void obj_test_release(struct kobject *kobject)

{

printk("eric_test: release .\n");

}

ssize_t eric_test_show(struct kobject *kobject, struct attribute *attr,char *buf)

{

printk("have show.\n");

printk("attrname:%s.\n", attr->name);

sprintf(buf,"%s\n",attr->name);

return strlen(attr->name)+2;

}

ssize_t eric_test_store(struct kobject *kobject,struct attribute *attr,const char *buf, size_t count) {

printk("havestore\n");

printk("write: %s\n",buf);

return count;

}

struct kobject kobj;

static int kobject_test_init()

{

printk("kboject test init.\n");

kobject_init_and_add(&kobj,&ktype,NULL,"eric_test");

return 0;

}

static int kobject_test_exit()

{

printk("kobject test exit.\n");

kobject_del(&kobj);

return 0;

}

module_init(kobject_test_init);

module_exit(kobject_test_exit);

加载模块之后,会发现,在/sys下多了一个eric_test目录。该目录下有一个叫eric_xiao的文件。如下所示:

[root@localhost eric_test]# ls

eric_xiao

用cat察看此文件:

[root@localhost eric_test]# cat eric_xiao

eric_xiao

再用echo往里面写点东西;

[root@localhost eric_test]# echo hello > eric_xiao

Dmesg的输出如下:

have show.

attrname:eric_xiao.

havestore

write: hello

相关文档
最新文档