linux设备驱动模型详解

上传人:jiups****uk12 文档编号:39448127 上传时间:2018-05-15 格式:PDF 页数:53 大小:507.35KB
返回 下载 相关 举报
linux设备驱动模型详解_第1页
第1页 / 共53页
linux设备驱动模型详解_第2页
第2页 / 共53页
linux设备驱动模型详解_第3页
第3页 / 共53页
linux设备驱动模型详解_第4页
第4页 / 共53页
linux设备驱动模型详解_第5页
第5页 / 共53页
点击查看更多>>
资源描述

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

1、Linux设备详细绍模型之介 以LDD3说的法:Linux设备这认为级对模型部分内容可以是高教材,于多数程序作者来说认为是不必要的。但是我个人:对于一个嵌入式 Linux层员说这的底程序来,部分内容是 很重要的。习以我学的 ARM9为总线例,有很多(如 SPI、IIC、IIS 等等)在 Linux经下已被编统驱动这总线写成了子系,无需自己写;而些又不像 PCI、USB 等在LDD3上有教 时还统总线类程,有要自己研究它的子系构架,甚至要自己添加一个新的型。 对这习页这这于方面的学,我推荐几个网,些也是我部分文章的参资考料: (1) Linux 那些事儿 之 我是 Sysfs复来源于旦和交大三个

2、牛人的 Linux术技博客: http:/ (复旦_abc)他们还分析了很多 Linux 的驱动,值得 珍藏! (2)linux设备详模型解也是一个牛人的博客文章,博客网址: http:/ (3)s3c2410设备关的注册是一篇于 2410 中 linux实现设备资内核模型的不可多得的好 料。网址:http:/ (4)luofuchong 的博客 ,此人分析了一些 2410 中的 Linux统子系(如 SPI,input 等),实值关力不凡,得注。网址:http:/ 这习在部分的学中,将会先研究 linux设备每步步模型的个元素,最后将其一一整合,至底 开较向上地分析。一始会比摸不 头脑阶着,

3、到了整合段就柳暗花明了。我之所以没有先介 绍每为对每认雾整体,再分析个部分是因如果不个元素做真分析,看了整体也会云里里(我 试过了,恕小生 钝开阶开愚)。所以一始要耐着性子看,到整合段就会豁然朗。 Linux设备模型的目的是:为统设备对统结内核建立起一个一的模型,从而有一个系构的一 般性抽象描述。 现设备种务在内核使用模型支持多不同的任: 电统关源管理和系机 这对统结设备:些需要系构的理解,模型使 OS顺历能以正确序遍系 统硬件。 户间讯与用空的通 :sysfs 拟统实现设备紧关虚文件系的与模型的密相, 并向外界展示它所 结户间统变过表述的构。向用空提供系信息、改操作参数的接口正越来越多地通

4、sysfs , 设备也就是模型来完成。 热设备插拔 设备类设备设备类层这设备型:模型包括了将分的机制,在一个更高的功能上描述些, 并使 设备对户间见用空可。 对象生命周期设备实现创处对对间关:模型的需要建一系列机制来理象的生命周期、象的系 对户间和象在用空的表示。 Linux 设备复杂结对说模型是一个的数据构。但模型的大部分来, Linux 设备码处模型代会这关理好些系, 们强驱动隐设备而不是把他加于作者。模型藏于交互的背后,与模型的直接 总线级逻辑统处许驱动设备交互通常由的和其他的内核子系理。所以多作者可完全忽略模 型, 设备处负责并相信模型能理好他所的事。 请在此之前先了解一下 sysfs

5、请,看 Linux 那些事儿之我是 Sysfs(1)sysfs 初探 这我就不在 废话这还议里了!里建先看看 sysfs 的内核文档Documentationfilesystemssysfs.txt,我将其 译翻好做成 PDF载,下地址:http:/ 错误欢错误欢如有迎指正! 如有迎指正! Kobject、Kset 和 SubsystemKobject、Kset 和 Subsystem Kobjects Kobjects kobject种结义是一数据构,定在 。 struct kobject const char * k_name;/*kobject 的名字数组(sysfs 入口使用的名字)指

6、针;如果名字数组大小小于 KOBJ_NAME_LEN,它指向本数组的 name,否则指向另外分配的一个名字数组空间 */ char nameKOBJ_NAME_LEN;/*kobject 的名字数组,若名字数组大小不小于 KOBJ_NAME_LEN,只储存前 KOBJ_NAME_LEN 个字符*/ struct kref kref;/*kobject 的引用计数*/ struct list_head entry;/*kobject 之间的双向链表,与所属的 kset 形成环形链表*/ struct kobject * parent;/*在 sysfs 分层结构中定位对象,指向上一级 kset

7、中的 struct kobject kobj*/ struct kset * kset;/*指向所属的 kset*/ struct kobj_type * ktype;/*负责对该 kobject 类型进行跟踪的 struct kobj_type 的指针*/ struct dentry * dentry;/*sysfs 文件系统中与该对象对应的文件节点路径指针*/ wait_queue_head_t poll;/*等待队列头*/ ; kobject 组设备结为简单计是成模型的基本构,初始它只被作一个的引用数, 时间但随的推 移,务现其任越来越多。在 kobject 处务码所理的任和支持代包括:

8、 对计象的引用数 对种计码该:跟踪象生命周期的一方法是使用引用数。当没有内核代持有 对时象的引用, 该对结删象将束自己的有效生命期并可被除。 sysfs 表述:在 sysfs 现每对对应中出的个象都一个 kobject, 创它和内核交互来见建它的可 表述。 结关联数据构:整体来看, 设备复杂结过间链模型是一个极端的数据构,通其的大量接而构 层结成一个多次的体系构。kobject 实现该结了构并将其聚合在一起。 热处插拔事件理 :kobject 统产热户间子系将生的插拔事件通知用空。 一个 kobject对兴义级对连设备自身并不感趣,它存在的意在于把高象接到模型上。因此内码核代很少(甚至不知道)

9、创 单建一个独的 kobject;而 kobject 对被用来控制大型域 (domain关对访问)相象的,所以 kobject 结被嵌入到其他构中。kobject 可被看作一个最顶层类类产的基,其他都它的派生物。 kobject 实现对了一系列方法,自身并没有特殊作 对对用,而其他象却非常有效。 对给于定的 kobject针指,可使用 container_of结针宏得到包含它的构体的指。 kobject 初始化 kobject 初始化 kobject较为复杂的初始化,但是须步骤必的如下: (1)将整个 kobject 清零,通常使用 memset 函数。 (2调)用 kobject_init(

10、)设结员设函数,置构内部一些成。所做的一件事情是置 kobject 的引计为用数1码。具体的源如下: void kobject_init(struct kobject * kobj)/*in kobject.c*/ if (!kobj) return; kref_init(/*设置引用计数为 1*/ INIT_LIST_HEAD(/*初始化 kobject 之间的双向链表*/ init_waitqueue_head(/*初始化等待队列头*/ kobj-kset = kset_get(kobj-kset);/*增加所属 kset 的引用计数(若没有所属的 kset,则返回 NULL)*/ voi

11、d kref_init(struct kref *kref)/*in kobject.c*/ atomic_set( smp_mb(); static inline struct kset * to_kset(struct kobject * kobj)/*in kobject.h*/ return kobj ? container_of(kobj,struct kset,kobj) : NULL; static inline struct kset * kset_get(struct kset * k)/*in kobject.h*/ return k ? to_kset(kobject_g

12、et(/*增加引用计数*/ (3设)置 kobject 的名字 int kobject_set_name(struct kobject * kobj, const char * fmt, .); (4间设员)直接或接置其它成:ktype、kset 和 parent。 (重要) 对计对计引用数的操作 引用数的操作 kobject 为结设计对这对计的一个重要函数是包含它的构置引用数。只要个象的引用数存在, 这对个象( 码和支持它的代) 须继续层必存在。底控制 kobject 计的引用数的函数有: struct kobject *kobject_get(struct kobject *kobj);/

13、*若成功,递增 kobject 的引用计数并返回一个指向 kobject 的指针,否则返回 NULL。必须始终测试返回值以免产生竞态*/ void kobject_put(struct kobject *kobj);/*递减引用计数并在可能的情况下释放这个对象*/ 注意:kobject _init 设置这个引用计数为 1,因此创建一个 kobject 时, 当这个初始化 引用不再需要,应当确保采取 kobject_put 调用。同理:struct cdev 的引用计数实现如 下: struct kobject *cdev_get(struct cdev *p) struct module *o

14、wner = p-owner; struct kobject *kobj; if (owner kobj = kobject_get( if (!kobj) module_put(owner); return kobj; 创建一个对 cdev 结构的引用时,还需要创建包含它的模块的引用。因此, cdev_get 使用 try_module_get 来试图递增这个模块的使引用计数。如果这个操作成功, kobject_get 被 同样用来递增 kobject 的引用计数。kobject_get 可能失败, 因此这个代码检查 kobject_get 的返回值,如果调用失败,则释放它的对模块的引用计数

15、。 release 函数和 kobject release 函数和 kobject 类类型 型 引用计数不由创建 kobject 的代码直接控制,当 kobject 的最后引用计数消失时,必须异 步通知,而后 kobject 中 ktype 所指向的 kobj_type 结构体包含的 release 函数会被调用。 通常原型如下: void my_object_release(struct kobject *kobj) struct my_object *mine = container_of(kobj, struct my_object, kobj); /* Perform any additional cleanup on this object, then. */ kfree(mine); 每个 kobject 必须有一个 release 函数, 并且这个 kobject 必须在 release 函数被调用前 保持不变( 稳定状态 ) 。这样,每一个 kobject 需要有一个关联的 kobj_type 结构,指 向这个结构的指针能在 2 个不同的地方找到: (1)kob

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

当前位置:首页 > 行业资料 > 其它行业文档

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