系统杂谈.01 关于系统引导,从 BIOS 到 UEFI

写在开头

这是这个系列文章的第一篇,从 Windows 到 Linux 又到 Mac OS X ,与操作系统相关的各种东西我都会来聊聊。更新内容完全随我心情,估计还会有一个硬件杂谈的系列,不会特定一个特定型号的产品,主要来聊聊理论方面的知识。

前言

最初想要谈这个,是因为我想再写一篇各方面都能符合我个人美学要求的系统安装方案。具体来说,就是纯 UEFI 引导。开机时显示主板厂商的 LOGO ,以及达到最快的开机自检速度是十分重要的一件事情。这篇文章就是为了达到那个目标而需要具备的一些基础知识。

写完之后发现这个变成了一个讲历史的文章

关于BIOS

BIOS 不管怎么说,对电脑有点了解的人都应该会听说过什么是 BIOS。

BIOS 已经存在了很多年的时间。基本上,电脑开机的时候加载的第一个程序就是 BIOS。这个程序是储存在主板上的 ROM 或者 NVRAM 上的,一般来说现在的主板使用的都是可插拔式的,方便损坏的时候拿去维修。有的游戏主板甚至拥有两套 NVRAM 存储,就是所谓的双 BIOS 主板。在设置错误的时候或者刷坏了 ROM 的时候,还可以启动备用 BIOS 来修复。

平常可能还能听到一个词叫 CMOS ,其实是指一种类型的半导体,相机的那个 CMOS 也是指所用的半导体技术。不过在电脑中所说的 CMOS ,其实就是一种 RAM ,即内存。而且是易失性的内存,断电之后数据将丢失,所以主板上会有一个纽扣电池负责维持数据的保存。

其实只要知道 BIOS 芯片是用来存储 BIOS 程序, CMOS 是用来存储其设置的就足够了。

BIOS 负责各种设备的初始化和检验,以及加载引导程序。当然还有其他作用,不过不在本文范畴内。

开始引导(BIOS)

好了,这个时候电脑开机了, BIOS 完成了硬件的自检,接下来他的任务是什么呢?当然就是从你指定的启动设备里寻找引导程序了。

传统的 BIOS 只能够引导 MBR 分区表的硬盘。关于 MBR 分区表的详细解析可以看这里。启动的时候首先读取在 BIOS 设置里面设置为首要启动项目的硬盘,然后从 MBR 分区表中读出活动分区所在的位置,并从该分区加载引导程序和操作系统。

MBR structure

第一个加载的引导程序是 PBR ,也属于分区表的一部分。图中可以看到,每个分区前都有 PBR 部分。设置了活动分区之后,BIOS 就会加载该分区头部的 PBR。它可以导出为一个 512byte 的文件。

PBR 负责读取文件系统中的系统引导程序。

比如去读取 Windows XP 在 C 盘里的 ntldr 文件,ntldr 再负责根据 boot.ini 中的设置,开始加载操作系统。

在 Windows Vista 之后就是 bootmgr 文件了,然后读取 BCD 配置,加载操作系统。

在 BIOS 时代,引导损坏很多时候是分区表的 PBR 损坏了,如果没有 PBR 的存在,BIOS 不知道应该加载哪一个引导程序,毕竟除了 Windows 就在换的 ntldr 和 bootmgr 以外,还有 grub 等等。

EFI BIOS 的进化

由于传统的 BIOS 已经诞生了很长的时间了,已经跟不上现在操作系统和硬件的发展,所以 Intel 推出了 EFI 。

EFI 是一个模块化的小型操作系统,作用和传统 BIOS 差不多,也需要完成硬件的初始化,以及系统的引导。但最重要的一点是 EFI 是可以加载驱动程序的。刚才也说过,他是一个小型化的操作系统。当加载了各种网卡,显卡等等的驱动之后,便能够实现现在很多主板都有的在线 BIOS 更新,以及启动时自适应屏幕分辨率。

在 EFI 出现之后,也一同带来了 GPT 分区表,可以支持任意多的分区数量。当然,纯 EFI 环境下也只能引导 GPT 分区表硬盘的操作系统。

如今的 UEFI

原本的 EFI 是 Intel 一家在使用,不过到了后来 Intel 把其公开了 出去。到了 EFI 2.0 的时候干脆建立一个独立的联盟负责对这个项目进行维护,并且改名为了 UEFI 。支持了 USB 的鼠标和键盘,对显卡也添加了 GOP VBIOS 的规范。

开始引导(UEFI)

在 UEFI 中已经不存在保存在分区表中的 PBR 了,多了一个 BDS 启动阶段,全称为 Boot Device Selection 。

和 PBR 的作用一样, BDS 阶段就是加载存放在硬盘分区中的引导文件,后缀为 .EFI 。不同的地方在于,这个程序不再保存在分区表中,而是保存在 BIOS 芯片中。他的启动方式更像现在的 bcd , grub 等,指定了引导程序所在的硬盘目录,以及一些加载的选项。如果你用过 EFI Shell 就会知道 , .efi 文件就像是 Windows 下的 .exe 文件,直接运行就能启动对应的引导程序。

UEFI 默认加载的文件是 EFI 分区下的  EFI\BOOT\bootx64.efi 。也就是说,你插入一个硬盘,建立一个 FAT32 的分区,只要在里面放入 bootx64.efi 就可以不做任何修改,直接在 UEFI 中选择该设备启动,并加载这个引导文件。设备选项会显示为 UEFI:xxxxx硬盘型号xxxxx

当然,更加符合标准的做法还要把该分区的标识设置为 EF ,虽然大部分主板并不会强制要求。

如果你觉得这样不够美观,UEFI 启动的条目是可以自行添加的。这时候就能够指定启动项目的名称,具体引导文件的路径。比如为 Windows 安装后添加的 windows boot manager。

以下是一个使用 BOOTICE 查看启动项配置的一个例子,相信看了图你就会感觉很熟悉,如果你有折腾过 BCD 的设置,或者 boot.ini。

Bootice Example

关于CSM

CSM 是一个兼容模块,有的主板中可能将这个功能标注为 Legacy BIOS 。目的是为了在 UEFI 中支持传统 MBR 分区表的引导方式。不支持 GOP VBIOS 的显卡启动的时候也需要打开这个功能。

自从 WIndows 7 x64 之后,基本所有的操作系统都支持了纯 UEFI 启动,所以开启 CSM 简直就是一个异端行为,活生生降低了开机的速度和美感。

总结

到这里你应该已经了解了传统 BIOS 和 UEFI BIOS 的引导过程了。我没有深入的讲解整个引导的过程,但基本上你可以知道启动的过程中加载了哪一些文件,遇到引导相关的问题就可以清晰定位到哪一个部分出现了问题了。

如果发现了什么错误,或者还有什么疑问的话欢迎提出。