读内核源代码是一件很有意思的事。它像一条线,把操作系统,编译原理,汇编语言,计算机组成原理,C 语言,数据结构与算法,计算机系统结构等等计算机的基础课程串起来。而分析linux的启动很重要,因为牵涉到硬件的初始化和内核各模块初始化环境的搭建,所以我们就针对linux/arch/x86下的代码,对从打开PC电源到屏幕上出现shell环境,来对整个Linux的初始化过程进行一个全方位的分析,希望能有帮助,不足之处,还请各位网友不吝赐教。
1 引子
目前,市面上的大多数计算机系统的内存都是“随机性”的:一旦关机断电,存储在内存中的信息、连同操作系统本身都会丢失。所以,必须把操作系统(内核)的程序存储在某种永久性的介质中,使得开机加电时有一个从不挥发介质装入操作系统、并转入运行的过程,这个过程就叫做“引导”(bootload,或boot),也称为“自举”。
1.1 上电
我们只关注x86体系的这个过程,CPU所在的主板会有一个特殊的硬件电路在CPU的RESET引脚上产生一个电平。这时,CPU处于实地址模式中,并开始自检,自检的最后一个步骤是把一些寄存器(如cs和eip)设置成固定值。我们知道,实模式下的寻址方法是16位段寄存器左移4位加上16位偏移构成具有能寻址1MB能力的20位地址。所以,刚开始时,复位输入提供一种初始化的硬件手段:标志寄存器设为0xuuuu0002(u代表未定义,实模式下9