本文简单介绍Linux系统的启动过程,所述操作系统环境基于CentOS6.8内核2.6.32。其它Linux系统大致类似。基本上,整个启动流程如下图:
一、硬件引导启动
用户打开主机电源后,系统将自动执行BIOS程序。BIOS程序首先执行加电自检程序POST(Power On Self Test),主要检测系统关键设备,如CPU、内存、显卡、键盘、鼠标等I/O设备。有时候我们开机时发现系统无法正常显示CMOS信息,这时候大多数时候是因为内存松动了的原因。
BIOS程序自检完成之后,下一步便是根据BIOS中设置的启动顺序搜索相关启动系统的驱动器,如硬盘、光盘、U盘、网络等。我们以硬盘启动为例。BIOS程序此刻将去读取硬盘驱动器的0柱面、0磁头、1扇区(MBR,512字节),然后开始执行bootloader代码。到此,BIOS程序执行完毕,系统的控制权也移交到MBR代码部分。
MBR(Master BootRecord),如上图,它由主引导程序(Bootloader)、分区表(Partition Table)和硬盘有效标示(Magic Number)组成。MBR的内容通常是在安装Linux系统时,由grub程序直接写上进去的。当然,grub程序在安装时也进行了硬件检测并安装了相关的启动文件。
这一部分简单的说就是,BIOS程序引导并加载MBRBootloader程序,也即grub bootloader程序。
二、GRUB启动引导阶段
如上图,GRUB启动引导阶段包含3个阶段。
A.Stage1阶段:
Stage1阶段其实就是执行系统安装时预先写入到MBR的Bootloader中的程序。Stage1阶段的任务仅是将硬盘0柱面0磁道2扇区的内容读入内存并执行,它是Stage1.5阶段或Stage2阶段的入口,引导进入Stage1.5阶段或Stage2阶段。
在此Stage1阶段,还没有识别文件系统的能力。
B.Stage1.5阶段
stage1.5阶段是stage1阶段和stage2阶段的中间桥梁。stage1.5阶段具有识别启动分区文件系统的能力,此后GRUB程序便有能力去访问/boot分区下/grub目录下的 stage2文件,并将stage2载入内存执行。
C.Stage2阶段
Stage2阶段执行时,首先会解析GRUB程序的配置文件grub.conf,并依配置文件决定是否显示系统启动菜单。然后加载内核镜像到内存中,通过initrd程序建立RAMDisk内存虚拟根文件系统。此时控制权将转交给内核程序。
这一部分概括起来即是:GRUB程序加载执行并开始引导Kernel程序。
三、内核引导阶段
内核镜像加载到内存,以及initrd程序建立RAMDisk内存虚拟根文件系统后,内核开始驱动基本硬件,并调用虚拟根文件系统中的init程序加载驱动模块初始化系统中各种设备的相关配置工作,其中包括CPU、I/O、存储设备等。当所需的驱动程序加载完后,会根据grub.conf配置文件中“root=XXX”部分所指定的内容创建一个根设备,然后将根文件系统以只读的方式挂载,并切换到真正的根文件系统上,同时调用系统进程的老祖宗进程/sbin/init程序,进入系统初始化阶段。
这一部分主要是通过在内存中建立虚拟根文件系统实现相关设备的驱动并建立和切换到真正的根文件系统。
四、系统初始化阶段
待续。。。