Linux 系统启动过程的分析
1、对于一台安装了Linux系统的主机来说,当用户按下开机按钮时,一共要经历以下几个过程:BIOS自检 ---> 系统引导 ---> 启动内核 ---> 初始化系统。
2、BIOS自检
(1) BIOS(Basic Input/Output System),又称基本输入输出系统。
(2) BIOS 的功能由两部分组成,分别是POST码和Runtime服务。(3) POST码:上电自检POST(Power-on self test),主要负责检测系统外围关键设备(如: CPU、内存、显卡、I/O、键盘鼠标等)是否正常。
(4) Runtime服务: 根据在BIOS中设置的系统启动顺序来搜索用于启动系统的驱动器,如硬盘、光盘、U盘、软盘和网络等。以硬盘启动为例,BIOS此时去读取硬盘驱动器的第一个扇区(MBR,512字节),然后执行里面的代码。实际上这里BIOS并不关心启动设备第一个扇区中是什么内容,它只是负责读取该扇区内容、并执行。
(5) 至此,BIOS的任务就完成了,此后将系统启动的控制权移交到MBR部分的代码。
3、系统引导
(1) MBR(Master Boot Record)主引导记录:硬盘的0柱面、0磁头、1扇区称为主引导扇区。它由三个部分组成,主引导程序(Bootloader)、 硬盘分区表DPT(Disk Partition table)和硬盘有效标志(55AA) 。
(2) 通常情况下,诸如lilo、grub这些常见的引导程序都直接安装在MBR中。我们以grub为例来分析这个引导过程。
(3) grub引导也分为两个阶段stage1阶段和stage2阶段
(4) stage1: stage1是直接被写入到MBR中去的,这样机器一启动检测完硬件后,就将控制权交给了GRUB的代码。stage1的任务非常单纯,仅仅是将硬盘0头0道2扇区读入内存。
(5) stage2:0头0道2扇区的/stage2/start.S文件,当它的内容被读入到内存之后,主要作用就是负责将stage2或stage1.5从硬盘读到内存中。
4、 启动内核
(1) 当stage2被载入内存执行时,它首先会去解析grub的配置文件/boot/grub/grub.conf,然后加载内核镜像到内存中,并将控制权转交给内核。
(2) 内核会立即初始化系统中各设备并做相关的配置工作,其中包括CPU、I/O、存储设备等,Linux的设备驱动程序的加载,有一部分驱动程序直接被编译进内核镜像中,另一部分驱动程序则是以模块的形式放在initrd(ramdisk)中。
(3) 当所需的驱动程序加载完后,会创建一个根设备,然后将根文件系统rootfs以只读的方式挂载。这一步结束后,释放未使用的内存,转换到真正的根文件系统上面去,同时运行/sbin/init程序,执行系统的1号进程。此后系统的控制权就全权交给/sbin/init进程了。
5、 初始化系统
(1) /sbin/init进程是系统其他所有进程的父进程,当它接管了系统的控制权限之后,它首先会去读取/etc/inittab文件来执行相应的脚本进行系统初始化,如设置键盘、字体,装载模块,设置网络等。
(2) 执行系统初始化脚本: 对系统进行基本的配置,以读写方式挂载根文件系统及其它文件系统。
(3) 执行/etc/rc.d/rc脚本
(4) 执行用户自定义引导程序/etc/rc.d/rc.local 。
(5) 完成了系统所有的启动任务后,linux会启动终端或X-Window来等待用户登录。