陈莉君教授: 回望踏入Linux内核之旅

转载:

初次踏入Linux 几多耕耘,几多收获,不小心在Linux这个自由王国畅游了多年。依稀记得刚进入这个世界时的那份恐慌和无知,更庆幸那时的无知无畏。在那个20世纪的最后一年,贸然带着几个弟子踏入一无所知的Linux世界。

1999年的那个春天,也是在讲授操作系统,只不过是鼓励大家参加我的兴趣小组。居然有10个人报名了(惊喜)。最初也无非是希望在课堂之外,让大家能够多接触一些东西,有点盲目,但大家兴致很高。在我们每周相约讨论的过程中,思路越来越多,机会之神也来光顾。人民邮电出版社希望就开源的Linux写一本分析其内核的书。从来没有写过书的我,敢承接吗?不知勇气从何而来,出版社约定我3个月拿出书稿,当时居然毫不犹豫地答应了。

这书该怎么写?从何入手?既然是分析内核源代码,那就从源代码开始阅读吧,于是,划分任务,给坚持下来的7个每人一部分内容。到我们兴冲冲地下载了源代码后才发现,这么庞大的源代码远不是我们能吃得动。真是自不量力!可有约在先,不做不罢呀。

那个炎热的假期,大家苦战的场面还历历在目。炎热无空调,小伙子们光着膀子端杯水,有的干脆晚上彻夜在干,累了就在水泥地睡一会儿。终于,在暑假快结束时,那本书总算草草封笔。之所以说草草,是因为,有太多的东西无法纳入书本,还有太多的内容,我们更没有一一理清楚。有点遗憾,有点不甘心,但时间有限,就那么交稿了。

2000年,《Linux操作系统内核分析》出版了,读者的好评扑面而来。有点惊讶,有点受宠若惊,更没有想到的是后来中科院指定该书为考博参考书。有份喜悦,更有份惭愧,总觉得那么不成熟的毛小孩受人尊敬有点不相称。

不仅仅是开源 在接触Linux之后,希望把这种开源文化传播给学生。每当第一次讲起Linux,我的第一个页面都是徐悲鸿的一匹奔放的马。

file

我会问学生,从这匹马中看到了什么,“自由奔放”,有的学生回答。其实,因为那一页的标题就是“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内核这样一片茂密无边的树林面前,如果说我曾给过大家有所帮助,其实也只是引领了一条小径而已,那种探究的路途,全凭的是个人的悟性和不懈的执着,路漫漫兮,寻觅者自有探索,而后,我更希望是一旁观者,希望看到勇者无往的憨劲!

从机制与策略探究Linux内核设计之道 2011年的Linux内核开发者大会邀请我做主题发言,但给大家分享些什么,起初选定Linux的安全,因为那几年的项目是这方面的。但是,当我着手准备讲稿时,才发现安全是个太广的话题,根本难以把握。于是想起自己常常告诉别人的话,从自己最熟悉的地方下手。于是,还是从自己最熟悉的Linux内核入手吧。但是,内核也是太大的话题,漫无边地,怎样才能在有限的时间把自己这么多年的体会分享出去,有两个词在瞬间跳在眼前:机制与策略,这也是自己常常挂在口边的词,怎样从内核的设计释义这两个词的含义,这实际上也是一个哲学命题。当开始写讲稿时,题目自然就蹦出来了:”从机制与策略探究Linux内核的设计之道“

当题目确定下来后,才发现跳进自己挖的大陷阱中,这个涉及哲学、技术的宽泛题目我能把握么?但,没有其他令自己更满意的题目,只能是它了。因此,讲稿的第一页分别引用了易经和圣经中的两句话:“形而上谓之道,形而下谓之器”;“看见的是暂时的,看不见的是永远的”。这两句话一出来,思路一下子打开了。实际上,我要分享给大家的不是具体的技术,而是思考问题的方式。于是,第二页上引用了龙应台在”百年思索“中对文、史、哲的释义—”文学-使看不见的东西被看见,哲学-迷宫中望见星空,历史-沙漠玫瑰的开放“。当我们仅仅在技术的坐标系中看问题时,实际上总有一定的局限性,那些万事万物之间的联系因为我们固有的观念而被割裂了。至此,我定位了自己的位置:如果说”道“是一只大象(忽然想起老子说的“大象无形”,但我这里是偷换概念),那么我在这里讲的观点只是摸到了大象的鼻子。这样以来,自己一下子释然了,我并不是什么专家,我只是在这个领域呆的时间长了,比大家早知道一些东西,多知道一些道理,有些感悟,但远不是全部事实。

当这样的开场白后,讲稿上打出屈原“天问”中的几句(这是学人家龙应台)“天何所沓 十二焉分 日月安属 列星安陈 何阖而晦 何开而明 角宿未旦 曜灵安藏”,屈原一个文学家,怎么问天文地理不着边际的这些问题:“天为什么和地相合,...",这是为了引出胡适的观点“做学问要在不疑出有疑”。

引子部分全部结束后就进入主题,首先用一组数据观察Linux内核演变历史,然后,从Linux整体结构入手,分析机制与策略分离的设计原则,再然后,从各个子系统中这一设计原则的应用入手,说明机制与策略的分离实际上是计算机科学中的设计理念,而不仅仅用在操作系统中。最后引出手机操作系统Android以及虚拟机xen的设计思路。

回头看整篇讲稿,与自己最初设想的根本不一样了。一件事情动手做起来以后完全是按照事情本身的规律往前走了,而不是脑子固有设想的非得怎样去做,也许这也是一种“道”。

后来,华为的深研所,西研所,北研所邀请我去他们的大讲堂讲讲关于Linux内核方面的东西,“从机制与策略探究Linux内核的设计之道”的通用性省却了我每次要重新准备讲稿的时间,而把大量的时间花在了解他们具体的需求上,在不同的地方,面对不同的人群,只需要针对具体需求实例化后进行发挥,就有游刃有余的感觉了。

迷时师度 悟了自度 曾在企业实习的学生发来邮件说,企业在培训中推荐他们阅读侯捷写的《迷时师度 悟了自度》一文,我读罢叹为观止,先把其中的故事贴过来:

● 六祖坛经

佛教东传中土之後,虽然大德大贤备出,但由中国和尚所著,被奉为「经者],也只「六祖檀经」一书而已。六祖檀经记录着佛教禅宗六祖惠能一生的思想言行。其中对於六祖得道的过程,有详细的叙述。

六祖惠能俗姓卢,南海新兴人。年少失父,母且寡居,家亦屡空,业无腴产。所以他从小做了樵夫,养家活口。有一天偶闻肆间诵金刚般若经,心有所感,於是询问邻人何处学佛,遂安置母亲,至河北黄梅山礼拜五祖。

●五祖弘忍

五祖弘忍见惠能谈吐甚有根性,不动声色地让他到後院碓米。八个月後有一天,弘忍告诉众弟子说,每一个人写一首偈,谁能悟道,我便传他衣钵。当时人人以为五祖座下第一大弟子神秀必得衣钵,所以也没有人去作这首偈。神秀在这种情况下,一来「责无旁贷」,二来也想让师父看看自己心中的见解,便在三更时候於南廊壁上写下心偈一首:

身是菩提树,心如明镜台;时时勤拂拭,莫使惹尘埃。

第二天五祖弘忍见到了这首偈,把神秀叫到座前询问。并谓:「汝作此偈,见即未到,只到门前,尚未得入...」。要神秀回去再作一偈。过了数天,神秀却作不出来。

●千古名诵

有个童子行过碓房,唱诵神秀的偈。惠能闻後,问明缘由,便请童子引至大堂。礼拜之後,惠能说自己也有一首偈,但是他既不识字更不会写字,乃请人代书写下千古名诵:

菩提本非树,明镜亦非台;本来无一物,何处惹尘埃。

此偈一成,众总皆惊。消息传至五祖,了然於心,但恐人损害,遂脱了鞋子 当抹布,立刻把这首偈擦掉,并且说「这首也嘛没有悟道」!

第二天,五祖弘忍悄悄来到後院,看到惠能把大石头系在腰上,增加身体的重量来碓米,很是感动,於是和惠能展开一段非常空灵神妙的对话。弘忍问「米熟也未」?惠能曰:「米熟久矣,犹欠筛在」。於是祖以仗击碓三下而去。惠能知祖意,是夜三鼓入室,由祖为说金刚经。当说到「因无所住而生其心」,惠能大悟,於是五祖授衣钵以为信,并且说「衣为争端,止汝勿传...,汝须速去,恐人害汝」。

●迷时师度,悟了自度

五祖弘忍亲自送惠能到九江驿,令上船,把自摇。惠能曰:「请和尚坐,弟子合摇」。祖云:「合是吾渡汝」。惠能云:「迷时师度,悟了自度」。

我的观点:

●谁是师?

古人一字,涵盖多义。我常常会觉得自己为师多年,是当仁不让的师,可有一天与一位40多岁还从头学计算机编程的人聊后 ,就从心里认他为师,不是因为他的知识,而是因为他纯粹的学习兴趣和没有功利心而为的劲头。

●怎么悟

一个“悟”字,太有禅意,似乎遥不可及,但每个人都有感受到悟的时刻,只是当你寻找悟的感觉时,它反倒跑的无影无踪。追溯“悟”的源头,大都是因为日思夜想,吞下无数文字,驰骋于思维的高山峡谷,有那么一时刻,有了众里寻他千百度的顿悟。在这之前,一次次模模糊糊的感觉似影似幻,总困扰着你。如果放弃了,那本该触手可及的顿悟也就逃之夭夭。

●悟什么

比如,在Linux内核这样有禅意的作品中,高人的代码散落四处,那些代码后的文字和原理,或者一些经典原理落地有声的代码,关联起他们的,非文字所能描述,悟就别无选择了。