计算机启动流程概述

First Post:

Last Update:

Word Count:
4k

Read Time:
14 min

Boot

boot 这个称呼出自一句谚语:

pull oneself up by one’s bootstraps
拽着鞋带把自己拉起来

拽着鞋带把自己拉起来?这当然是不可能的事情。最早的时候,工程师们用它来比喻,计算机启动是一个很矛盾的过程:必须先运行程序,然后计算机才能启动,但是计算机不启动就无法运行程序!

在早期必须想尽各种办法,把一小段程序装进内存,然后计算机才能正常运行。所以,工程师们把这个过程叫做“拉鞋带”,久而久之就简称为 boot 了。

磁盘

Overview

磁盘通常由多个盘片 (platter) 组成,每个盘片有两个盘面,每个盘面都有一个读/写磁头 (head),盘面从 0 开始自下向上依次编号,比如最下方的盘片具有 0 面和 1 面。

hard drive geometry

每个盘面都被划分为数目相等的磁道,并从 0 开始自外向内依次编号,具有相同编号的磁道形成一个圆柱,称之为磁盘的柱面 (cylinder)。磁盘的柱面数与一个盘面上的磁道数是相等的。

下图为一个盘面,盘面上的同心圆为一条条磁道 (track),一条磁道可以划分为若干扇区 (sector),扇区是磁盘的最小组成单元,通常是 512 字节。簇 (cluster) 是各种文件系统 (如 FAT, NTFS) 中数据的分配单元。在 Linux/Unix 中经常用块 (Block) 来指代扇区或簇。

disk platter

寻址

  • CHS 寻址
    Cylinder-head-sector (CHS) 通过 (cylinder, head, sector) 元组来定义块地址,该方案不适用于硬盘以外的设备。

  • LBA 寻址
    Logical block addressing (LBA) 使用整数索引来定位块,如第一个块为 LBA 0,第二个块为 LBA 1,依此类推。从 CHS 到 LBA 的转换公式为:

    其中 A 是 LBA 地址, 是磁盘上的磁头数量, 是每个磁道的最大扇区数, 是 CHS 地址。

BIOS

Overview

BIOS (Basic Input/Output System) 负责在通电启动阶段初始化硬件,并为操作系统提供运行时服务,是电脑启动加载的第一个程序。早年,BIOS 通常储存于 ROM,现在的 BIOS 多储存于 Flash,方便了 BIOS 的更新。

Boot

bios boot process

  1. 硬件自检
    在电脑通电后,固化在 ROM 里的 BIOS 就会被加载到内存运行,BIOS 首先会进行硬件自检 (Power-On Self-Test, POST),如果硬件出现问题,主板会发出不同含义的蜂鸣,启动中止。如果没有问题,屏幕就会显示出 CPU、内存、硬盘等信息。

  2. 启动顺序
    硬件自检完成后,BIOS 会把控制权转交给下一阶段的启动程序。这时,BIOS 需要知道,“下一阶段的启动程序”具体存放在哪一个设备。也就是说,BIOS 需要有一个外部储存设备的排序,排在前面的设备就是优先转交控制权的设备。这种排序叫做“启动顺序” (Boot Sequence).

    bios boot sequence

    BIOS 与 CMOS 的关系
    CMOS 是计算机上另一个重要的存储器。之所以提到它,是因为 BIOS 程序的设定值、硬件参数侦测值就保存在 CMOS 中。而且,在 BIOS 程式启动计算机时,需要载入 CMOS 中的设定值。UEFI 系统则多用 NVRAM 储存设定。

    BIOS 与 CMOS 的区别
    二者的区别是,BIOS 是储存在只读存储器 ;BIOS 中存储的是程序,而 CMOS 中存储的是普通信息。

  3. 加载 MBR
    BIOS 启动的时候,会按照 CMOS 设置里的顺序,挨个查看存储设备的前 512 字节是不是以 0x55 0xAA (MBR 的 Magic number) 结尾,如果不是,那就跳过找下一个设备;如果是的话,则表示这个磁盘可以启动,加载这 512 字节里的代码,执行之后,后面的事,几乎就跟 BIOS 没啥关系了。这最前面的 512 个字节,就叫做“主引导记录” (Master boot record,MBR),MBR 的主要作用就是告诉计算机到硬盘的哪个位置寻找操作系统。

  4. 硬盘启动
    这时,计算机的控制权就要转交给硬盘的某个分区了,这里又分成两种情况。

    • 情况 A:卷引导记录
      上一节提到,四个主分区里面,只有一个是激活的。计算机会读取激活分区的第一个扇区,叫做 VBR
      “卷引导记录”的主要作用是,告诉计算机,操作系统在这个分区里的位置。然后,计算机就会加载操作系统了。
    • 情况 B:启动管理器
      在这种情况下,计算机读取“主引导记录”前面 446 字节的机器码之后,不再把控制权转交给某一个分区,而是运行事先安装的“启动管理器” (boot loader),由用户选择启动哪一个操作系统。
      例如 Windows 的 bootmgr 和 Linux 的 Grub

UEFI

UEFI (Unified Extensible Firmware Interface),即“统一的可扩展固件接口”,是一种详细描述全新类型接口的标准,是适用于电脑的标准固件接口,旨在代替 BIOS。此标准由 Intel 公司带头组织 UEFI 联盟中的 140 多个技术公司共同创建。

它不仅仅是 BIOS 替换。UEFI 本质上是一个运行在 PC 固件之上的微型操作系统,它可以做的比 BIOS 多得多。它可以存储在主板的闪存中,也可以在启动时从硬盘或网络共享加载。一般的 UEFI 系统仅能识别 FAT32,不同于 BIOS 只能识别固定位置的磁盘引导块。这意味着只要将引导程序放到 FAT32 分区里,UEFI 系统就能通过分区表的指引找到这个保存着引导程序的 FAT32 分区。UEFI 系统是由模块化的 C 语言程序写出来的,所以通过添加或修改程序模块就能获得更多的功能。例如支持更多的文件系统,图形界面,甚至能使用浏览器浏览网页。

MBR

主引导记录 (Master Boot Record, MBR),又叫做主引导扇区,是计算机开机后访问硬盘时所必须要读取的首个扇区,它在硬盘上的三维地址为 (柱面,磁头,扇区) = (0,0,1)。

MBR 具有多个不同版本,可能具有不同的分区表数量,如 Advanced Active Partitions (AAP) 扩展为 5 个 (AST and NEC MS-DOS 3.x) 扩展为 8 个等。此处说明的结构为 classic generic MBR

Disk Layout - MBR

Overview

MBR 位于磁盘的第一个逻辑扇区,即 LBA0 的位置。MBR 只有 512 个字节,放不了太多东西。它的主要作用是,告诉计算机到硬盘的哪一个位置去找操作系统。

(1) 第 1-446 字节:调用操作系统的机器码。
(2) 第 447-510 字节:分区表 (Partition table)。
(3) 第 511-512 字节:主引导记录签名 (0x55 和 0xAA)。

Master Boot Code

MBC 位于 MBR 开头的 446 字节。其中的硬盘引导程序的主要作用是检查分区表是否正确并且在系统硬件完成自检以后将控制权交给硬盘上的引导程序 (如 GNU GRUB)。它不依赖任何操作系统,且启动代码也可修改以实现多系统引导。

在深入讨论主引导扇区内部结构的时候,有时也将其 MBC 特指为 MBR

DPT

考虑到每个区可以安装不同的操作系统,MBR 因此必须知道将控制权转交给哪个区,该任务由硬盘分区表 (Disk Partition Table) 完成,DPT 占据主引导扇区的 64 个字节 (偏移 0x01BE – 偏移 0x01FD),可以对四个分区的信息进行描述,其中每个分区的信息占据 16B。进一步的信息参见 DPT

MBR 分区表使用 4B 来记录分区逻辑地址和扇区总数,故单个分区最大不超过 2TB。再考虑到扇区的逻辑地址也是 32 位,所以单个硬盘可利用的空间最大也不超过 2TB。如果想使用更大的硬盘,只有 2 个方法:一是提高每个扇区的字节数,二是使用 GPT

2TB 怎么来的?
16 字节的分区表中,用于存储分区长度的只有 8B,则分区地址最大值为 ,可以索引 4,294,967,295 个扇区。每个扇区为 512B,则最大空间为:
Bytes
约为 2TB (2,000,000,000,000 Bytes)

Boot signature

55, AA (0x01FE-0x01FF) 为最后两个字节,是检验主引导记录是否有效的标志。

Primary Partition

  • VBR (Volume boot record), 或 PBR (Partition boot record),对应卷引导记录,在分区设备 (如硬盘) 上,它是设备上单个分区的第一个扇区。VBR 中通常包括操作系统的机器代码,VBR 中的代码可由 MBRbootloader 间接调用。卷引导记录的主要作用是,告诉计算机操作系统在这个分区里的位置。上图的蓝色部分。

  • File System:操作系统对磁盘的所有操作都需要经过文件系统,删除文件指的是在文件系统里删除文件的索引条目,创建文件就是在在文件系统里添加索引条目并将具体数据写入磁盘。常见的文件系统格式有:FAText4NTFS。文件系统位置一般在 PBR 之后。上图粉色部分。

Extended Partition

MBR 最多支持创建 4 个主分区。不过,这个限制可以通过创建扩展分区 (Extended Partition) 来绕过 (3 个主分区 + 1 个扩展分区)。在扩展分区中,又可以包含多个逻辑分区 (Logical Partition),但是逻辑分区不能用作引导卷,这也是它的一个重要限制。

计算机先读取扩展分区的第一个扇区,叫做“扩展引导记录” (Extended boot record, EBR)。它里面也包含一张 64 字节的分区表,但是最多只有两项 (也就是两个逻辑分区)。

计算机接着读取第二个逻辑分区的第一个扇区,再从里面的分区表中找到第三个逻辑分区的位置,以此类推,直到某个逻辑分区的分区表只包含它自身为止 (即只有一个分区项)。因此,扩展分区可以包含无数个逻辑分区。

GPT

Overview

GPT (Globally Unique Identifier Partition Table),即全局唯一标识码分区表,简称 GPT 或 GUID 分区表,它是 UEFI 规范的一部分。由于 MBR 和 BIOS 的局限性,GPT 应运而生。GPT 由 GPT 头和 GPT 主体,GPT 备份组成。起始于磁盘 LBA1 的位置,相对的 LBA0 仍然为 MBR,但是这个 MBR 是被保护的,没有引导代码,仅仅有一个被标识为未知的分区,当支持 GPT 分区表的操作系统检索到这个 MBR 后就会自动忽略并跳到 LBA1 读取 GPT 分区表。

gpt structure

Protective MBR (LBA0)

PMBR (Protective MBR) 存在的意义是当不支持 GPT 的分区的程序(例如 MS-DOS 和老版本的 fdisk)在读取使用 GPT 分区的硬盘时,会看到一个被未知类型分区类型 (0xEE) 占用了全部磁盘空间的磁盘,此时会拒绝写入,以防止意外修改 GPT 分区表。而支持 GPT 的系统在检测 PMBR 后会直接跳到 GPT 表头读取分区表。和 MBR 类似,分区表中存储了某个分区的起始和结束位置及其文件系统属性信息。

Partition table header (LBA 1)

分区表头定义了硬盘的可用空间以及组成分区表的项的大小和数量。分区表头还记录了这块硬盘的 GUID,分区表头位置(总是 LBA1)和大小,也包含了备份分区表头和分区表的位置和大小信息(LBA-1 ~ LBA-34)。同时还储存着它本身和分区表的 CRC32 校验。固件、引导程序和操作系统在启动时可以根据这个校验值来判断分区表是否出错,如果出错,可以使用软件从硬盘最后的备份 GPT 中恢复整个分区表,如果备份 GPT 也校验错误,硬盘将不可使用。

Partition entries (LBA2 ~ LBA33)

GPT 分区表使用简单而直接的方式表示分区。一个分区表项的前 16 字节是分区类型 GUID。例如,EFI 系统分区的 GUID 类型是 {C12A7328-F81F-11D2-BA4B-00A0C93EC93B}。接下来的 16 字节是该分区唯一的 GUID(这个 GUID 指的是该分区本身,而之前的 GUID 指的是该分区的类型)。

起始字节 长度 内容
0 16 字节 分区类型 GUID
16 16 字节 分区 GUID
32 8 字节 起始 LBA(小端序)
40 8 字节 末尾 LBA
48 8 字节 属性标签(如:60 表示“只读”)
56 72 字节 分区名(可以包括 36 个 UTF-16(小端序)字符)

Partition backup (LBA-33 ~ LBA-1)

为了减少分区表损坏的风险,GPT 在硬盘最后 (LBA-33 ~ LBA-1) 保存了一份分区表的副本。

DPT

硬盘分区表 (Disk Partition Table) 占据 MBR 的 64 个字节,实现了硬盘分区,硬盘分区有很多好处。DPT 负责告诉操作系统,磁盘的分区有几个,从哪里开始到哪里结束。当将一个磁盘插入已经含有操作系统的机器上时,操作系统会检索这个磁盘的分区表,并正确认识它的分区结构。一个磁盘是先有分区表,后有分区,然后才有文件系统,有了文件系统才能被操作系统读写删。磁盘分区表格式目前主要有两种,分别是 MBR 分区表和 GPT 分区表。

DPT 占据 64 个字节,可以对四个分区的信息进行描述,其中每个分区的信息占据 16 个字节。每个主分区的 16 个字节,由 6 个部分组成:

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

GPT vs MBR

上文提到,DPTGPTMBR 两种分区表:

MBR & GPT structure

Boot Loader

Grub

GRUB (Grand Unified Boot loader) 是硬盘中的软件,引导器 (loader) 的一种。目前主流版本是 GRUB2

GRUB 用于从多操作系统的计算机中选择一个系统来启动,或从系统分区中选择特殊的内核配置。

结构

Grub 启动代码 (boot.img) 直接安装在 MBR 中,然后执行 GRUB 内核镜像 (core.img),最后从 /boot/grub 中读取配置和其他功能代码。

grub2 structure

  • MBR 分区表中,boot.imgcore.img 都在 MBR 中。MBR 虽然只占用一个扇区 (512Byte),但是其所在的磁道是空闲的,不会用于分区,可以放下 core.img

Some MBR code loads additional code for a boot manager from the first track of the disk, which it assumes to be “free” space that is not allocated to any disk partition, and executes it. – MBR Wikipedia

  • GPT 分区表中,MBRprotected MBR (为兼容 MBR,在硬盘起始位置保留的空间),后面并没有空间放 core.img,需要建一个专门的分区来放,称为 BIOS boot partition,该分区的文件类型为 unformattedflagBOIS_grub,该 flag 用于标识 core.img 所要安装到的分区。若使用 UEFI 引导,GRUB 读取的是 ESP 分区中的数据,不需要 flagBIOS_grub 的分区。

REFER