linux设备驱动模型大剖析(1)-----底层阶级的程序猿

 

特 别 声 明 本系列文章bingqingsuimeng著作权所有,转载请注明出处  http://blog.csdn.net/bingqingsuimeng/ 

linux设备驱动交流:qq群:257970754

                  话说,东汉末年分三国,分不清对对错错。反正是我们看到了三足鼎立的大好场面。当年的手机行业又何尝不是呢?苹果作为“魏国”实力非比寻常啊,而江南英杰谷歌andorid“吴国”也雄踞一方,弱弱的微亚(微软+诺基亚)还在做着垂死挣扎。难道winphone8真的要成扶不起的阿斗?哎,不管怎样,大国的繁荣,靠着是我们这个底层的小小程序员做的贡献。可是山层的繁华看惯了,谁会关心社会的底层,又有谁能安下心,可以从事物的背后去看清真个世界的面貌?

          作为一个21世纪的三俗青年,作为一个励志要选好linux设备驱动的程序员,我们有必要对linux设备驱动模型中的底层实现做一个详细的分析。而我,便从这无聊的日子中,肩负起了探索的使命,纵然前方无数艰难险阻,我知道,既然已经出发,就没有回头路。

           我们要讨论的是linux设备驱动模型中的底层,kobject,kset..作为一个知道面向对象的程序员,我知道linux内核这么一个大的工程如果不用面向对象的设计思想来设计,估计它早就被淘汰了。好了,咱们开始吧。就把他们想象成一个个基类,看看那些大侠们是怎么实现的。

            说一下,咱们这次用的是linux3.4的版本,什么?你问哪个文件?好找,kobject.c

            

            这就是传说中的设备驱动模型中的那个基类,虽然是底层的程序猿,但假日时日,必将为社会主义现在化做出重大贡献啊。所以人不可貌相这就话还是非常有意义的。

           62 行  我去。。名字,程序员的名字,就像我等小辈没人一个名字,标识一下自己。

           63 行  链表,就是传说中的内核中的那个双向链表,很神通广大,哪都能看到它,之所以这个基类里有一个链表,额。。就像,公司里把各个程序员链接起来,到时候发工资的时候遍历一下,谁是挂在本公司上的程序员,就给谁发工资。

           64行 parent,父设备,额。。这个,其实就是你的上一级,就像我们最底层的程序员都会有经理或者leader管着,当问题出现时,可以通过经理找到我们每个人身上。

           65行 我去。。这个也好理解。。每个程序员都会有一个部门吧,就想做应用的,做ui的,做驱动的,物以类聚,人以群分。

           66行 由名字我们大概可以理解,这是kobject的类型,就像每个设备都有所属的bus_type一样。额。。你不懂?好吧。。咱慢慢来。。对于难理解的东东必杀绝招就是,闪人,掠过。。作为一个21世纪的有为青年,这个难题咱们稍后再探讨。 

           67 sysfs_dirent sysfs文件系统相关的,光sysfs文件系统就太多了,如果你有强大的好奇心,可以先看看linux那些事儿的介绍,垫垫底儿,咱们这儿暂时飘过。

           68 kref,这就是大名顶顶的引用技术,这个思想的发明者真是牛x啊,他为智能的内存管理做了多大贡献啊,通俗点儿将就是,只要这个结构体有人在使用,就将其加1,不用了就减去1,等到减到0的时候,也就释放了额,这个在现实生活中很常见啊。你就像,超级女生,凤姐这都一样,哪个媒体觉得要赚一把噱头,就大书特书一番,实际上就是占了一个引用计数,等到不用了,就抛到脑后了,就是减少了引用计数,等到所有人都不用了,她也就淡出了人们的视线,退出了历史舞台。

           69-73 都是一些标志位,看单词意思就很明显了,分别是已经初始化的状态标志位,在 sysfs文件系统中的状态标志位,剩下的是热插拔相关的三个标志位。如果是热插拔中的“插入”事件,则state_add_uevent_sent置为1,如果是“拔出”事件,state_remove_uevent_sent置为1,如果你想屏蔽或者抑制本次事件,uevent_suppress置为1

          什么?你问还有些什么事件?我去。。你真够有探索精神的,好吧。。it is here!

           

           好了,程序员都让你看光了,什么?你在叹息不是个女程序员?我去。。好吧。。我承认你也是个三俗青年。

           不过,好想还有点儿一游未尽,有几个地方没深入?想想也是哈?

            65行的kset是个struct kset,就是所谓的组,就是刚才说的那个部门。好吧,既然来了,咱们就去访问一下他老人家。

           

           内核这样评价它:结构体kset是一些列特殊的kobject的集合,属于一个特殊的子系统一个kset定义了一个kobject组,他们可以是不同的"types",但是所有的这些kobject都想被集合到一起,并且通过同样的方式被操作。kset通常。

           我去,它又没去世,内核就开始评价他了,又不想最近猝死酒店的央视评论员,死了都稀里糊涂的。

           唉,死者安息,活着的人继续奋斗吧,因为没事情做的日子也会无聊死的。
定义属性回调和一些其他发生在kobject上的共同事件

           正像,单个程序员必定要依靠团队才能成就伟业,这个kset就这么出现了。

           光看程序员这些仅有的财产了,总说程序员程序猿的,他们到底怎么就为社会主义现在化做了突出贡献呢?好吧,原谅你了,为了简单起见,咱们也看看这些底层的程序员是怎样工作的 。上例子。

           

         117行 kobject_create_and_add看函数名字就知道,这个函数完成两个功能一个是kobject的创建,一个是添加

 ,再来看它的参数   struct kobject *kobject_create_and_add(const char *name, struct kobject *parent),一个是创建的kobject的名字,一个是它的父kobject,哎,这何尝不像程序员的出生啊,你出生了总得有起个名字吧, 怎么也得知道你的父母是谁吧?大多数正常的程序员还是有这两项技能的。咱们进去看个究竟

                   我去。。很明显,就是两个函数。。现在暗喜一下吧,在没有进入到复杂的时刻,总得让人乐乐吧

          话说用途很明显的话,不应该有什么警告的啊,除非你的目的非法,就想咱们这里,如果add不成功肯定会警告你的。但是,你说最近中国飞往美国的飞机,又不是第一次飞了,怎么中途还能遇到美国的警告呢?我去了。。世界大了,什么事儿都有!说不好哪天飞来一个洲际弹道导弹打到北京,美国从此就可以无所顾忌的当世界警察了。

         652行,kobject_create,进入。。看个究竟。。

          

         其实,看这块儿代码我最高兴了。内核里每个函数如果都是这么简单该多好啊。。

          626行 kzalloc分配一个块儿空间,类似用户空间的malloc加memset置为0,好理解

          630行 kobject_init,我去。。看来这个创建不只是管创建,连初始化都给做了。如果要是去菜市场买菜,他都管做成热菜那该多好啊。没说的。。进入。。

          

            274行,如果创建没有成功,还初始化个什么劲,直接返回错误

            278行,看到没有ktpe就是咱们有意无意给掠过的kobject结构里那个struct kobj_type *ktype成员,话说每个kobject都会有一个ktype,就像每个程序员都会有自己的脾气,自己的习惯,并不是木头人的。程序员要有,kobject也要有。如果你没有,那不好意思 返回吧,木头人公司都不要。

            282 如果你都初始化过了。那你来这费什么劲,打印出错警告

            前边的判断都是为后来的实际初始化做铺垫啊。。真正的主角是kobject_init_internal,记得在以前的版本中,这个函数的内容都在在kobject_init做的,可见内核为了增强健壮性。。在日益进步啊。。进入

            

            149行,初始化引用计数为1     

            150行,初始化链表

             151-154这几个标志在前面我们已经介绍过了。这里就不多说了,如果你忘了,就回去看看。。温故而之心啊。说一点儿,这里标记了一下已经初始化完了。

           好了,回到上一层kobject_init

           290行,给这个kobject附上ktype它也就这么匆匆的结束了自己的生命。于是,我们看到这个kobject_init无非就是将kobject中的成员都做了一个基本的初始化,就像一个程序员有了一个基本的模样

            回到kobject_create,我们看到他的使用也完成了。无非就是非配了一个块儿区域给这个kobject,然后对它的成员做了一些基本的初始化。

            于是我们又回到了kobject_create_and_add

             656行,kobject_add,这个又是很等神圣,咱进去看看啊。。

             

       我去。。还这个变餐。。小样,别以为你穿上马甲就没人认识你啊。。我们一看就看出了其中的猫腻,关键函数是kobject_add_varg,走,进去看看。。

         

        厄迷拖佛。。佛说,让咱们适可而止,有天机不可泄露的东西就不要跟踪了。就想这个kobject_set_name_vargs,一句话,就告诉你把刚才传进来的name给kobject附上值了

         309告诉它它的父亲是谁。。

         310行。。这个才是这个函数的主角啊。。前面那个都是浮云。。佛曰:进去

         尼玛。这不是坑底吗?有点儿长了。。一下截图不行了。。 

         

         

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bingqingsuimeng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值