1.6.1 源码目录结构
Linux内核源码的官方下载地址为http://www.kernel.org/,如图1-5所示。
图1-5 Linux内核官方下载界面
当下载内核代码后,很有必要知道内核源码的整体分布情况。通常其内核代码保存在/usr/src/linux目录下,该目录下的每一个子目录都代表一个特定的内核功能性子集。接下来针对Linux3.4版本进行简单描述。
(1)目录Documentation
此目录下面没有内核代码,只有很多质量参差不齐的文档,但往往能给用户提供很多帮助。
(2)目录arch
所有与体系结构相关的代码都在此目录及include/asm-*/目录中,Linux支持的每种体系结构在arch目录下都有对应的子目录,而在每个体系结构特有的子目录下又会至少包含如下3个子目录。
● kernel:存放支持体系结构特有的诸如信号量处理和SMP之类特征的实现;
● lib:存放体系结构特有的对诸如strlen和memcpy之类的通用函数的实现;
● mm:存放体系结构特有的内存管理程序的实现。
除了上述3个子目录之外,大多数体系结构在必要的情况下还有一个boot子目录,包含了在这种硬件平台上启动内核所使用的部分或全部平台特有代码。另外,在大部分体系结构所特有的子目录中,还应该根据需要包含供附加特性使用的其他子目录。比如,i386目录包含一个math-emu子目录,其中包括了在缺少数学协处理器(FPU)的CPU上运行模拟FPU的代码。
(3)目录drivers
此目录是内核中最庞大的一个目录,显卡、网卡、SCSI适配器、PCI总线、USB总线和其他任何Linux支持的外围设备或总线的驱动程序都可以在这里找到。
(4)目录fs
在此目录中保存了虚拟文件系统(Virtual File System,VFS)的代码,还有各个不同文件系统的代码。Linux支持的所有文件系统在fs目录下面都有一个对应的子目录。例如,ext2文件系统对应的是fs/ext2目录。
一个文件系统是存储设备和需要访问存储设备的进程之间的媒介。存储设备可能是本地的物理上可访问的,如硬盘或CD-ROM驱动器,它们分别使用ext2/ext3和isofs文件系统。也可能是通过网络访问的,使用NFS文件系统。
还有一些虚拟文件系统,如proc是以一个标准文件系统出现的,然而其中的文件只存在于内存中,并不占用磁盘空间。
(5)目录include
在此目录中包含了内核中大部分的头文件,它们按照include/asm-*/的子目录格式进行分组。这种格式的子目录有多个,每一个都对应着一个arch的子目录,如include/asm-alpha、include/asm-arm和include/asm-i386等。在每个子目录中的文件中,都定义了支持给定体系结构所必须的预处理器宏和内联函数,这些内联函数多数都是全部或部分使用汇编语言实现的。
在编译内核时,系统会建立一个从include/asm目录到目标体系结构特有的目录的符号链接。比如,对于arm平台,就是include/asm-arm到include/asm的符号链接。因此,体系结构无关部分的内核代码可以使用如下形式包含体系相关部分的头文件。
(6)目录init
此目录保存了内核的初始化代码,包括main.c、创建早期用户空间的代码及其他初始化代码。
(7)目录ipc
ipc即进程间通信(interprocess communication),在此目录中包含共享内存、信号量及其他形式IPC的代码。
(8)目录kernel
此目录是内核中最核心的部分,包括进程的调度(kernel/sched.c),以及进程的创建和撤销(kernel/fork.c和kernel/exit.c)等,和平台相关的另一部分核心的代码在arch/*/kernel目录下。
(9)目录lib
此目录中保存了库代码,这些代码实现了一个标准C库的通用子集,包括字符串和内存操作的函数(strlen、memcpy和其他类似的函数)以及有关sprintf和atoi的系列函数。与arch/lib下的代码不同,这里的库代码都是使用C语言编写的,在内核新的移植版本中可以直接使用。
(10)目录mm
在此目录中包含体系结构无关部分的内存管理代码,体系相关的部分位于arch/*/mm目录下。
(11)目录net
在此目录中保存了和网络相关的代码,实现各种常见的网络协议,如TCP/IP、IPX等。
(12)目录scripts
在该目录下没有内核代码,只包含用于配置内核的脚本文件。当运行make menuconfig或者make xconfig之类的命令配置内核时,用户就是和位于这个目录下的脚本进行交互的。
(13)目录block
在此目录中保存block层的实现代码。最初block层的代码一部分位于drivers目录,一部分位于fs目录,从Linux 2.6.15开始,block层的核心代码被提取出来放在顶层的block目录。
(14)目录crypto
在此目录中保存内核本身所用的加密API信息,实现了常用的加密和散列算法,还有一些压缩和CRC校验算法。
(15)目录security
在此目录下包括不同的Linux安全模型的代码,如NSA Security-Enhanced Linux等。
(16)目录sound
在此目录下保存声卡驱动及其他声音相关的代码。
(17)目录usr
此目录实现了用于打包和压缩的cpio等。