1.4 Linux内核源代码
在Linux内核官方网站http://www.kernel.org,可以随时获取不同版本的Linux源代码。为了深入地了解 Linux的实现机制,有必要阅读Linux的源代码。
1.4.2 Linux内核版本
Linux内核版本从最初的0.01到目前的3.0.x不断发生着变化。Linux的内核具有两种不同的版本号,即实验版本和产品化版本。这种机制使用三个或者四个用“.”分隔的数字来代表不同内核版本。第一个数字是主版本号,第二个数字是从版本号,第三个数字是修订版本号。第四个可选的数字为稳定版本号。从版本号可以反映出该内核是一个产品化版本还是一个处于开发中的实验版本:该数字如果是偶数,那么此内核就是产品化版,如果是奇数,那么它就是实验版。举例来说,版本号为2.6.30.1的内核,它就是一个产品化版。这个内核的主板本号是2,从版本号是6,修订版本号是30,稳定版本号是1。头两个数字在一起描述了“内核系列”—在这个例子中,就是2.6版内核系列。
Linux的两种版本是相互关联的。实验版本最初是产品化版本的拷贝,然后产品化版本只修改错误,实验版本继续增加新功能,到实验版本测试证明稳定后拷贝成新的产品化版本,不断循环。如图1.4所示:
这样的组织方式一方面可以方便软件开发人员加入到Linux的开发和测试中来,另一方面又可以让一些用户使用稳定的Linux版本。目前,比较稳定的内核版本是2.6.x,最新版本为3.0.x。
1.4.3 Linux内核源代码的结构
Linux内核源代码位于/usr/src/linux
目录下,其主要目录结构分布如图1.5所示,
下面对每一个目录给予简单描述。
- include/子目录包含了建立内核代码时所需的大部分包含文件。
- init/ 子目录包含了内核的初始化代码,这是内核开始工作的起点。
- arch/子目录包含了Linux支持的所有硬件结构的内核代码,如图1.5,
- arch/子目录下有x86、ARM和alpha等针对不同体系结构的代码。
- drivers/ 目录包含了内核中所有的设备驱动程序,如字符设备,块设备,scsi 设备驱动程序等。
- fs/ 目录包含了所有文件系统的代码,如ext3/ext4, ntfs模块的代码等等。
- net/ 目录包含了内核中关于网络的代码。
- mm/ 目录包含了所有的内存管理代码。
- ipc/ 目录包含了进程间通信的代码。
- kernel/ 目录包含了主内核代码
1.4.4 Linux内核源代码分析工具
Linux的内核组织结构虽然非常有条理,但是,它毕竟是众人合作的结果,在阅读代码的时候要将各个部分结合起来,确实是件非常困难的事情。因为在内核中的代码层次结构肯定分多个层次,那么对一个函数的分析,肯定会涉及到多个函数,而每一个函数可能又有多层的调用,一层层下来,直接在代码文件中查找那些函数会让你失去耐心和兴趣。
俗话说:“工欲善其事,必先利其器”。面对Linux这样庞大的源代码,必须有相应工具的支持才能使分析有效地进行下去。 在此介绍两种源代码的分析工具,希望能对感兴趣的读者有所帮助。
1. Linux超文本交叉代码检索工具
Linux超文本交叉代码检索工具LXR(Linux Cross Reference),是由挪威奥斯陆大学数学系Arne Georg Gleditsch和Per Kristian Gjermshus编写的。这个工具实际上运行在Linux或者Unix平台下,通过对源代码中的所有符号建立索引,从而可以方便的检索任何一个符号,包括函数、外部变量、文件名、宏定义等等。不仅仅是针对Linux源代码,对于C语言的其他大型的项目,都可以建立其lxr站点,以提供开发者查询代码,以及后继开发者学习代码。
目前的lxr是专门为Linux下面的Apache服务器设计的,通过运行perl脚本,检索源代码索引文件,将数据发送到网络客户端的Web浏览器上。任何一种平台上的Web浏览器都可以访问,这就方便了习惯在Windows平台下工作的用户。 关于lxr的英文网站为http://lxr.linux.no/。
2.Windows平台下的源代码阅读工具Source Insight
为了方便地学习Linux源程序,我们不妨回到我们熟悉的window环境下。但是在Window平台上,使用一些常见的集成开发环境,效果也不是很理想,比如难以将所有的文件加进去,查找速度缓慢,对于非Windows平台的函数不能彩色显示。在Windows平台下有一个强大的源代码编辑器,它的卓越性能使得学习Linux内核源代码的难度大大降低,这便是Source Insight,它是一个Windows平台下的共享软件,可以从http://www.sourceinsight.com/上下载试用版本。由于Source Insight是一个Windows平台的应用软件,所以首先要通过相应手段把Linux系统上的程序源代码移到Windows平台下,这一点可以通过在Linux下将/usr/src目录下的文件拷贝到Windows的分区上,或者从网上或光盘直接拷贝文件到Windows的分区。