### Linux内核解读入门
#### 一、核心源程序的文件组织
Linux内核源代码的组织遵循一种清晰且逻辑严谨的结构,旨在方便开发者理解和维护。根据“Linux 内核解读入门.pdf”中提到的信息,核心源程序的文件结构可以概括如下:
- **Arch**:该目录包含了所有与特定体系结构相关的内核代码。对于Intel x86架构的用户,`i386`子目录是重点,其中存放了针对Intel CPU及其兼容体系结构的代码。PC用户通常关注此目录。
- **Include**:这是一个关键目录,包含编译内核所需的大部分头文件。`include/linux`子目录包含与平台无关的头文件,而`include/asm-i386`则专门针对Intel CPU相关的头文件。此外,`include/scsi`目录存储了SCSI设备相关的头文件。
- **Init**:此目录包含了内核的初始化代码,但并非系统的引导代码。它主要包括`main.c`和`Version.c`两个文件,是理解内核工作原理的良好起点。
- **Mm**:此目录包含了所有与内存管理相关的代码,特别是与页式存储管理相关的内存分配和释放。与体系结构相关的内存管理代码位于`arch/*/mm/`目录下。
- **Kernel**:这里存放了内核的主要代码,包括多数Linux系统内核函数的实现。`sched.c`是最为重要的文件之一,而与体系结构相关的代码则存放在`arch/*/kernel`目录中。
- **Drivers**:这个目录包含了所有的设备驱动程序,每种驱动都有自己的子目录。例如,`block`子目录下存放的是块设备驱动程序,如IDE驱动(`ide.c`)。`drivers/block/genhd.c`中的`device_setup()`函数负责初始化所有可能包含文件系统的设备,包括硬盘和网络设备。
- **Lib**:此目录包含内核的库代码。
- **Net**:存放与网络相关的内核代码。
- **Ipc**:该目录包含进程间通信(IPC)的代码。
- **Fs**:所有文件系统代码和各种类型文件操作的代码都位于此目录下,其每个子目录支持一种文件系统,如`fat`和`ext2`。
- **Scripts**:此目录包含用于配置内核的脚本文件。
每个目录通常包含`.depend`和`Makefile`文件,前者用于追踪依赖关系,后者用于定义编译规则。`Readme`文件提供了目录下文件的额外说明,有助于深入理解内核源码。
#### 二、解读实战:为内核增加一个系统调用
尽管Linux内核源代码的组织结构合理,但由于其规模庞大且复杂度高,跨目录文件之间的关联错综复杂,这往往让初学者感到望而生畏。然而,深入了解内核代码不仅能让人学到计算机底层知识,还能提升编程技巧,甚至在分析过程中逐渐专业化。
为了帮助读者更好地理解内核组织和分析方法,我们以在内核中添加一个系统调用为例进行讲解。以Intel Pentium II CPU和Redhat Linux 6.0系统为基础,使用内核版本2.2.5。
1. **系统的引导和初始化**:Linux系统可以通过多种方式引导,如Lilo、Loadlin或自举引导(bootsect-loader)。无论采用哪种方式,最终都会跳转到`arch/i386/kernel/setup.S`,这是从实模式向保护模式过渡的关键点。`setup.S`主要负责保护模式下的初始化工作。
#### 结论
Linux内核源代码的深度和广度远超想象,其组织结构和文件布局旨在优化可读性和可维护性。通过细致的解读和实战练习,如添加系统调用,开发者能够逐步掌握内核的精髓,提升自身技能,并对专业编程有更深层次的理解。