深入理解Linux启动过程
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
本文详细分析了Linux桌面操作系统的启动过程,涉及到BIOS系统、LILO 和GRUB引导装载程序,以及bootsect、setup、vmlinux等映像文件,并结合引导、启动原理和具体的代码实现机制由浅入深地进行了分析.
初学者刚接触Linux桌面系统会感觉系统启动速度较慢,那么,为什么它的启动速度慢呢?本文就桌面系统的引导和启动过程展开分析,以期对初学者熟悉Linux有所帮助.
一、Linux系统的引导过程
简单地说,系统的引导和启动过程就是计算机加电以后所要发生的事情, 比如,加电自检、引导程序的拷贝和执行、内核的拷贝和执行及用户程序的执行等.这个过程就是常说的bootstrap,我们把这些归纳为5个过程, 下面来逐一分析.
1.BIOS执行阶段
现代计算机系统的存储机制是“挥发”性的,一旦关机断电, 存储在内存中的信息.连同操作系统本身的映射就丢失了.,把操作系统(内核) 的映像存储在某些不“挥发” 的介质中,开机加电时由一个不“挥发”介质加载操作系统,并转入运行的过程.这就是引导,也称自举.这些不“挥发” 介质通常是指硬盘或软盘, 也可以是EPROM 或F1ash存储器,还可以是网络中别的节点.要想在开机时从不“挥发” 介质装入操作系统的映像,系统就要CPU在开机时能执行一段程序,这段程序本身存储在作为系统内存一部分的EPROM 或Flash等存储器中, 它们知道怎样才能从不“挥发” 介质装入操作系统的映像.事实上,各种CPU 被设计成一个加电后就从某个特殊的地址开始执行指令,这些不挥发存储器就被安置在这个位置上.比如在i386CPU系统中,计算机在加电的那一刻,RAM 芯片中所包含的是随机数据,还没有操作系统,在此刻有一个特殊硬件电路在加电时会在C P U 的一个引脚上产生一个RESET逻辑值,硬件电路设置RESET逻辑值以后,代码寄存器CS的内容为0xffff,而指令寄存器的内容为0.也就是说,CPU要从线性地址0xffff0开始处取第一条指令.硬件电路再把这个物理地址映射到RAM 芯片中,BIOS就存放在这里,这时候处理器就开始执行BIOS代码了.我们都知道BIOS中包含了几个中断驱动的低级程序,可以使用它们来初始化一些硬件设备,但它们是在实模式下工作的.其中实模式地址是由一个seg段和一个off偏移量组成的,相应的物理地址可以使用“seg*16 off” 来计算.
接下来BIOS要做的就是执行一系列的测试,看看到底系统中有什么设备,以及这些设备是否正常工作.在执行这个过程时,会显示一些如BIOS系统的版本号等信息.当检测到可用的设备后就进行一些初始化工作,比如初始化PCI设备以避免I RQ线与I/O端口的冲突,显示系统中安装的所有PCI设备的一个列表.
在早期的计算机系统中, 类似于BIOS功能的程序非常小,并且不同时期这段程序的设计也不相同.在PC发展早期, 当时存储芯片大小的限制,该段程序的目的和功能都很单一 再说,如此小的一段程序很难依靠自身的力量把庞大的操作系统的映像从磁盘里读进来.于足,人们又提出了引导扇区的概念,存储在引导扇区中的程序来协助BIOS完成操作系统的引导工作.但是,引导扇区的大小也不过5l2个字节, 能够容纳的信息和代码也很有限,说,操作系统的引导代码是一个循序渐进的过程,它分布在不同的角落.当BlOS根据设置将相应的启动设备的第一个扇区的内容拷贝到RAM 中时, 这些内容被放在物理地址0x0O007c00开始的地方.此后,系统就开始跳到这个地址,并开始执行相应的代码.
2.Boot Loader阶段
如此小的引导记录要完成这么大的任务,压力是不小的,引导扇区的程序及辅助程序很简练,它们都采用汇编语言编写,这些源代码都存放在arch/ 下具体CPU名下的boot目录中,如bootsect.S、setup.S和video.S.其中bootsect.S是Linux引导扇区的源代码.这样,经过编译、汇编和连接以后,形成了3个组成部分,即引导扇区的映像bootsect、辅助程序setup及内核映像本身(通常是vmlinux,有时也用uImage).严格地说,bootsect和setup并不是内核的一部分.
|