corba 发表于 2005-7-16 13:36

读核-想搞linux的都进来看看

读 核

AKA 嵌入式开发兴趣小组/杨勇

我读核已经有一段时间了,读Linux 内核。选择linux,是因为linux 自由、开放,有核
可读。

然而,读核却是一件很艰辛的事情。在庞大的内核代码面前,自己会显得很渺小,犹如
沧海之一粟,而代码间千丝万缕的联系,又让人觉得仿佛陷身于巨网之间,一经陷入便不能
自拔。

然而,我还是坚持读核。

吸引我读核的原因,是因为内核的神奇与神秘,对我来说,这算得上是一个诱惑,因为
一直一来,我都想搞明白,我们从编辑器中所写的一行行字母究竟是如何操纵计算机的,我
有一种很强的欲望,想弄清影响这一切的最根本的东西。

弄清事物最根本的东西,是高中老师教育我的。念高中时,为了应付考试,同学们都拿
着大把大把的复习资料和习题不放,教科书却被放在了脑后,那时,老师总语重心长的对我
们说:“教科书千万不能丢,书上的东西是最基本的东西,资料上的题,不管什么样,都不
出其右。把教科书吃透,就能运筹帷幄。所谓万变不离其中嘛。”

老师的话对我影响很深。在高中时,我就照着老师的话,努力把教科书吃透。现在,教
科书没有了,取而代之的是计算机,于是我想,操作系统应该可以算是计算机最基本的东西
吧,那我就努力把操作系统搞懂。几乎所有的操作书上都有说,操作系统是与硬件最紧密的
一层,是计算机软件通过他操作硬件的一层。因此,搞懂了操作系统,也就搞懂了怎样真正
控制计算机。当有一天你能够自如的操作计算机时,能够让那些死板的芯片随着你活跃起来
时,你还有什么不能操控呢?到那时,或许你就可以拥有一个与你同姓的虚拟机,一个跟你
姓的java 了。呵呵。。。。爽吗?

因此看问题就一定要直逼其最基础,最本质的东西,单刀直入,狠就狠一点。

然而,要想搞懂事物的本质,却并不那么容易。比如操作系统,庞大的内核代码足够让
你望而却步,而内核间斩不断理还乱的联系,也绝对让你找不到来去如风的感觉。要想读懂
内核代码,就必须拥有顽强的毅力,坚强的信心和决心。虽然艰苦,但只要读懂内核,就能
获益匪浅,内核乃计算机技术的精华,不但囊括了丰富的计算机知识,还包含了大量巧妙的
实现技巧和优秀的设计思想。

比如硬中断的处理。处理硬中断的中断服务程序往往关中运行,以避免再次中断。但关
中时间却不宜过长,太长了可能会丢失外部中断信号,所以关中执行的中断服务程序也不能
太长。然而,有时候却必须处理“长”中断服务程序,为了处理这些程序,linux 将它们一
分为二,各称作top buffer 和buttom half,前者就是在idt 表中登记的中断服务程序的入口部
分,必须关中执行;后者则是top half 调度的中断服务程序剩余部分,可以开中运行。这样,
每当处理时,top half 读取来自设备的数据,保存到预定的缓冲区,随即通知bottom half 并
返回。剩余的工作则由bottom half 在适当的时候完成。有了这种分工,top half 就可以执行
较快,又因为bottom half 开中执行,所以在运行过程中,top half 又可同时接受新的中断。
这一棘手的问题,就这样被Linux 搞定了,回味一下,真是妙不可言!

又如文件系统。对操作系统来说,文件系统可以分为三大类:基于磁盘的文件系统、网
络文件系统和特殊文件系统。尽管他们各不相同,但我们对这些文件系统进行操作时,却使
用相同的操作,Linux 使用虚拟文件系统(VFS)让这一功能得以实现:在VFS 中隐藏了各
种不同文件系统的实现细节,将他们的接口统一起来,提供一套标准的API 以供用户使用。

在实现时,由于VFS 支持的文件系统种类是可变的,因此linux 不可能在VFS 中保留每种
文件系统各自的操作函数,他通过指向每个文件系统操作函数的指针实现对不同文件系统的
控制。每个文件在内核中都有一个对应的文件对象结构file,在这个结构中包含的f_op 指针
指向具体的文件系统操作函数集。Linux 的文件系统在读入一个文件的时候,首先是从磁盘
的inode 中读取并初始化VFS 的inode。当一个进程打开一个文件的时候,由VFS 去初始
化file 对象,并将inode 的i_fop 指针赋给file 对象的f_op。这样进程就可以对文件进行基
本的读写操作了。因此,当我们在应用程序中用read()来读文件时,其实是经过一次间接
调用File->f_op->read()才完成的。按照这种模式,只要赋给f_op 新的地址,VFS 就可以改
变文件的操作函数集。实现不同文件系统的操作。

通过一个结构的成员指针指向不同的操作函数集,从而完成不同对象的操作,这又是一
种巧妙的实现,这种实现,会让人在一霎那间豁然开朗起来,顿觉收获不少;不但如此,这
种“将不同的事物抽象出来,从而与具体对象无关”的思想却能够给我们以更大的启发。看
看在今天占有重要地位的CORBA,其IDL 接口的思想,以及JAVA,其虚拟机的思想,无
不是这一思想的结果。

要从内核中得到收获,你还得面对代码。代码是庞大的,进入内核代码所编织出的错综
复杂的网,真有点狗咬刺猬,无从下口,茫然而不知所措的感觉。如果不找到一条路来,四
周黑洞洞的,岂不到处碰壁?对于阅读内核代码,就要寻求方法,有了方法,才可以少走弯
路,少受打击。在阅读时,找出贯穿这张网的主线:重要的数据结构,如:task_struct,
mm_struct,vm_area_struct 等,以及这些数据结构之间的联系,内核函数对他们的操作以及
函数间的调用关系。有了这条线,我们就能冲出了一条血路,找到一条光明大道......。

这就是读核,艰苦而有意义。读核的过程,需要有方法;读核的目的,需要有偏重。我
们学习内核,不但要学其技术,更要学其思想。技术可以给我们以战术上的帮助,而思想却
能给我们以战略上的指导。我认为,不但读核,“读”其他任何东西,都应当如此。今天国
外的技术已领先于我们,我们要读他们,向他们学习。向他们学习,我们就不仅要学其先进
的技术,还要学其先进的思想。而学其先进的思想,我认为才是最重要的。因为我们学习他
们,不是要照搬他们的东西,而是要从他们那里获得启示,有所悟,有所为,有所不为。

前几天看了电影《英雄》,《英雄》中讲到,练剑和写字是相通的,虽然形不似,但神似。
引申开来,我觉得,读核跟我们的工作,和我们的生活也是相通的,形不似而神似。今天,
我们创建AKA 嵌入式开发兴趣小组,开创我们的事业,这也是一个艰辛而有意义的事情,
如同读核。要把核读懂,我们就要有正确的方法、坚定的信念以及持之以恒的决心,同样,
要把我们的事业推向成功,我们也需要正确的方法、坚定的信念以及持之以恒的决心。读核
的方法或许可以当成我们工作的方法,我们工作的方法也可以用作我们读核的方法,这是触
类旁通的。不但他们,生活中的任何事情都是如此,当在某种事情上陷入僵局时,转换一下
角度,或许我们会从另一件事上获得启发......。

杨勇
inyoureyes_yy@sohu.com

[ 本帖最后由 corba 于 2005-7-16 14:56 编辑 ]

greenflute 发表于 2005-9-25 23:30

今天才看到这个帖子,佩服
顶一下
页: [1]
查看完整版本: 读核-想搞linux的都进来看看