《基于linux的C编程与内核导读》连载(4)
时间:2009-07-23 来源:叮汀
第二章linux内核研读入门
2.1 为什么要读linux内核代码
Linux的最大的好处之一就是它的源码公开。同时,公开的核心源码也吸引着无数的电脑爱好者和程序员;他们把解读和分析Linux的核心源码作为自己的最大兴趣,把修改Linux源码和改造Linux系统作为自己对计算机技术追求的最大目标。
那么是什么吸引如此多的程序员去解读和分析内核代码呢?或者换个问题,我们研读linux内核代码有哪些好处呢?我大致总结了一下,主要有以下原因:
(1)要想真正理解linux操作系统,并掌握其实现原理和方法,就必须研读内核代码。虽然我们通过阅读一些操作系统的经典书籍可以对linux的一些工作原理有了一个理论上的认识,但实际上对操作系统的真正组成和内部关系实现的理解仍不是很清晰。正如Linus Torvalds所说,要想真正理解一个软件系统的运行机制,就必须阅读其源代码。
(2)在阅读源代码的过程中,你可以从中学到很多的计算机的底层知识,如系统的引导,虚拟存储的实现机制,多任务机制,系统保护机制等等。
(3)我们将从操作系统的整体结构中,体会整体设计在软件设计中的份量和作用,以及一些宏观设计的方法和技巧:Linux的内核为上层应用提供一个与具体硬件不相关的平台;同时在内核内部,它又把代码分为与体系结构和硬件相关的部分,和可移植的部分;再例如,Linux虽然不是微内核的,但它把大部分的设备驱动处理成相对独立的内核模块,这样减小了内核运行的开销,增强了内核代码的模块独立性。
(4)而且我们还能从对内核源码的分析中,体会到它在解决某个具体细节问题时方法的巧妙:如Linux通过Botoom_half机制来加快系统对中断的处理等等许多细节。
(5)最重要的是在源码的分析过程中,我们将会被一点一点地、潜移默化地专业化。一个专业的程序员,总是把代码的清晰性,兼容性,可移植性放在很重要的位置。他们总是通过定义大量的宏,来增强代码的清晰度和可读性,而又不增加编译后的代码长度和代码的运行效率;他们总是在编码的同时,就考虑到了以后的代码维护和升级。甚至,只要分析百分之一的代码后,我们就会深刻地体会到,什么样的代码才是一个专业的程序员写的,什么样的代码是一个业余爱好者写的。而这一点是任何没有真正分析过标准代码的人都无法体会到的。
2.2 如何研读linux内核
由于内核代码的冗长,和内核体系结构的庞杂,所以分析内核也是一个很艰难,很需要毅力的事。那么究竟如何研读内核呢,我们在分析内核时应该注意哪些事项呢?
(1)要分析Linux内核源码,首先要对内核的系统结构有个大概的了解,弄清处各个模块之间的联系。这点将在2.3节详细介绍。
(2)其次要找到各个模块的位置,也即要弄懂源码的文件组织形式。这点将在2.4节详细介绍。
(3)在分析源代码之前首先要阅读相关的理论知识,对这段代码要实现的功能、以及实现此功能用到的方法弄清楚,这样在阅读源代码时就有的放矢了。
(4)另外在研读内核时尽量以linux如何完整实现一个功能为线索,如打开一个文件的全过程、执行一个可执行文件的全过程等。这样大家对内核就会有比较生动的一个认识。
(5)数据结构是研读内核的关键部分,就是说我们要弄清主要数据结构的组成,了解数据结构之间的联系,并且要了解主要函数对有关数据结构的操作。
另外,在研读Linux内核时最好随身准备几本工具书。首先是关于80386处理器结构和编程的资料,这方面我推荐《UNIX系统下的80386》。此书对于80386的任务切换机制、内存管理单元等知识和UNIX的进程管理、内存管理进行了详细的对比分析。另外,最好能准备几本关于操作系统的经典教材,这里我推荐A.S.Tanenbaum的书《Operation System:Design and Implementation》。这本书的作者就是著名的MINIX操作系统的创造者,其对操作系统的讲解非常深刻和细致。另外一个重要的原因就是Linus在最初开发linux时,正是参考了MINUX系统,就像Tanenbaum在书中写的那样“A Finnish student,Linus Torvalds,decided to write a MINIX clone.Thus was LINUX born.”。所以此书对于我们理解linux内核有许多有益的帮助。