1. BIOS自检
1.1 什么是BIOS
BIOS是连接软件与硬件的一座“桥梁”,是计算机的开启时运行的第一个程序,主要功能是为计算机提供最底层的、最直接的硬件设置和控制。
对X86架构设备而言,主板上一般会有一个独立的BIOS芯片(一般为一个Norflash芯片),内部固化程序,上电会直接从BIOS开始引导运行。
BIOS阶段大概处于PC机开机时候显示厂商标识并且提示让按F1/F2/F12/DEL进BIOS阶段,进入BIOS之后可以进行一系列的配置。
1.2 主要功能
加电自检(POST):
功能是检查计算机硬件是否良好,自检中如发现有错误,将按两种情况处理:对于严重故障(致命性故障)则停机,此时由于各种初始化操作还没完成,不能给出任何提示或信号;对于非严重故障则给出提示或声音报警信号,等待用户处理。
初始化:
创建中断向量、设置寄存器、对一些外部设备进行初始化和检测等,其中很重要的一部分是BIOS设置,主要是对硬件设置的一些参数,当计算机启动时会读取这些参数,并和实际硬件设置进行比较,如果不符合,会影响系统的启动。
引导程序:
功能是引导Dos或其他操作系统 ,此时会在硬盘读取引导记录,然后把计算机的控制权转交给引导记录,由引导记录把操作系统装入电脑,在电脑启动成功后,BIOS的这部分任务就完成了。
2. 加载MBR到DDR
MBR是硬盘上的一个扇区,包含三部分内容(引导程序、分区表及分隔标识,MBR总计512字节;其中引导程序最多占446个字节)。
BIOS程序运行会将硬盘上MBR数据加载引导到DDR内存里面,由于MBR里面有引导程序以及分区信息,此时分区表也已经在内存里面了,同时对系统的控制权从bios过渡到了MBR中的引导程序。
对于ubuntu系统而言,一般采用GRUB(类似uboot的地位)作为引导程序(Boot Manager)。
3. 引导执行Grub
GRUB是一个系统引导程序,分为两个阶段。
3.1 引导启动Grub第一阶段
第一阶段一般是汇编编写的,代码段直接存放在MBR里面作为引导程序,主要实现的功能有:
- 基本的硬件设备初始化(屏蔽所有的中断、关闭处理器内部指令/数据cache 等)
- 为加载 Bootloader 的Stage2 准备空间。
- 如果是从某个固态存储媒质中,则拷贝 Bootloader 的stage2 到RAM 空间中。
- 设置好堆栈。
- 跳转到 stage2 的C 程序入口点。
3.2 引导执行Grub第二阶段
GRUB的第二阶段一般是C编写的,一般存放在磁盘分区里面,通常是/boot/grub/,它所完成的主要功能有:
- 初始化本阶段要使用到的硬件设备。
- 检测系统内存映射。
- 将kernel 映像和根文件系统映像从flash 上读到RAM 空间中。
- 为内核设置启动参数
- 调用内核。
4. 引导内核,启动init进程
X86架构ubuntu系统的内核一般存放在/boot目录下,系统引导加载内核完毕会加载并跳转到init即系统1号进程执行,操作控制权交接给init。
init进程会进行一系列的系统初始化,启动各个进程任务,我们最终的桌面以及应用程序都是从init直接或间接启动起来的。