Linux内核源代码的阅读及相关工具介绍

随着linux的逐步普及,现在有不少人对于Linux的安装及设置已经比较熟悉了 。与Linux 的蓬勃发展相适应,想深入了解Linux的也越来越多 。而要想深入了解Linux,就需要阅读和分析linux内核的源代码 。
Linux的内核源代码可以从很多途径得到 。一般来讲,在安装的linux系统下,/usr/src/linux目录下的东西就是内核源代码 。另外还可以从互连网上下载,解压缩后文件一般也都位于linux目录下 。内核源代码有很多版本,目前最新的稳定版是2.2.14 。
许多人对于阅读Linux内核有一种恐惧感,其实大可不必 。当然,象Linux内核这样大而复杂的系统代码,阅读起来确实有很多困难,但是也不象想象的那么高不可攀 。只要有恒心,困难都是可以克服的 。也不用担心水平不够的问题,事实上,有很多事情我们不都是从不会到会,边干边学的吗?
任何事情做起来都需要有方法和工具 。正确的方法可以指导工作,良好的工具可以事半功倍 。对于Linux 内核源代码的阅读也同样如此 。下面我就把自己阅读内核源代码的一点经验介绍一下,最后介绍Window平台下的一种阅读工具 。
对于源代码的阅读,要想比较顺利,事先最好对源代码的知识背景有一定的了解 。对于linux内核源代码来讲,我认为,基本要求是:1、操作系统的基本知识;2、对C语言比较熟悉,最好要有汇编语言的知识和GNU C对标准C的扩展的知识的了解 。另外在阅读之前,还应该知道Linux内核源代码的整体分布情况 。我们知道现代的操作系统一般由进程管理、内存管理、文件系统、驱动程序、网络等组成 。看一下Linux内核源代码就可看出,各个目录大致对应了这些方面 。Linux内核源代码的组成如下(假设相对于linux目录):
arch 这个子目录包含了此核心源代码所支持的硬件体系结构相关的核心代码 。如对于X86平台就是i386 。
include 这个目录包括了核心的大多数include文件 。另外对于每种支持的体系结构分别有一个子目录 。
init 此目录包含核心启动代码 。
【Linux内核源代码的阅读及相关工具介绍】mm 此目录包含了所有的内存管理代码 。与具体硬件体系结构相关的内存管理代码位于arch/*/mm目录下,如对应于X86的就是arch/i386/mm/fault.c。
drivers 系统中所有的设备驱动都位于此目录中 。它又进一步划分成几类设备驱动,每一种也有对应的子目录,如声卡的驱动对应于drivers/sound 。
ipc 此目录包含了核心的进程间通讯代码 。
modules 此目录包含已建好可动态加载的模块 。
fs Linux支持的文件系统代码 。不同的文件系统有不同的子目录对应,如ext2文件系统对应的就是ext2子目录 。
kernel 主要核心代码 。同时与处理器结构相关代码都放在arch/*/kernel目录下 。
net 核心的网络部分代码 。里面的每个子目录对应于网络的一个方面 。
lib 此目录包含了核心的库代码 。与处理器结构相关库代码被放在arch/*/lib/目录下 。
scripts此目录包含用于配置核心的脚本文件 。
Documentation 此目录是一些文档,起参考作用 。
清楚了源代码的结构组成后就可以着手阅读 。对于阅读方法或者说顺序,有所谓的纵向与横向之分 。所谓纵向就是顺着程序的执行顺序逐步进行;所谓横向,就是分模块进行 。其实他们之间不是绝对的,而是经常结合在一起进行 。对于Linux源代码来讲,启动的代码就可以顺着linux的启动顺序一步一步来,它的大致流程如下(以X86平台为例):
./larch/i386/boot/bootSect.S-->./larch/i386/boot/setup.S-->./larch/i386/kernel/head.S-->./init/main.c中的start_kernel() 。而对于象内存管理等部分,则可以单独拿出来进行阅读分析 。我的体会是:开始最好按顺序阅读启动代码,然后进行专题阅读,如进程部分,内存管理部分等 。在每个功能函数内部应该一步步来 。实际上这是一个反复的过程,不可能读一遍就理解 。

推荐阅读