LDD3学习笔记设备模型之底层实现.pdf

LDD3学习笔记设备模型之底层实现.pdf

ID:57337983

大小:591.81 KB

页数:11页

时间:2020-08-12

LDD3学习笔记设备模型之底层实现.pdf_第1页
LDD3学习笔记设备模型之底层实现.pdf_第2页
LDD3学习笔记设备模型之底层实现.pdf_第3页
LDD3学习笔记设备模型之底层实现.pdf_第4页
LDD3学习笔记设备模型之底层实现.pdf_第5页
资源描述:

《LDD3学习笔记设备模型之底层实现.pdf》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、LDD3学习笔记设备模型之底层实现(kobject,kset)写在前面的一些话:LDD3使用的内核版本是2.6.11,很多数据结构随着内核版本的改变也发生了变化。我是依据自己系统的内核版本来学习的。所以在笔记中的一些数据结构及一些函数发生变化时不要惊讶,它不是一个bug,呵呵。尽管我们的出发点在底层,但我们有必要先来粗略了解一下高层的视图。linux设备模型的基本组成结构:类型所包含的内容对应内核数据结构对应/sys项设备设备是此模型中最基本的类型,structdevice/sys/devices/*/*/.

2、../(Devices)以设备本身的连接按层次组织设备驱动在一个系统中安装多个相同设备,struct(Device/sys/bus/pci/drivers/*/只需要一份驱动程序的支持device_driverDrivers)总线类型在整个总线级别对此总线上连接structbus_type/sys/bus/*/(BusTypes)的所有设备进行管理这是按照功能进行分类组织的设设备类别备层次树;如USB接口和PS/2(Devicestructclass/sys/class/*/接口的鼠标都是输入设备,Class

3、es)都会出现在/sys/class/input/下说明:任何设备要与系统交互,必须通过总线来接连,设备本身要工作又必须要有设备驱动的支持,把设备分门另类,可以更好地组织,更迅速地处理设备。为了把这些基本组成结构组织成统一的设备模型,内核在真正实现时是通过kobject和kset这两个底层的数据结构来完成。先上一个图来说明这它们的关系kobject是一种数据结构(include/linux/kobject.h):viewplaincopytoclipboardprint?1.59structkobject{2

4、.60constchar*name;3.61structlist_headentry;4.62structkobject*parent;5.63structkset*kset;6.64structkobj_type*ktype;7.65structsysfs_dirent*sd;8.66structkrefkref;9.67unsignedintstate_initialized:1;10.68unsignedintstate_in_sysfs:1;11.69unsignedintstate_add_ueve

5、nt_sent:1;12.70unsignedintstate_remove_uevent_sent:1;13.71unsignedintuevent_suppress:1;14.72};在理解这些数据结构成员的时候要与设备模型提供的任务联系起来理解,因为它们就是设备模型的底层实现,代表着设备模型实现任务。下面要介绍的kset也是一样的。其中structkref内含一个atomic_t类型用于引用计数,对对象生命周期进行控制。parent是指向父节点的指针,实现设备模型的分层结构entry用于父kset以链表

6、头结构将kobject结构维护成双向链表;name是对象的名字。嵌入的kobject一个kobject对自身关不感兴趣,它存在的意义在于把高级对象连接到设备模型上。高级对象包括:总线,设备,设备驱动等。要把它们抽象起来,组织成一个模型,把必须要有一个中间物,这个中间物就是kobject。为此,kobject总是被嵌入到这些高级对象中,很少有一个单独的kobject对象。理解这个对于理解设备模型很重要,具体的参考LDD3的说明。针对kobject的函数代表嵌入它的其他对象去完成任务。kobject的初始化对ko

7、bject的初始化有一些步骤是必须的:1、将整个kobject设置为0。通常使用memset函数,而且通常是在分配包含kobject的结构时进行的。如果忘记对kobject的清零,以后使用它有可能会发生一些奇怪的错误,所以这一步是必须的。2、调用kobject_init()函数,以便设置结构内部的一些成员。随着内核版的更新,这个函数也发生了变化,但其所做的工作基本上没发生什么变化。请自己查看kobject_init()的实现。它所做的一件事情是设置引用计数为1。现在,这个函数的样子是:viewplaincop

8、ytoclipboardprint?1.externvoidkobject_init(structkobject*kobj,structkobj_type*ktype);多了个ktype参数,关于kob_type后面再说。3、设置kobject的名字,这是在sysfs入口中使用的名字。这个函数有内核文档说它已经被移除,但这个函数还是存在着。也许这步已经不再是初始化必须了。viewplaincopyt

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。