有矢而发,触类旁通[内核学习的方法论]
有矢而发,触类旁通
--------------------------------------------------------------------------------
一.研究内核的目的
欲举其事,先正其道。要谈论内核的研读以及交流心得,前提必须得有一个恰当准确的目的,方能收获良多。
很多人都有这样一个疑惑,为什么要研究内核呢?我们又不是内核开发者(或许你将来就会成为Linus的助手:-)。此言差矣,众所周知,Linux包含两层含义,一是内核,二是发行版本,前者乃核心精华,后者则是应用方案,二者皆不可废。知前者而略后者,思而不学也;略前者而知后者,学而不思也。
学习是循序渐进的,我们学习Linux,首先接触的就是各具特色的发行版本,简单轻松地入门,在学习的过程中逐渐对Linux框架有了一个初步的认识,浅白地说,就是懂得了Linux世界的游戏规则。在你自身能力提高的同时,你会发现,进步的速率似乎在下降,为什么呢?那是因为你开启的只是自己的记忆力而非智力,游戏规则是核心的高层封装,它给予用户乃至程序员的接口是友好的(相信很多人都陶醉于unix的工具哲学吧),而这类接口经多年的黑客熏陶,已经变得十分成熟,我等只需识记便可。举个例子吧,发行版本之间最大的差异就是它们各自的FHS(文件目录框架)以及软件包管理机制,如gentoo的portage(port树)以及emerge,再如Debian的apt-get,用户只要精通此二处,即可在该发行版本的世界里驰骋无束,而精通的途径却都一样,那就是识记规则。当你已经对这些规则滚瓜烂熟时,你会发现,自己只是从用户角度看问题,而不是从开发者的角度看问题,两者的差异在于你在Linux世界里是否具有创新力。
对比国内外的Linux开源社区,不难发现,我们的水平依然很低,很多创新点都是外国开源社区所占据的,我们只能跟着走,处于被动的局面。还是举例来说明问题吧,比如你是一个lfs爱好者,初学者则按lfs文档行事,而老鸟们呢,则参阅lfs hints来改造自己的系统,殊不知,此二者都非国人所力,lfs文档是外国人开发的,lfs hints也是外国人写的。在这里并不是说我们不应该引进技术,而是从中看到,我们的确缺乏创新力;再比如新内核采纳的udev(大家应该不会陌生吧),它只是一个逻辑I/O层规则,乃是devfs进化而来,大家同在开源社区下学习,为什么外国人能思考出创新的udev呢?归根到底,那是我们不重视最底层的研究,立足于高层封装看问题,与使用微软的玩具软件何异?我们老是谈论要自己的发行版本,可是有没有想过,发行版本不仅仅是把现成的内核用shell和X包装起来而已,如果是这样的话,redhat也不会成为世界上最流行的发行版本之一(redhat在开源社区大多数项目中都占有一席位,每每以创新技术来退出新的发新版本)。
可见,立足于内核看问题,目的有二:
1.学一当十,把握创新的主动权
2.知其然而知其所以然,从深层次理解Linux,使之在发行版本的日常操作能触类旁通,游刃自如
二.研究内核的境界
读-->练-->开发
现在国人研读内核的境界大多在于读(包括我自己:-),而我们的最终境界是开发,也就是成为内核的开发者之一,这样才真正使中国的Linux事业独立自主!
三.研究内核的态度
Linux内核发展了十年有余,体系变得十分庞大,可谓盘根错乱,我们读它,往往很难直接掌握全局,结合我们的实际情况,最好是从日常使用Linux发行版本的过程中,遇到一些很奇妙的问题,就应该结合它来研读内核的相关项,触类旁通。比如说,开机遇到kernel panic的问题,我们就应该找到,在init/main.c中的init函数就有这样一句话,然后顺着这个思路找出解决办法,最终发现原来必要的文件系统模块必须编译进内核(自举性矛盾),又比如说,我们要改造发行版本的运行级别脚本,就应该注意到,有些脚本是运行在内核态的(如linuxrc),大多数脚本是运行在用户态的(rcX.d),了解了大方向,就好编码了。
游击散打,逐渐包围大中心
当然,内核研读还得有好用的工具辅助才行,还要有资料(站在巨人的肩膀上,看得更远嘛),这些我都会用置顶帖给出。
有矢而发,触类旁通。希望大家多多交流,共同进步。
=======================================================================
看着这篇贴子 还转 真有点违背了贴子的原意, 算是给自己日后想在看了看吧……