计算机的启动过程

最后一次更新时间:Wednesday, May 12th 2021, AM

 

0. 引言

给 PC 上电之后,按下开机键,是如何进入 Windows 的呢

按下开机键,主板接收到开机指令,首先开始 POST 上电自检,然后是加载 OS。这个过程称之为“引导”[1]

引导的英文单词是“boot”,boot 并不是取于“靴子”,而是“鞋带” bootstrap 的缩写。

为什么会从“鞋带”上取词?这来自于一句谚语 Pull oneself up by one’s bootstraps,意为“拽着鞋带把自己拉起来”。这是一句很矛盾的话,然而用来形容计算机的启动却非常合适:必须先启动程序,计算机才能启动;然而不启动计算机,就无法运行程序。

工程师们利用嵌入式系统这种方法,把一小段程序装进内存,使得硬件上电自动执行程序,并幽默地把这个过程称之为“拉鞋带”。久而久之,这个过程就被简称为 boot 了。

另有一种说法,把 POST 自检称为“硬引导”,把 OS 加载称为“软引导”

在引导阶段,主要控制 PC 的是 固件(BIOS 或 UEFI)

1. POST开机自检

POST 是 Power-On Self-Test 的缩写,属于 BIOS 的功能之一。POST 是针对于 PC 硬件的检查,先检查计算机必须的硬件如 CPU,RAM 等,其次检查非必须的硬件如 ROM,PCI Express,CD-ROM,可移动介质等。自检通过之后,则进入下一阶段——加载 OS[2]

2. 加载 OS

固件(BIOS 和 UEFI)按照规定,此时会把控制权交给排在第一位的存储设备。

PC 读取该设备的第一个扇区,即最前面的512字节。若该512字节的最后两个字节是 0X550XAA,表明该存储设备可以用于启动。若不是,则控制权顺移至下一个存储设备。

这里,以 MBR 格式的硬盘作为示例,进行说明。

(在 MBR 格式的硬盘中)第一个扇区中存放的内容有:

  • 主引导记录 (Master Boot Record, MBR):446 bytes [1, 446]
  • 分区表 (Partition Table) :64 bytes [447, 510]
  • 主引导记录签名:2 bytes [511, 512]

在MBR格式的硬盘中,分区表的最大值固定为64字节,且分成4项,每项分得16个字节。即一个硬盘最多4个一级分区,又称作主分区。每个分区又由6部分组成:

  1. 字节(0, 1]:如果该字节为 0X80,就表示该分区激活,控制权要转交给该分区。4个分区中只能有一个激活分区。
  2. 字节[2, 4]:主分区第一个扇区的物理位置(柱面、磁头、扇区号等)
  3. 字节(4, 5]:主分区类型
  4. 字节[6, 8]:主分区最后一个扇区的物理位置
  5. 字节[9, 12]:该主分区第一个扇面的逻辑地址
  6. 字节[13, 16]:主分区的扇区总数

其中,最后4个字节“主分区的扇区总数”决定了这个主分区的长度。即一个主分区的扇区总数不能超过2^32次方。如果每个扇区为512字节,那么单个分区无法超过2TB。再考虑到扇区的逻辑地址也是32位,所以单个硬盘的最大空间也无法超过2TB[3]

读取到激活的主分区之后,就可以从激活的主分区中启动 OS 了。这一部分就不详细说明了,每个操作系统都不一样。


在 PC 上,OS的加载通常分成两部分:第一阶段的主引导记录(Master Boot Record,MBR),用于第二阶段引导位于某个分区中的(主分区)的引导。

这么设计的背后,其实是历史遗留问题。在以前,OS 比较简单的时候,用来引导 OS 的代码并不是很复杂,可以直接装载于 MBR 中。后来 OS 越来越复杂,MBR 放不下引导 OS 的代码,这才有了第二阶段引导[4][5]

当然,随着如今计算机的发展,除了传统 BIOS 通过读取 MBR 的这种方式来引导 OS 的加载,还有 UEFI 这种新兴的技术,无需二次跳转,可以直接由 EFI 应用程序(.efi文件)来引导加载 OS。下图为传统 BIOS 与 UEFI 的一些对比。

除了这些 UEFI 还比传统 BIOS 多了 SecureBoot 机制,可以防止 PC 在启动时被攻击(有可能导致同盘的 Linux 无法顺利启动)。

现代的 BIOS 和 UEFI 都支持从多种设备上启动,如硬盘、光驱、USB 设备等。固件(BIOS 和 UEFI)允许用户自行设置启动顺序。

另请参阅


除特别声明外,本站所有文章均采用 CC BY-SA 4.0 协议 ,转载请注明出处!