Linux 内核源代码漫游 创建时间:2001-10-11 21 时 13 分
第 1 页 共 9 页
Linux 内核源代码漫游
Alessandro Rubini 著, rubini@pop.systemy.it
赵炯 译,gohigh@sh163.net (www.plinux.org)
本章试图以顺序的方式来解释 Linux 源代码,以帮助读者对源代码的体系结构以及很多
相关的 unix 特性的实现有一个很好的理解。目标是帮助对 Linux 不甚了解的有经验的 C 程
序员对整个 Linux 的设计有所了解。这也就是为什么内核漫游的入点选择为内核本身的启始
点:系统引导(启动)。
这份材料需要对 C 语言以及对 Unix 的概念和 PC 机的结构有很好的了解,然而本章中并
没有出现任何的 C 代码,而是直接参考(指向)实际的代码的。有关内核设计的最佳篇幅是
在本手册的其它章节中,而本章仍趋向于是一个非正式的概述。
本章中所参阅的任何文件的路径名都是指主源代码目录树,通常是/usr/src/linux。
这里所给出的大多数信息都是取之于 Linux 发行版 1.0 的源代码。虽然如此,有
时也会提供对后期版本的参考。这篇漫游中开头有
图标的任何小节都是强调 1.0 版本
后对内核的新的改动。如果没有这样的小节存在,则表示直到版本 1.0.9-1.1.76,没有作
过改动。
有时候本章中会有象这样的小节,这是指向正确的代码以对刚讨论过的主题取得
更多信息的指示符。当然,这里是指源代码。
引导(启动)系统
当 PC 的电源打开后,80x86 结构的 CPU 将自动进入实模式,并从地址 0xFFFF0 开始自
动执行程序代码,这个地址通常是 ROM-BIOS 中的地址。PC 机的 BIOS 将执行某些系统的检
测,在物理地址 0 处开始初始化中断向量。此后,它将可启动设备的第一个扇区读入内存地
址 0x7C00 处,并跳转到这个地方。启动设备通常是软驱或是硬盘。这里的叙述是非常简单
的,但这已经足够理解内核初始化的工作过程了。
Linux 的最最前面部分是用 8086 汇编语言编写的(boot/bootsect.S),它将由 BIOS 读
入到内存 0x7C00 处,当它被执行时就会把自己移到绝对地址 0x90000 处,并将启动设备
(boot/setup.S)的下 2kB 字节的代码读入内存 0x90200 处,而内核的其它部分则被读入到地
址 0x10000 处。在系统加载期间将显 示信息"Loading..." 。然后控制权将 传递给
boot/Setup.S 中的代码,这是另一个实模式汇编语言程序。
启动部分识别主机的某些特性以及 vga 卡的类型。如果需要,它会要求用户为控制台选
择显示模式。然后将整个系统从地址 0x10000 移至 0x1000 处,进入保护模式并跳转至系统
的余下部分(在 0x1000 处)。
下一步是内核的解压缩。0x1000 处的代码来自于 zBoot/head.S,它初始化寄存器并调
用decompress_kernel(),它们依次是由zBoot/inflate.c、zBoot/unzip.c 和 zBoot/misc.c
组成。被解压的数据存放到了地址 0x10000 处(1 兆),这也是为什么 Linux 不能运行于少于
2 兆内存的主要原因。[在1兆内存中解压内核的工作已经完成,见 Memory Savers--ED]
将内核封装在一个 gzip 文件中的工作是由zBoot 目录中的 Makefile 以及工具完
成的。它们是值得一看的有趣的文件。
内核发行版 1.1.75 将 boot 和 zBoot 目录下移到了 arch/i386/boot 中了,这个改
动意味着对不同的体系结构允许真正的内核建造,不过我将仍然只讲解有关 i386 的信息。
解压过的代码是从地址 0x10100 处开始执行的[这里我可能忘记了具体的物理地址了,