- 加载BIOS(Basic Input and Output System)
系统在刚开机时须完成自举,而在硬件内有一个固化的指令能完成这一点。它能在开机时自动将某个硬件的内容装载进内存,将BIOS程序映射进CPU可以查找的线性地址空间或物理地址空间,而内存的ROM中的指令信息的第一段主要完成系统硬件健康状况检查,例如有无显卡,显卡是否正常,有无内存设备,CPU风扇能否运转等。若检查通过,BOIS运行时按照CMOS(保存计算机基本启动信息的芯片,是BIOS上一块可读写的并行或串行的flash芯片,用来保存计算机硬件配置和用户对默写参数的设置)设置的顺序来搜索处于活跃状态并可以引导的设备:可以是软盘,硬盘上的某个分区,网络上的某个设备,甚至为USB闪存。通常,Linux从硬盘引导,其中主引导记录MBR(Master Boot Record)包含了主引导加载程序。MBR是一个512字节大小的扇区,位于磁盘上的第一个扇区中(0道0柱面1扇区),当MBR被加载到RAM中后,BIOS就会将控制权交给MBR。
- 读取MBR
主引导记录存放了系统预启动信息,分区表信息。系统找到了BIOS所指定的硬盘的MBR后,会将其复制到物理内存中,即Boot Loader。(Boot Loader分为grub,lilo,spfdisk等)
- Boot Loader
Boot Loader是在内核运行之前运行的一段小程序,是计算机启动过程中运行的第一个真正的软件,负责加载启动硬盘分区中的操作系统。通常每个操作系统在安装过程中都要将自带的启动引导器写入硬盘,以便能够进行自身的引导。
Boot Loader可以初始化硬件设备,建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,为最终调用操作系统内核做好一切准备。
- 加载内核
根据grub设定的内核映像所在路径,系统读取内核映像,并进行解压缩操作。当内存映像被加载到内存之后,内核阶段开始。内核映像并不是一个可执行的内核,而是一个压缩过的内核映像。在这个内核映像前面是一个例程,它实现少量硬件设置,并对内核映像中包含的内核进行解压,然后将其放入高端内存中。如果有初始RAM磁盘映像,就会将它移到内存中并标以后使用。接下来该例程会调用start-kernel()函数,启动一系列的初始化函数并初始化各种设备,完成Linux核心环境的建立。至此,Linux内核已经建立起来了。
- init进程执行
init进程是系统所有进程的起点,内核在完成核内引导后,即在本线程(进程)空间内加载init进程,进程号是1。init进程是所有进程的发起者和控制者。在Linux中,它是第一个运行的进程,所以init进程的编号为1。如果init进程出现问题,系统的其余部分也不可用。
init进程有2个作用:一,扮演父进程的角色。由于init进程永远不会终止,若某个进程在它衍生出来的子进程终止前被终止,就会出现必须以init进程为参照的情况,即失去父进程的子进程都会以init作为它们的父进程。二,在进入某个特定运行级别时运行相应的程序,以此对各种运行级别进行管理。
Linux的运行级别有如下7种:
0:关机
1:单用户模式
2:无网络支持的多用户模式
3:有网络支持的多用户模式
4:保留,未使用
5:有网络支持,有x—window支持的多用户模式
6:重启
- init进程执行rc.sysinit
在设定了运行等级后,Linux执行的第一个用户层文件就是/etc/rc.d/rc.sysinit脚本程序,包括设定PATH,设定网络配置(/etc/sysconfig/network),启动swap分区,设定/proc等。
- 启动内核模块
依据/etc/modules.conf文件或/etc/modules.d目录下的文件来装载内核模块。
- 执行不同运行级别的脚本程序
根据运行级别不同,系统会运行rc0.d到rc6.d中相应的脚本程序,来完成相应的初始化工作和启动相应的服务。
- 执行/etc/rc.d/rc.local
rc.local就是在一切初始化工作后,Linux留给用户进行个性化的地方,可以想把你设置和启动的东西放到这里。
- 执行/bin/login程序,进入登录状态。
此时,系统已经进入到等待用户输入username和password的时候了。