5.2 Linux内核结构
在移植Linux操作系统以前,需先认识一下Linux的内核结构。Linux内核主要由5个子系统组成:进程调度、内存管理、虚拟文件系统、网络接口、进程间通信。
一般在Linux系统中的/usr/src/Linux-*.*.*.*(*.*.*.*代表内核版本,如2.6.17.9)目录下就是内核源代码(若没有类似目录则是因为还没安装内核代码)。Linux内核非常庞大,包括驱动程序在内有数百兆之多。整个代码分布如图5-1所示。
/arch子目录包含了所有硬件结构特定的内核代码,如i386,alpha和arm。
(点击查看大图)图5-1 Linux内核代码分布
/drivers子目录包含了内核中所有的设备驱动程序,如usb和sound。
/fs子目录包含了所有的文件系统的代码,如ntfs,ext3和jffs2等。
/include子目录包含了建立内核代码时所需的大部分库文件,这个模块利用其他模块重建内核。该目录也包括了不同平台需要的库文件。比如,asm-arm是arm平台需要的库文件。
/init子目录包含了内核的初始化代码,内核从此处工作。
/ipc子目录包含了进程间通信代码。
/kernel子目录包含了主内核代码。
/mm子目录包含了所有内存管理代码。
/net子目录包含了和网络相关的代码,如arm和ipv6。
/crypto子目录包含了加密算法。
/security子目录包含了和安全相关的代码。
一般在每个目录下都有一个depend文件和一个Makefile文件。这两个文件都是编译时使用的辅助文件。其中Makefile文件中指出了编译时需要用到的编译器,也是移植内核过程中不可缺少的。
(1)arch目录。
Linux系统能支持如此多平台的部分原因是因为内核把源程序代码清晰地划分为体系结构无关部分和体系结构相关部分。arch目录包含了体系结构相关部分的内核代码。其中的每一个目录都代表一种硬件平台,比如我们使用的ARM平台和PC使用的i386。对于任何平台,都必须包括以下几个目录。
boot:包括启动内核所使用的部分或全部平台特有代码。
kernel:存放支持体系结构特有的(如信号处理和SMP)特征的实现。
lib:存放高速的体系结构特有的(如strlen和memcpy)通用函数的实现。
mm:存放体系结构特有的内存管理程序的实现。
math-emu:模拟FPU的代码。对于ARM处理器来说,此目录用mach-xxx代替。
显然,移植工作的重点就是移植arch目录下的文件。
(2)drivers目录。
该目录下保存了所有设备驱动程序。它占整个内核发行版本代码的一半以上,非常庞大!有些驱动程序是与硬件平台无关的而有些是相关的。
(3)fs目录。
该目录下列出了Linux支持的所有文件系统。目前Linux已经支持包括ntfs在内的多种文件系统。一般说来,文件系统也与硬件平台无关。
(4)include目录。
这里包括编译核心所需要的大部分头文件,例如与平台无关的头文件在include/linux子目录下。不同的平台需要的头文件会有所不同,因此该目录和arch目录一样,按平台划分了多个子目录,如asm-arm目录等。
(5)init目录。
init目录下包含核心的初始化代码(不是系统的引导代码),有main.c和version.c两个文件。这是研究核心如何工作的好起点。
(6)ipc目录。
ipc目录包含了核心进程间的通信代码。
(7)kernel目录。
内核管理的核心代码放在这里,与处理器结构相关的代码都放在arch/*/kernel目录下。
(8)lib目录。
该目录下包括与平台无关的诸如strlen和memcpy之类的通用函数。
(9)mm目录。
该目录包含了所有的内存管理代码。与具体硬件体系结构相关的内存管理代码位于arch/*/mm目录下。
(10)net目录。
该目录里是核心的网络部分代码,其每个子目录对应于网络的一个方面。
(11)其他目录。
还有两个没有提到的目录是Documentation和scripts目录。Documentation目录存放许多文档,非常详细。scripts目录主要在配置内核时用到,存放了配置内核的一些脚本文件,比如后面提到的"make menuconfig"命令。
【责任编辑:云霞 TEL:(010)68476606】
点赞 0