ldd随笔(1)-linux设备模型

一下只是个人学习后的理解,可能有很多不对的地方。

要学习linux的设备驱动模型,首先必须要知道kobject和kset的概念,下面是kobject在2.6.38的源码中的实现。

struct kobject {const char      *name;      //名称,可能在sysfs中创建对应的目录struct list_head    entry;    //标准链表,用于被kset连接起来struct kobject      *parent; //指向父kobject的指针struct kset     *kset;         //指向所属的kset的指针struct kobj_type    *ktype; //包含的kobj_type, 用指向不同的ktype来表示不同的objectstruct sysfs_dirent *sd;      //在sysfs中创建目录时用到的结构struct kref     kref;           //引用计数unsigned int state_initialized:1;unsigned int state_in_sysfs:1;unsigned int state_add_uevent_sent:1;unsigned int state_remove_uevent_sent:1;unsigned int uevent_suppress:1;
};

kobject里面比较重要的一个是kobj_type结构的指针:

struct kobj_type {void (*release)(struct kobject *kobj);  //当此kobj被完全释放(引用为0)时调用const struct sysfs_ops *sysfs_ops;  //与sysfs相关的操作struct attribute **default_attrs;  //代表了一系列属性。const struct kobj_ns_type_operations *(*child_ns_type)(struct kobject *kobj);const void *(*namespace)(struct kobject *kobj);
};

kobject中的ktype指向不同的kobj_type可以代表着不同的类型,以及所执行的不同操作。kobject可能在sysfs中表现为一个目录,而它指向的kobj_type中包含的一系列struct attribute则代表着这个目录下的文件。每一个属性对应了一个文件,可以设置它的读写权限,名称(文件名)还有就是当读或者写这些文件时,调用的show和store函数。可以利用这些属性文件,进行信息的展示和配置的修改等。

kobject只是代表着某个结点,并不能构成特定的结构,所以还存在一个kset,使得它们可以构成一个树状结构。kset的实现如下:

struct kset {struct list_head list;  //链表头,用以将下层的kobject串起来spinlock_t list_lock;  //链表的锁,只能串行操作struct kobject kobj;  //kset包含一个kobjectconst struct kset_uevent_ops *uevent_ops;  //为了支持热插拔所提供的结构
};

kset里面包含了一个kobject,而不止是一个指针。所以可以把kset看成是一个kobject的扩展,所有对kobject的操作,都适用与kset(操作其中的kobject,但是内核为kobject和kset分别提供了一套类似的操作)。如果用C++表述,kobject就是一个基类,而kset是它的派生类。kset可以通过它的list包含住很多子kobject,而这些子kobject又可以通过parent和kset指针指向它的父kobject(kset);并且kset也是(包含了)一个kobject,所以它还可以被其它的kset当做子kobject。这样就构成了一个树状结构,其中kobject是叶子结点,而kset是非叶子结点或者根结点,正好和目录与文件的关系类似。目录本身是一个文件,但是它可以包含其它文件或目录,同时又被其它目录含(根目录除外)。所以sysfs中的文件结构通常对应了内核中的kobject结构。每一个目录代表一个kobject(或者kset),而此目录里面的子目录又代表了这个kobject下面的子kobject,目录里的文件代表了kobject的一系列属性。

而kset_uevent_ops(对应老版内核中的hotplug,热插拔)指向了一组操作,包括过滤,热插拔等,当往一个kset中添加新的kobject时,便会触发这些操作,首先会调用filter表示是否过滤这个事件,然后在调用热插拔处理函数来向环境变量里添加值,从而达到通知用户空间的目的。假如次kset没有设置这个uevent_ops指针,便会往它的父kobject迭代查找,直到找到为止(若到根kobject都没有,就忽略)。再进行调用。

kobject通常不单独使用,而是嵌入到其他结构,代表就是pci core和usb core,它们是内核提供的,利用kobject来构造的树状结构驱动框架。

linux内核利用以上的框架,包装出了三个概念,那就是总线,设备,和驱动。总线可以看成是树状结构中的非叶子结点(包括根结点),设备和驱动可以看成其中的叶子结点;当有设备插入,便可利用上面uevent_ops的机制,添加环境变量,然后调用udev(hotplug)来判断插入设备的类型,然后根据类型查找modules.***map表,找到合适的驱动程序,加载其入内核;当驱动程序加载到内核的时候,同样会想总线注册,也会激活uevent_ops的操作,这时系统会对设备和驱动进行匹配,若匹配正确,就会调用驱动程序里的probe函数。当设备取下时,系统会调用驱动程序的remove函数。这样就可以支持热插拔。

linux内核还提供了usb和pci等总线的抽象,它们是在bus,device和driver之上进行进一步的包装。内核已经把总线和设备的部分完成了,驱动作者只需要关注驱动程序的实现即可。例如,linux内核提供的usb core已经完成了usb的大部分工作,包括总线驱动,以及usb框架,还有设备的识别和初始化等,以及设备和驱动之间进行通信的urb方式,甚至还包含了大部分设备的驱动程序,但是有的设备驱动内核并没有。我们会在windows经常看到一种情况,某个设备被识别了,但是没有驱动程序而不能被使用,其中识别出设备就是内核所完成的,而这样的驱动往往就必须由设备提供者自己实现了。总之在内核抽象出一套驱动框架之上,驱动作者可以免去很多的工作。

转载于:https://www.cnblogs.com/xien7/archive/2013/02/03/2890577.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/274366.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

插图 引用 同一行两个插图_提出食物主题中的插图

插图 引用 同一行两个插图I have a page in my portfolio, which is about search functionality. I wanted that page to feel fun and engaging, to convey a positive vibe, so I decided to add illustrations to it.我的投资组合中有一个页面与搜索功能有关。 我希望该页面…

Hadoop的SequenceFile读写实例

1 SequenceFile可以处理hdfs上大量小文件,它可以作为大量小文件的容器。HDFS和MapReduce是针对大文件优化的,所以通过SequenceFile类型将小文件包装起来可以获得更高效的存储和处理。存储2 在SequenceFile中的键和值并不一定是Writable类型&#xff…

脸部细微表情识别_您可以仅使用面部表情来控制字体吗?

脸部细微表情识别原型 (The prototype) Facetype is the name of Adam’s interactive project, in which the emotions detected from a person’s facial gestures control a variable font. To each detected emotion corresponds a specific typeface, which keeps transfo…

ssky-keygen + ssh-copy-id 无密码登陆远程LINUX主机

使用下例中ssky-keygen和ssh-copy-id,仅需通过3个步骤的简单设置而无需输入密码就能登录远程Linux主机。 ssh-keygen 创建公钥和密钥。 ssh-copy-id 把本地主机的公钥复制到远程主机的authorized_keys文件上。ssh-copy-id 也会给远程主机的用户主目录(ho…

uva10891Game of sum

题意:经典的取石子游戏是这样的:有一堆石子,A、B两个人轮流取,每次取一颗,只能从边上取,每个石子有相应的价值,A、B两人都想使得自己的价值最多,两个人足够聪明,问最后价值分别是多少 本题则是可…

用户体验设计师能为seo做_用户体验设计师可以从产品设计历史中学到什么

用户体验设计师能为seo做Many things have changed from tool design in the prehistoric era to today’s digital product design. However, we can see surprisingly many similarities. Especially when it comes down to one particular aspect: usability.从史前时代的工…

函数指针

顾名思义,指针函数即返回指针的函数。其一般定义形式如下: 类型名 *函数名(函数参数表列); 其中,后缀运算符括号“()”表示这是一个函数,其前缀运算符星号“*”表示此函数为指针型函数,其函数值为指针,即它…

orton效果_如何使图片发光:Orton效果

orton效果Have you ever seen an impossibly dream-like landscape photo? One with a slow burning, glowing sunset. That’s really the best way to describe it, the image looks as if it’s glowing. You might be thinking, “wow, I wish I was that good and could …

UVA10785 The Mad Numerologist

虽然是sorting的压轴,但是比起前面真心水题。这个专题结合前面string的很多,排序相对简单了,qsort基本解决。 题目: The Mad Numerologist Numerology is a science that is used by many people to find out a mans personality,…

苹果人机交互指南_苹果人机界面设计指南的10个见解

苹果人机交互指南重点 (Top highlight)I’ve been developing an IOS app for the past few months and have been constantly referring to Apple’s Human Interface Design Guidelines. I would consider it a must-read for any aspiring or current UI/UX designer.在过去…

也来学学插件式开发

上一家公司有用到插件式开发来做一个工具箱,类似于QQ电脑管家,有很多工具列表,点一下工具下载后就可以开始使用了。可惜在那家公司待的时候有点短,没有好好研究一下。现在有空,自己在网上找了些资料,也来试…

同态加法_我对同态的想法

同态加法Early February, I uploaded this shot onto Dribbble. Nothing fancy –– just two screens experimenting with “2月初,我将这张照片上传到Dribbble。 没什么幻想–只有两个屏幕在尝试“ Neumorphism,” or soft UI. Little did I know that this post…

php内核探索

引自:http://www.nowamagic.net/librarys/veda/detail/1285 SAPI:Server Application Programming Interface 服务器端应用编程端口。研究过PHP架构的同学应该知道这个东东的重要性,它提供了一个接口,使得PHP可以和其他应用进行交互数据。 本…

hp-ux锁定用户密码_UX设计101:用户研究-入门需要了解的一切

hp-ux锁定用户密码这是什么? (What is this?) This session is part of a learning curriculum that I designed to incrementally skill up and empower a team of Designers and Researchers whose skillset and ways of working needed to evolve to keep up wi…

等比数列前N项和的公式推导

设等比数列的前n项和为S(n), 等比数列的第一项为a1,比值为q。 (1)S(n) a1 a1 * q a1 * q ^ 2 .... a1 * q ^ (n - 1);(2)S(n1) a1 a1 * q a1 * q ^ 2 .... a1 * q ^ (n - 1) a1 * q ^ n;由(2&am…

extjs6 引入ux_关于UX以及如何摆脱UX的6种常见误解

extjs6 引入uxDo you ever browse social media, internet, or talk to colleagues and hear them say something UX related you disagree with so much that you just want to lecture them on the spot?您是否曾经浏览过社交媒体,互联网或与同事交谈&#xff0c…

Cocos2D-HTML5开源2D游戏引擎

http://www.programmer.com.cn/12198/ Cocos2D-HTML5是基于HTML5规范集的Cocos2D引擎的分支,于2012年5月发布。Cocos2D-HTML5的作者林顺将在本文中介绍Cocos2D-HTML5的框架、API、跨平台能力以及强大的性能。Cocos2D-HTML5是Cocos2D系列引擎随着互联网技术演进而产生…

illustrator下载_Illustrator笔工具练习

illustrator下载Adobe Illustrator is a fantastic vector creation tool and you can create a lot of things without ever using the Pen Tool. However, if you want to use Illustrator at its full potential, I personally believe that you need to master and become …

怎么更好练习数位板_如何设计更好的仪表板

怎么更好练习数位板重点 (Top highlight)Dashboard noun \ˈdash-ˌbȯrd\ A screen on the front of a usually horse-drawn vehicle to intercept water, mud, or snow.仪表盘 名词\ ˈdash-ˌbȯrd \\通常在马拉的车辆前部的屏幕,用来拦截水,泥或雪。…

学习正则表达式

deerchao的blog Be and aware of who you are. 正则表达式30分钟入门教程 来园子之前写的一篇正则表达式教程,部分翻译自codeproject的The 30 Minute Regex Tutorial。 由于评论里有过长的URL,所以本页排版比较混乱,推荐你到原处查看,看完了如果有问题,再到这里来提…