特 别 声 明 本系列文章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行。。这个才是这个函数的主角啊。。前面那个都是浮云。。佛曰:进去
尼玛。这不是坑底吗?有点儿长了。。一下截图不行了。。