Linux 从摁下电源键到 GUI 界面的出现,需要经历一系列的启动过程,这里将对这个过程进行简单的分析。

传统启动方式

BIOS 启动

开机程序被写入ROM,开机后从中读取BIOS (basic input output system)即带有强烈锯齿的界面,其为汇编写成,所以只有很简单的功能。

硬件自检

BIOS需要对硬件进行POST(Power-On Self-Test),检查计算机硬件是否符合基础启动条件。如果存在问题的话,蜂鸣器会出现对应的叫声;正常的话则会标准输出硬件基本信息。

启动引导

BIOS将按照启动排列顺序从对应的设备进行启动,系统安装的时候,希望从U盘启动就是更改这里的顺序。

系统引导

读取对应存储设备上的前512个Byte,从而得知对应的存储设备是否可以用于启动,这512个Byte就被叫做Master boot record(MBR)。这也就是不是随便一个存储设备就可以直接启动的,需要使用软件进行改写。根据MBR,计算机就知道启动对应存储设备的操作系统了。

多系统并存

由于工作需要,有时候需要在一台电脑上安装两个操作系统,这时候MBR就需要知道用户需要启动哪一个操作系统,这就和MBR的结构有关了。

MBR的256的Byte由三部分所组成,其1-446Byte是所要调用操作系统的机械码,447-510Byte为分区表,551-512为所引导记录签名。分区表的64个字节最多只能分成4项即四个一级分区(主分区),只有其中一项可以被作为激活分区。这种分区方法有缺陷,就是主分区最后的四个字节决定了主分区的扇区数量,最大就是2^32个扇区,一般即为2TB。

启动系统

在MBR中被确定激活的分区,在这个阶段会被读取,并开始启动对应的操作系统。在多于四个的操作系统中,这个方法并不适用。更见常见的作法是在读取MBR前面的446Byte之后,不是直接转交给那个主分区,而是使用安装好的启动控制器来确定需要启动哪个操作系统,Linux中最为常见的启动控制器是Grub。

操作系统

操作系统的内核首先被加载到内存之中,之后读取配置,逐项进行加载与启动。

现代启动方式

现代的电脑基本使用UEFI(Unified Extensible Firmware Interface),但是由于习惯问题,还是称其为BIOS。因为现代的电脑多为64位系统,不必要限制于内存加载的大小,其为C语言编制,现在所谓的可视化BIOS且可使用键盘和鼠标都是它的作用。换句话来说,UEFI启动不同于传统的BIOS只有基本的功能,其更像是一个小型的操作系统。由于其有统一的接口与标准,只要是符合UEFI标准的操作系统可以兼容在各种主板之上,同时把那随着UEFI,一种新型的文件系统GPT被引入。GPT文件系统可以支持多分区,同时单分区大小不再限制于2TB。

加载过程

打开电源后,UEFI首先会进行预加载,负责将CPU和内存进行检查与初始化。在初始化完成之后,就会枚举各个硬件的UEFI驱动进行加载,完成初始化,这种方式会比使用中断进行加载快很多,当硬件全部加载完成后,就会加载操作系统。

参考资料

  1. http://www.ruanyifeng.com/blog/2013/02/booting.html
  2. https://zhuanlan.zhihu.com/p/54108702
  3. https://zhuanlan.zhihu.com/p/25941340