Linux内核(9) - 精华版 之 方法论
到目前为之,博客上分享的精华篇都可以归为方法论的范畴,在很多时候,都是方法论要比细节紧要得多。而这些精华篇又可细分为三个专题:Linux大史记;内核学习的方法论;驱动开发的方法论。
Linux大史记
除去那些精彩的“门”,我们生活中乏味的事情太多了,所以不希望再去按惯例花个一二页的篇幅乏味的写个“Linux简介”,就将几天中出去溜弯的时间贡献了出来,逐年逐月的搜集整理了一些Linux成长过程中所发生的重要的事情,抑或一些非常有趣儿的事情。
开始时本以为这是一件很轻易的事,起码应该比统计公布房价上涨多少的事情轻易的多,利用google,完成这么一件事情又有何难?但是意外的是,貌似很难找到类似的归纳整理,或许能够看到某个时间段内的所谓的top10之类的字眼,但里面的罗列似乎大都满足不了有趣儿的要求。所以里面有些月份是个空白,不管如何,大家可以了解了解,看看是否有很多自己不知道的有趣闻轶事?
内核学习的方法论
透过现象看本质,兽兽门无非就是一些人体艺术展示。同样往本质里看过去,学习内核,就是学习内核的源代码,任何内核有关的书籍都是基于内核,而又不高于内核的。
所以这个专题的前三个精华篇就是专注于介绍如何入手分析内核源代码的,这里前无来者的突出强调了“Kernel地图”的概念,虽然Goggle带着Goggle地图远去了,可Kernel地图仍然在继续。
毫不夸张地说,Kconfig和Makefile是我们浏览内核代码时最为依仗的两个文件。基本上,Linux内核中每一个目录下边都会有一个Kconfig文件和一个Makefile文件。 对于一个希望能够在Linux内核的汪洋代码里看到一丝曙光的人来说,将它们放在怎么重要的地位都不过分。
我们去香港,通过海关的时候,总会有免费的地图和各种指南拿,有了它们在手里我们才不至于无头苍蝇般迷惘的行走在陌生的街道上。即使在内地出去旅游的时候一般来说也总是会首先找份地图,当然了,这时就是要去买了,拿是拿不到的,不同的地方有不同的特色, 只不过有的特色是服务,有的特色是索取。
Kconfig和Makefile就是Linux Kernel迷宫里的地图。地图引导我们去认识一个城市,而Kconfig和Makefile则可以让我们了解一个Kernel目录下面的结构。我们每次浏览kernel寻找属于自己的那一段代码时,都应该首先看看目录下的这两个文件。
既然要学习内核源码,就要经常对内核代码进行分析,而内核代码千千万,还前仆后继的不断往里加,这就让大部分人都有种雾里看花花不见的无助感。不过不要怕,孔老夫子早就留给我们了应对之策:敏于事而慎于言,就有道而正焉,可谓好学也已。这就是说,做事要踏实才是好学生好同志,要遵循严谨的态度,去理解每一段代码的实现,多问多想多记。如果抱着走马观花,得过且过的态度,结果极有可能就是一边看一边丢,没有多大的收获。
下面的分析,米卢教练说了,内容不重要,重要的是态度。就像韩局长对待日记的态度那样,严谨而细致。
只要你使用这样的态度开始分析内核,那么无论你选择内核的哪个部分作为切入点,比如USB,比如进程管理,在花费相对不算很多的时间之后,你就会发现你对内核的理解会上升到另外一个高度,一个抱着情景分析,抱着0.1内核完全注释,抱着各种各样的内核书籍翻来覆去的看很多遍又忘很多遍都无法达到的高度。请相信我!
让我们在Linux社区里发出号召:学习内核源码,从学习韩局长开始!
对于学习来说,无论是在学校的课堂学习,还是这里说的内核学习,效果好或者坏,最主要取决于两个方面——方法论和心理。注意,我无视了智商的差异,这玩意儿玄之又玄,岔开了说,属于迷信的范畴。
因此继介绍分析内核源码方法的三个精华篇之后,又针对内核学习过程中最为常见的两个心理误区做了阐述。
而心理上的问题主要有两个,一个是盲目,就是在能够熟练适用Linux之前,对Linux为何物还说不出个道道来,就迫不及待的盲目的去研究内核的源代码。这一部分人会觉得既然是学习内核,那么耗费时间在熟悉Linux的基本操作上纯粹是浪费宝贵的时间和感情。不过这样虽然很有韩峰同志的热情和干劲儿,但明显走入了一种心理误区。重述Linus的那句话:要先会使用它。
第二个就是恐惧。人类进化这么多年,面对复杂的物体和事情还是总会有天生的惧怕感,体现在内核学习上面就是:那么庞大复杂的内核代码,让人面对起来该情何以堪啊!
即使有好的方法和坚强的心理,我们在内核学习过程中仍需要利用很多好的资源。其实,韩峰同志已经在日记里告诉了我们资源的重要性,因此我们在学习韩峰同志严谨细致的态度同时,还要领悟他对资源的灵活运用。只有在以内核源码为中心,坚持各种学习资源的长期建设不动摇,才能达到韩局长那样的高度,俯视Linux内核世界里的人生百态。
待到山花烂漫时,还是那些经典在微笑。
驱动开发的方法论
因为至少在国内大部分内核相关的开发都是驱动的开发,所以在内核学习的方法论之后,专门用一个专题,从模块机制、设备模型、驱动三件宝三个层次介绍了驱动开发的方法论。
有一种感动,叫泪流满面,有一种机制,叫模块机制。显然,这种模块机制给那些Linux的发烧友们带来了方便,因为模块机制意味着人们可以把庞大的Linux内核划分为许许多多个小的模块。对于编写设备驱动程序的开发者来说,从此以后他们可以编写设备驱动程序却不需要把她编译进内核,不用reboot机器,她只是一个模块,当你需要她的时候,你可以把她抱入怀中(insmod),当你不再需要她的时候,你可以把她一脚踢开(rmmod)。
对于驱动开发来说,设备模型的理解是根本,毫不夸张得说,理解了设备模型,再去看那些五花八门的驱动程序,你会发现自己站在了另一个高度,从而有了一种俯视的感觉,就像凤姐俯视知音和故事会,韩峰同志俯视女下属。
顾名而思义就知道设备模型是关于设备的模型,既不是任小强们的房模,也不是张导的炮模。对咱们写驱动的和不写驱动的人来说,设备的概念就是总线和与其相连的各种设备了。电脑城的IT工作者都会知道设备是通过总线连到计算机上的,而且还需要对应的驱动才能用,可是总线是如何发现设备的,设备又是如何和驱动对应起来的,它们经过怎样的艰辛才找到命里注定的那个他,它们的关系如何,白头偕老型的还是朝三暮四型的,这些问题就不是他们关心的了,而是咱们需要关心的。在房市股市千锤百炼的咱们还能够惊喜的发现,这些疑问的中心思想中心词汇就是总线、设备和驱动,没错,它们就是咱们这里要聊的Linux设备模型的名角。
驱动开发三件宝:spec、datasheet与内核源码
设备模型之外,对于驱动程序的开发者来说,有三样东西是不可缺少的:第一是协议或标准的spec,也就是规范,比如usb协议规范;第二是硬件的datasheet,即你的驱动要支持的硬件的手册;第三就是内核里类似驱动的源代码,比如你要写触摸屏驱动的话,就可以参考内核里已经有的一些触摸屏驱动。
Linux内核问题门
继前面三个专题之后,为了感谢精华篇发布过程中很多朋友的关心与支持,便以“问题门”为题为拙作《Linux内核修炼之道》制作了一个小插曲,希望通过对大家内核学习过程中遇到的问题与经验心得做一番展示,来帮助还在门外的朋友寻找到这扇门的钥匙。
Linux内核问题门——学习问题、经验集锦(持续更新中……)
陈宪章说:“学贵有疑,小疑则小进,大疑则大进。疑者,觉悟之机也,一番觉悟一番长进。”
培根说:“多问的人将多得。”
还在学校的时候导师在激情讲演之后对着会议室里形态各异但均静默不语的我们痛心疾首的说:“会提问题很重要啊,同志们!不会提问题怎么有资格做研究!”
这样铿锵有力的训诫今日想起仍觉深受刺激,于是就要不可避免得要做出一些反应来。不过一是因为咱这年代还没有非主流的说法,二是因为也没有冯仰妍同学的性别优势,不可能受到刺激就整出个门来。咱能够做到的最大反应也就是在这里开贴专门探讨探讨内核学习的相关问题,为了稍微增加那么一些广告效应,就称为“问题门”吧。
使用“问题门”的称呼,一是内心里潜藏的那点低级趣味想去沾点近些年层出不穷各种各样的“门”的仙气,二是在内核的学习过程中的确实实在在的存在着这样的一个“门”,横亘在我们的面前,跨过去便海阔天空是另一番世界,但却是让无数人竞折腰,百思不得其钥匙。