陈莉君教授: 回望踏入Linux内核之旅(上篇)
初次踏入Linux
几多耕耘,几多收获,不小心在Linux这个自由王国畅游了多年。依稀记得刚进入这个世界时的那份恐慌和无知,更庆幸那时的无知无畏。在那个20世纪的最后一年,贸然带着几个弟子踏入一无所知的Linux世界。 1999年的那个春天,也是在讲授操作系统,只不过是鼓励大家参加我的兴趣小组。居然有10个人报名了(惊喜)。最初也无非是希望在课堂之外,让大家能够多接触一些东西,有点盲目,但大家兴致很高。在我们每周相约讨论的过程中,思路越来越多,机会之神也来光顾。人民邮电出版社希望就开源的Linux写一本分析其内核的书。从来没有写过书的我,敢承接吗?不知勇气从何而来,出版社约定我3个月拿出书稿,当时居然毫不犹豫地答应了。 这书该怎么写?从何入手?既然是分析内核源代码,那就从源代码开始阅读吧,于是,划分任务,给坚持下来的7个每人一部分内容。到我们兴冲冲地下载了源代码后才发现,这么庞大的源代码远不是我们能吃得动。真是自不量力!可有约在先,不做不罢呀。 那个炎热的假期,大家苦战的场面还历历在目。炎热无空调,小伙子们光着膀子端杯水,有的干脆晚上彻夜在干,累了就在水泥地睡一会儿。终于,在暑假快结束时,那本书总算草草封笔。之所以说草草,是因为,有太多的东西无法纳入书本,还有太多的内容,我们更没有一一理清楚。有点遗憾,有点不甘心,但时间有限,就那么交稿了。 2000年,《Linux操作系统内核分析》出版了,读者的好评扑面而来。有点惊讶,有点受宠若惊,更没有想到的是后来中科院指定该书为考博参考书。有份喜悦,更有份惭愧,总觉得那么不成熟的毛小孩受人尊敬有点不相称。 不仅仅是开源 在接触Linux之后,希望把这种开源文化传播给学生。每当第一次讲起Linux,我的第一个页面都是徐悲鸿的一匹奔放的马:【图略】
我会问学生,从这匹马中看到了什么,“自由奔放”,有的学生回答。其实,因为那一页的标题就是“Linux-自由而奔放的Linux黑马”,所以这样的回答,并没有新意。我再问他们为什么一匹画出来的马不同于一张拍照?这样的问题曾经是我思索而不得其解的。也是因为看到了徐悲鸿的马,才觉得答案就在眼前… 关于Linux,我总结成三句话“诞生于学生之手,成长于Internet,壮大于自由而开放的文化”,这几句话展开,可以写出若干页来,但简练的话更能让学生产生较强的记忆。 我在想,Linus在起初公布这个稚嫩的操作系统时,是否想到会被人嘲笑,是否会想到没有人会理会它,是否会想到一个错误百出的东西竟敢放在公共场所。也许,他只有一个理由,业余爱好做出来的东西,就是它了。喜欢者,尽管参与进来,不管你身处何地,也不管你技艺如何,做不了开发,可以找问题,bug找出来了,那也是一种贡献了。 我在想,是谁都那么主动的参与进去了?赫尔辛基大学的学生吗?也许,最初,只有他们才能访问到自己校园网的FTP服务器。当他们下载到这样一个还不成型的操作系统时,会是怎样一种行为,试试用?叫骂的帖子?找出bug贴出来?把自己的补丁打上去?也许,都有。但估计,有一种行为占据了上风:有人用了,有人找出bug了,更有人愿意把自己改写的代码也贡献出来,他们是谁呢。我在阅读源代码时,看到过这些人的Email地址。在源代码前面的注释部分,附上自己的Email,这是他们唯一呈现自己贡献的方式了。 我在想,开源世界五彩缤纷,为什么Linux这匹黑马奔跑不止呢?也许,有人说,垄断的Windows给了Linux竞争的场地。其实,这只是今天的Linux形成了足以压倒Windows的优势。在Linux还是摇摇晃晃的婴儿时呢?也许因为,它攀到好兄弟Unix,还有Linus本人的魅力和技术,也许更重要的是开源文化这片肥沃的土壤和场地。但,这些,好像还不是充足的理由… 我在想,Internet到底给人带来了什么。在这个开源的社区,我们感到的是一种平等,自由,开放,和谐的社会也不过如此吧。弗里德曼在《世界是扁平的》中描绘的全球化的三步中,是否解答了我的疑惑:第一步是由于航海的发展而利于强国侵略所形成的全球化;第二步是由于生产力和贸易的发展而形成的市场全球化;第三步则是近些年开始加速的通信的发展而形成的信息全球化。一些强国是要加强自己对于别国的强权,而全球化是打破这种强权的大趋势,是使那些强权的非中心化。 只是,弗里德曼站得更高, 而我常常会告诉学生,如果你喜欢权利或被奴役,那不要到这个社区来…
不知不觉,居然有很多本书从自己的手上脱稿而出。回想第一次欣然答应翻译《Understanding The Linux kernel》第一版时的茫然和兴奋。从来没有做过翻译的自己居然敢承担业界最有名的Linux内核书的翻译,因为无知,也就无畏了。当真正着手翻译时才发现,翻译远不是自己想象的那么简单。专业知识,英文底子,中文表述,哪一个也不能少。对第一版的倾情翻译完全出于当时那种对Linux内核的狂热。依然记得那些不知疲倦的日子,看着那一页页的英文被自己消化掉,再读着自认为还过得去的表述,更从作者对知识的组织和表达中学到不曾了解到的东西,可以说,整个翻译过程就在这种激情中悄然度过的。 现在都很惊讶自己独立翻译《ULK》第二版时的那种投入,找出第一版和第二版的差异就花去大量的时间。出版社总是给译者较为严格的时间界限,这让我除了吃饭就是翻译了。 出版社再找我翻译《ULK》第三版时,面对800多页的书,有点犹豫和退缩了。那些辛苦,兴奋,忘我的日子有点不敢回首了。但是,前两版的翻译,倾注了太多心血,又不舍得就这么把自己抚养的孩子送给别人。当我把这个想法告诉在全国操作系会上认识的张琼声老师(石油大学)时,她欣然答应,让我把关,她愿意接收继续翻译。她的认真和负责我是有所了解的,因此,还是答应了第三版的翻译。 一个春夏和暑假过去,又成了记忆中一段难忘的日子。经常为了一个词的准确翻译,在网上来回多次讨论,有时甚至快要吵起来了。但即使这样,当我们不得不按原定的日期交稿时,依然觉得有不少遗憾隐藏在译稿中,如果读者在阅读时,发现任何的bug,希望诚恳指出,发布出来,让更多的读者知晓。
Linux内核书籍点评
从99年开始带学生分析Linux内核,一路走来,积累了不少资料,也编写和翻译了近10本相关书籍,一直在摸索怎样才能使大家尽快走入内核,但似乎没有捷径。尤其是内核版本的不断更新,更是不少内核爱好者无所适从。 我们初次接触的内核资料是“The Linux Kernel”( kernelbook.sourceforge.net),介绍的是Linux2.0,尽管其中的内容过于概略,但其引导性的全面概述,使我们逐步找到了进入内核的入口。 依然记得“Concrete Architecture of the Linux Kernel”这篇文章,当我在网上查到这篇文章时,一遍遍的阅读之后,虽然还是朦朦胧胧的感觉,但这种高屋建瓴式的对内核的整体性把握,使得内核这个庞然大物有了骨架,这也符合了从整体入手,各个击破的思维模式。这篇文章对内核的分析采用了反向工程中自顶向下和自低向上的策略, 对内核这样一个没有起点,也没有终点的圆球,首先得找一个入口点。也许大家认为从进程入手是个不错的选择,但我们啃的第一块硬骨头是“Unix下保护模式的编程”,主要阅读其中的第四章,关于保护模式。 另外,我们经常阅读的资料还有Linux Kernel howto。其实,最直接的资料还是源代码以及其中的doc。我经常访问的源代码网站是lxr.linux.no,其进行了较大的调整,不仅有内核的每一版本的源代码,而且增加了不少的文档。 我们的第一本书《Linux操作系统内核分析》在2000年出版后,很多读者给予认可。我想这可能因为,在本书的编写过程中,我们没有拘泥于任何框框,只是把我们在分析2.0内核时,阅读的相关资料以及自我认识,比较原始的展现出来。尽管书所涵盖的内容远非我们曾经设想的,但对入门而言,可以让读者少走不少弯路。 本书之后,我们翻译了内核红宝书《Understanding The Linux Kernel》(已经出版了三版),在本书的翻译过程中,我时不时有插入源代码的愿望,也就是说,本书的原理和叙述比较顺畅,但如果没有源码在手,有时如坠雾里。因此建议,本书的阅读,尽量要与源码结合。 在这之后,在《Linux操作系统内核分析》基础上,对2.4版的内核进行分析。 当我着手《深入分析Linux内核源代码》这本书的编写时,看到了毛德操、胡希明 著的《Linux内核源代码情景分析》一书。厚厚的两大本,完全是娓娓道来。本书作者以英语情景会话的方式,对阅读内核代码路途中遇到的几乎每个函数,都一一说明。但是,因为内核代码的深层次嵌套,如果你在阅读的过程中,没有做好返回“现场”的准备,很可能走入某条小径后不知返回的路途在哪里了。但是,如果你有时间,而且有耐心,仔细阅读本书,应该说可以全景式掌握Linux内核。 在此说明,《深入分析Linux内核源代码》是针对Linux 内核2.4的,本书编写过程中,依然遵循了“Concrete Architecture of the Linux Kernel”一文的从顶向下的思路,同时还不断的比较2.2与2.4内核在开发驱动程序方面的差异。总体感觉,新版本对内核函数进行了较好的封装,让内核接口变得越来越容易。 《Linux kernel development》一书(中文名“Linux内核设计与实现”,已出三版,2.6内核),又一本口碑较好的Linux内核书籍。当我们费劲翻译完这本并不厚的书时,才感觉其涵盖信息量之大,相比《Understanding The Linux Kernel》,可以说,如果没有内核的基础知识,阅读之后,大有不知所以然之感。尽管这本书深得读者喜欢,我们的翻译也得到读者的极大认可,但还是建议读者有一定内核基础知识之后再去读这本书。 《The Linux® Kernel Primer: A Top-Down Approach for x86 and PowerPC Architectures》,我们翻译的另一本2.6内核书籍,本书的作者在IBM呆过多年,有开发经验。书中对涉及到的代码逐行给予了解释,因此,在一定程度上适合于初学者。 在翻译和编写了以上书籍之后,我们为清华大学出版社编写了《Linux操作系统原理与应用》教材,本书的侧重点不在逐行分析源代码,而是对部分源代码有所了解后,让读者能够动手进行内核模块的编写,每章后面的例子有一定的难度,但是,动手之后,再去了解内核相关内容就具有针对性了。 以上对内核书籍的简评,只限于我们编写和翻译的书籍,像《Linux Device Driver》也是经典内核书籍,在此并没有给予说明,近几年出版了不少内核方面的好书,建议读者择优去读。 在Linux内核这样一片茂密无边的树林面前,如果说我曾给过大家有所帮助,其实也只是引领了一条小径而已,那种探究的路途,全凭的是个人的悟性和不懈的执着,路漫漫兮,寻觅者自有探索,而后,我更希望是一旁观者,希望看到勇者无往的憨劲!