linux设备模型

上传人:枫** 文档编号:491564653 上传时间:2024-02-24 格式:DOC 页数:16 大小:226KB
返回 下载 相关 举报
linux设备模型_第1页
第1页 / 共16页
linux设备模型_第2页
第2页 / 共16页
linux设备模型_第3页
第3页 / 共16页
linux设备模型_第4页
第4页 / 共16页
linux设备模型_第5页
第5页 / 共16页
点击查看更多>>
资源描述

《linux设备模型》由会员分享,可在线阅读,更多相关《linux设备模型(16页珍藏版)》请在金锄头文库上搜索。

1、Ksct:frsysft中我总一种偿次結构*4Ktype:uri2:4*1:啪|叫时阳叶出誇1:同八ktypr.、八、-:刖言Linux设备模型是一个极其复杂的结构体系,在编写驱动程序的时候,通常不会用到这方面的东西,但是。理解这部份内容,对于我们理解linux设备驱动的结构是大有裨益的。我们不但可以在编写程序程序的时候知其然,亦知其所以然。又可以学习到一种极其精致的架构设计方法。由于之前已经详细分析了sysfs文件系统。所以本节的讨论主要集中在设备模型的底层实现上。上层的接口,如pci.,usb网络设备都可以看成是底层的封装。二:kobject,kset和ktypeKobject,kset,

2、kypte这三个结构是设备模型中的下层架构。模型中的每一个元素都对应一个kobject.kset和ktype可以看成是kobject在层次结构与属性结构方面的扩充。将三者之间的关系用图的方示描述如下:Kobjticl-kseiKobjrcr-ktype如上图所示:我们知道。在sysfs中每一个目录都对应一个kobject.这些kobject都有自己的parent。在没有指定parent的情况下,都会指向它所属的kset-object其次,kset也内嵌了kobject.这个kobject又可以指它上一级的parent。就这样。构成了一个空间上面的层次关系。其实,每个对象都有属性。例如,电源管理

3、,执插拨事性管理等等。因为大部份的同类设备都有相同的属性,因此将这个属性隔离开来,存放在ktype中。这样就可以灵活的管理了记得在分析sysfs的时候。对于sysfs中的普通文件读写操作都是由kobject-ktype-sysfs_op来完成的.经过上面的分析,我们大概了解了kobject.kset与ktype的大概架设与相互之间的关系。下面我们从linux源代码中的分析来详细研究他们的操作。三:kobject,kset和ktype的操作为了说明kobject的操作,先写一个测试模块,代码如下:#include#include#include#include#include#include#i

4、ncludeMODULE_AUTHOR(ericxiao);MODULE_LICENSE(DualBSD/GPL);voidobj_test_release(structkobject*kobject);ssize_teric_test_show(structkobject*kobject,structattribute*attr,char*buf);ssize_teric_test_store(structkobject*kobject,structattribute*attr,constchar*buf,size_tcount);structattributetest_attr=.name

5、=eric_xiao,.mode=S_IRWXUGO,;staticstructattribute*def_attrs=&test_attr,NULL,;structsysfs_opsobj_test_sysops=.show=eric_test_show,.store=eric_test_store,;structkobj_typektype=.release=obj_test_release,.sysfs_ops=&obj_test_sysops,.default_attrs=def_attrs,;voidobj_test_release(structkobject*kobject)pri

6、ntk(eric_test:release.n);ssize_teric_test_show(structkobject*kobject,structattribute*attr,char*buf)printk(haveshow.n);printk(attrname:%s.n,attr-name);sprintf(buf,%sn,attr-name);returnstrlen(attr-name)+2;ssize_teric_test_store(structkobject*kobject,structattribute*attr,constchar*buf,size_tcount)print

7、k(havestoren);printk(write:%sn,buf);returncount;structkobjectkobj;staticintkobject_test_init()printk(kbojecttestinit.n);kobject_init_and_add(&kobj,&ktype,NULL,eric_test);return0;staticintkobject_test_exit()printk(kobjecttestexit.n);kobject_del(&kobj);return0;module_init(kobject_test_init);module_exi

8、t(kobject_test_exit);加载模块之后,会发现,在/sys下多了一个eric_test目录。该目录下有一个叫eric_xiao的文件。如下所示:rootlocalhosteric_test#lseric_xiao用cat察看此文件:rootlocalhosteric_test#cateric_xiaoeric_xiao再用echo往里面写点东西;rootlocalhosteric_test#echohelloeric_xiaoDmesg的输出如下:haveshow.attrname:eric_xiao.havestorewrite:hello如上所示。我们看到了kobject的

9、大概建立过程我们来看一下kobject_init_and_add()的实现。在这个函数里,包含了对kobject的大部份操作。intkobject_init_and_add(structkobject*kobj,structkobj_type*ktype,structkobject*parent,constchar*fmt,.)va_listargs;intretval;/初始化kobjectkobject_init(kobj,ktype);va_start(args,fmt);/为kobjcet设置名称,在sysfs中建立相关信息retval=kobject_add_varg(kobj,pa

10、rent,fmt,args);va_end(args);returnretval;上面的流程主要分为两部份。一部份是kobject的初始化。在这一部份,它将kobject与给定的ktype关联起来。初始化kobject中的各项结构。另一部份是kobject的名称设置。空间层次关系的设置,具体表现在sysfs文件系统中.对于第一部份,代码比较简单,这里不再赘述。跟踪第二部份,也就是kobject_add_varg()的实现.staticintkobject_add_varg(structkobject*kobj,structkobject*parent,constchar*fmt,va_list

11、vargs)va_listaq;intretval;va_copy(aq,vargs);/设置kobject的名字。即kobject的name成员retval=kobject_set_name_vargs(kobj,fmt,aq);va_end(aq);if(retval)printk(KERN_ERRkobject:cannotsetnameproperly!n);returnretval;/设置kobject的parent。在上面的例子中,我们没有给它指定父结点kobj-parent=parent;/在sysfs中添加kobjcet信息returnkobject_add_internal(

12、kobj);设置好kobject-name后,转入kobject_addnternal()。在sysfs中创建空间结构.代码如下:staticintkobject_add_internal(structkobject*kobj)interror=0;structkobject*parent;if(!kobj)return-ENOENT;II如果kobject的名字为空退出if(!kobj-name|!kobj-name0)pr_debug(kobject:(%p):attemptedtoberegisteredwithemptyname!n,kobj);WARN_ON(1);return-EI

13、NVAL;II取kobject的父结点parent=kobject_get(kobj-parent);II如果kobject的父结点没有指定,就将kset-kobject做为它的父结点I*joinksetifset,useitasparentifwedonotalreadyhaveone*Iif(kobj-kset)if(!parent)parent=kobject_get(&kobj-kset-kobj);kobj_kset_join(kobj);kobj-parent=parent;II调试用pr_debug(kobject:%s(%p):%s:parent:%s,set:%sn,kobj

14、ect_name(kobj),kobj,_FUNCTION_,parent?kobject_name(parent):,kobj-kset?kobject_name(&kobj-kset-kobj):);II在sysfs中创建kobject的相关元素error=create_dir(kobj);if(error)IIv如果创建失败。减少相关的引用计数kobj_kset_leave(kobj);kobject_put(parent);kobj-parent=NULL;I*benoisyonerrorissues*Iif(error=-EEXIST)printk(KERN_ERR%sfailedfor%swith-EEXIST,donttrytoregisterthingswiththesamenameinthesamedirectory.n,_FUNCTION_,kobject_name(kobj);elseprintk(KERN_ERR%sfailedfor%s(%d)n,_FUNCTION_,kobject_name(kobj),error);dump_stack();else如果创建成功。将state_in_sysf建为1。表示该object已经在sys

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号