
BIOS 和 UEFI 历史与区别
BIOS 和 UEFI 是两种不同的引导方式,尽管现在大部分人仍然习惯于说“BIOS 设置”,但事实上从 2015 年开始各种主板就慢慢换成了 UEFI,所谓的“BIOS 设置”指的其实是 UEFI 设置。另一方面,经常玩虚拟机的小伙伴会发现虚拟机往往仍会使用 BIOS 启动模式。
所以这两种模式有什么区别呢?想知道这个答案我们就要来看看这俩玩意儿的发展历程。
目录
BIOS
BIOS 全称 Basic Input/Output System,基本输入输出系统,是最早出现的,它的历史可以一路追溯到那个人们还习惯于叫”IBM 兼容机“的时代。因为电脑具有可以自定义的特性,配置往往各不相同,传统的用在大型机上的那一套东西在这里不好用。BIOS 的出现最早就是为了解决这个问题,一部分和硬件有关的初始化流程被移交 BIOS 负责,这样就可以通过一套流程来适配各种不同的硬件。当然 IBM 的工程师们并没有意识到 BIOS 实际上允许了兼容机的出现,其他厂商只需要为自己的硬件实现一套可用的 BIOS,就可以使他们的计算机支持运行 MS-DOS 以及其上的各类软件。
IBM 知道这事之后气炸了,可惜兼容机的发展已经不可阻挡,之后很长一段时间个人计算机都使用 BIOS 作为引导模式……
好吧扯的有点远了,总之 BIOS 的出现其实不仅仅是为了启动系统,也有协调硬件的功能。不过既然要引导系统,那就得有一种方式,来了解系统放在了硬盘的什么地方。
这种方式就被称作 MBR。当然磁盘驱动肯定也是必不可少的,因为 BIOS 先于电脑的任何其他部分运行,BIOS 里会自带磁盘驱动。
MBR
MBR,全称 Master Boot Record,即主引导记录,既指代一种硬盘的格式,也指代这种格式硬盘的一个特定区域。
注意这里的格式指的是硬盘本身存储分区的格式,不是什么 NTFS,EXT4 这种东西,这些叫文件系统的格式,也很重要,但是和 MBR 与否没有联系。
MBR 磁盘的第一个扇区就被叫做 MBR,里面存放的是引导代码。是的没错,就是要把引导代码塞进一个扇区可怜的 512 字节内(实际的最大值还要更小一点,在 440 字节左右,因为后面的分区表之类的信息也要放在这里),因此不管是 Linux 还是 Windows 都会把引导软件所需要的其他一些内容,例如各种配置,存放在其他地方。
MBR 后就是分区表,大小同样很小,只能存放四个分区的信息。如果想要存放多于四个分区那么就需要借助于扩展分区,原理是在原来第四个分区的位置放置一个分区表,此时“第四个”分区内就可以再次划分出更多的分区(称为逻辑分区),也就是最多 4 个主分区或 3 个主分区 + 1 个扩展分区。(现在 Windows 的磁盘管理器内也会显示“主分区”这个字眼,哪怕你不是 MBR 磁盘。)分区表的大小是 64 b,一个分区只占用 16 b,这也是为什么 MBR 最大只能支持单个分区不超过 2 TB 的硬盘。

最后是一个结束标志位 0x55AA。自此之后就是数据了,至于数据要怎么排放,那就是文件系统的任务了。
BIOS 在启动系统的时候,会按照 CMOS 设置中所记录的顺序,依次查找硬盘上是否存在 MBR,如果有则按照 MBR 的说明启动系统。
一个特例是软盘,BIOS 在有软盘的时候会优先启动软盘,而且是不管软盘中是否有可启动的系统的。
PBR/VBR
从上面的说明中也可以看出,MBR 实在是太小了,小到不可能塞进完整的引导加载程序。一般来讲,MBR 中的代码只够放下足够多的代码,让系统将另一段(大得多)的程序载入内存。
PBR 指 Partition Boot Record,VBR 指 Volume Boot Record。似乎 Windows 对分区和卷分的比较清楚,虽然我不是很懂(划掉)这俩其实是一个东西。
和 MBR 不同,PBR/VBR 从名字就可以看出来,它是位于分区中的,具体来讲,是分区的前几个扇区。(MBR 不属于任何一个分区。)其中不仅包含引导代码,也包含扇区本身的各种信息。具体什么信息当然依然是和文件系统有关的,这里不进行详细介绍。系统启动流程中,在经过 MBR 之后,就会把控制权交到 PBR/VBR 这里。
和 MBR 不同,PBR/VBR 的大小实际上是不定的。GRUB 就可以选择把 Stage 1.5 的代码塞进 PBR/VBR 里面,通常是一些磁盘驱动。
跳转到 PBR/VBR 后,终于可以加载分区中真正的引导程序了。例如 Linux 的 GRUB,Windows 的 NTLDR(NT 6.0 以前)或 Bootmgr(从 NT 6.0 开始使用)。
此外,一个分区是否处于“活跃”状态,就存放在 PBR/VBR 里面。不活跃的分区是无法用于引导的。(尽管有些引导程序是不管这个的)
EFI
随着个人电脑的发展,BIOS 越来越不够用,这个问题谁最头疼呢,没错是苹果,当时正值 Mac OS X 转向 Intel 平台的关键时期,于是苹果的人找到英特尔的人,说我们合作搞个引导方式吧,于是出现了 EFI,Extensible Firmware Interface,注意是 EFI,没有那个 U,U 要再过一段时间才能出现。
EFI 彻底摒弃了 BIOS 那套东西,其中最大的特点在于,BIOS 在引导系统前一直都运行在实模式下,不仅不安全,寻址空间也小的可怜(只有 1 MB),而 EFI 却可以运行在保护模式下,具有更强的安全性,也支持更大的寻址空间。如今 UEFI 的设置界面往往十分华丽,都要感谢这个特点。
虽说 EFI 是下一代引导模式,不过它干的活依然是“基本输入输出系统”,这就是为什么 Windows 下还是会显示“BIOS 模式”。

好吧又扯远了,BIOS 对应的是 MBR,那么 EFI 也要对应一种磁盘格式。如果你曾经做过“初始化硬盘”的这个操作的话,那么相信聪明的你已经想到了,这个磁盘格式就叫做 GPT。
再说一遍这个 GPT 和聊天机器人没有关系。
GPT
全称是 GUID Partition Table,即 GUID 分区表,和 MBR 一样,又可以代表一种磁盘格式,又可以代表磁盘开头的那一长串内容。
GPT 磁盘没有 MBR 磁盘那样绕来绕去的情况,一会儿又是主分区、扩展分区、逻辑分区……一会儿又是 MBR、PBR……在 GPT 下,只存在分区和分区的属性,哪怕是引导代码,也不会单独存放在某个独特的位置,然后起个诸如 GBR 这样的名字,而是像电脑上其他的、普普通通的程序那样,存放在一个 .efi 格式的文件里。
GPT 的分区表很大,可以放下 128 个分区,但并不是没有限制。分区的最大大小也来到了 ZB 的级别,可以说是根本用不完,至少在我们的有生之年里不需要一个新的磁盘格式了。
刚才说 GPT 下的引导程序不会放在很独特的位置。相比于 MBR 那肯定是普普通通了,不过要是你和那些 .exe 什么的比,那还是有一点特殊的。
通常来讲这些 .efi 格式的引导程序会被放在一个叫做 ESP 的地方,EFI System Partition,即 EFI 系统分区。注意是分区,货真价实的分区,而不是某几个扇区。也就是说 ESP 你想设置多大就可以多大,自然里面也可以装下多得多的数据,不管是什么样子的引导程序,都可以完整的放在 ESP 当中,再也不需要为了启动一个系统,在磁盘上反复横跳了。

EFI 识别 ESP 的方式理论上是通过 GPT 分区属性进行的,尽管实际操作中,简单的把 .efi 文件丢进分区里面一个名为 EFI 的文件夹有的时候也是可行的。
不过这个时候 EFI 才刚刚出现,各大系统对它的支持仍然稀烂,只有提出这个规范的苹果在 MacBook 上早早的用上了 EFI。
扩展阅读:GPT 与 MBR 混合格式
苹果电脑上有一个名叫 Boot Camp 的功能,作用是同时启动 macOS 和 Windows 系统。然而就像我们刚刚说的那样,当时的 Windows 还不支持 EFI,自然也不支持 GPT。苹果想了个奇招,也就是 GPT/MBT 混合,在当年的 Mac 上使用 Boot Camp 功能会把你的硬盘变成既有 GPT 又有 MBR 的样子。
后来的 Windows 支持了 UEFI 启动,也就没必要这样操作了。
再后来的话苹果直接抛弃了 Intel,那就又没有 EFI 甚至 Boot Camp 什么事了……(现在的 Mac 启动用的是和 iPhone/iPad 等设备相同的 iBoot 方式。)
扩展阅读 2:磁盘逻辑锁
如果硬要说一个 GPT 磁盘比 MBR 差的地方,那么就是磁盘逻辑锁了。磁盘逻辑锁的基本原理就是,创建一个虚假的分区表信息,在其中一个分区结束的时候把“下一个分区”的位置重新指回这个分区的开头,导致系统无法正确识别分区信息,引发系统无法启动的问题。
因为 EFI 在引导 GPT 磁盘的时候强依赖于分区信息,只要存在磁盘逻辑锁,就无法开机,插 PE 也没有用,因为在启动 PE 之前 EFI 也依然需要知道磁盘上有哪些分区,导致卡死,根本走不到进入 PE 的那一步。
MBR 引导的时候因为存在 MBR -> PBR/VBR 的过程,系统刚刚启动时无需关注分区信息,反而不受影响,插上 PE 就可以正常启动然后进行修复。
这个特点一度导致曾经的“高级主板”遇到磁盘逻辑锁更加难修……
UEFI
EFI 在发展到规范版本 1.1 后,英特尔决定拉更多厂商下水加入这个规范,并且和这些厂商一起,推出了规范版本 2.0,名称也改为 UEFI。
这个 U,就是 Unified 的意思。Unified Extensible Firmware Interface,统一可扩展固件接口。

Windows 8 也是第一个原生支持 UEFI 启动的 Windows 系统。
UEFI 整体上和 EFI 是差不多的,也有相同的安全功能。其中最为人所知的就是令某些人闻风丧胆的“安全启动”,它会对启动时加载的那些代码进行校验,如果校验失败,则不允许启动。虽然对于希望安装非主流系统的人来说不太友好,但实际上还是很好的保护了电脑,至少那种劫持 MBR 然后开机直接加密整个磁盘的病毒一去不复返了。
CSM 是 UEFI 中的一个兼容性模块,你可以把它简单的理解成 UEFI 上模拟的 BIOS,开启了 CSM 的电脑同样可以引导 MBR 格式的磁盘。同时,就算继续使用 GPT 磁盘和 ESP 分区,CSM 也允许启动代码执行某些仅在 BIOS 下允许的操作。
事实上 Windows 7 的 UEFI 支持是不完整的,哪怕不用 MBR 也需要开启 CSM,主要的问题就在于 Windows 7 的开机动画不兼容 UEFI……是的没错就是个开机动画……
扩展阅读:UEFI 的几种类别
UEFI 根据所支持功能的不同分为几种 Class(类别):
- Class 0:仅使用 BIOS 的系统。(话说这个为什么在这里……)
- Class 1:采用 UEFI ,但仅支持 CSM 的系统,即无法启动纯 UEFI 系统。
- Class 2:采用 UEFI,且支持 CSM 的系统。可以同时启动 UEFI 和传统系统。
- Class 3:采用 UEFI,且不支持 CSM 的系统。只能启动纯 UEFI 系统。
- Class 3+:在 Class 3 的基础上启用了安全启动的系统。
扩展阅读 2:安全启动
UEFI 的明星功能之一就是这个安全启动。
事实上安全启动是一套完整的安全体系,并不仅仅是躺在 UEFI 设置里的一个开关。安全启动会使用各种密钥对启动系统前所运行的所有代码进行校验。
具体怎么校验的我不知道(???),这里我就简单介绍一下安全启动里的各种密钥和数据库。
首先是 PK 和 KEK。PK 即 Platform Key,平台密钥,只有一份,通常是 OEM 或主板厂商写在主板里的,可以用来签名 KEK。和 SSL/TLS 里面的 CA 是一种东西。KEK 指 Key Exchange Key,密钥交换密钥,可以用来签名 DB 和 DBX,也是 CA。通常来讲主板会放置一个微软的 KEK,还可能放一个自己的。
接下来是 DB 和 DBX。DB 指信任数据库,DBX 则是吊销数据库。一般来讲 DBX 用的比较多,一旦启动过程中发现某个程序使用了存放在 DBX 里面的密钥进行签名则也会终止启动进程。
这里你可能会发现一个问题,所有的信任证书里要么是厂商,要么是微软……
那么那些支持安全启动的各种 Linux 是哪里来的?
这也是安全启动机制最受争议的一个点,具体什么情况我这里就不讲了,这些 Linux 发行版之所以能够支持安全启动,主要是微软给它们签发了一份 shim.efi 文件,由于有微软签名,这个文件可以通过安全启动的校验。
当然为了防止任何人拿着这个 shim.efi 就胡作非为,它在加载最终的操作系统的时候会自己进行一次校验,这次的校验会使用自带的一些证书(即 Linux 发行版们自己的证书)和 MOK,Machine Owner Key,其中 MOK 是后续添加的。(是的没错 MOK 不是 UEFI 规范里的,而是一个引导程序自己整的活
)
除了这些密钥之外,安全启动还支持设置启动策略。说这个名字你可能没感觉,但这就是手机上那个人人喊打的 BL 锁。
设置了安全启动策略之后就可以实现仅允许电脑启动某个系统,且拒绝启动其他任何一种系统,哪怕你是微软亲生的 Windows 11 官方正版安装盘也不行。主流系统不会设置这个内容,不过微软的一些狠活系统,例如 Windows 10X,Windows 365 客户端,就都会写入这个策略。
想要清除的话需要清空 NVRAM,好在不需要编程器,用 EFI Shell 就可以解决。安全启动策略是不影响直接加载 EFI 文件的。
另外,安全启动是会校验设备驱动程序的。这就是为什么一些比较老的设备无法在安全启动下运行。
扩展阅读 3:EFI 文件是什么格式
和 EXE 一模一样的 PE 格式。
BIOS 和 UEFI 区别
好吧,不扯什么历史了,现在我们就来总结一下,BIOS 和 UEFI 到底有什么区别:
| 项目 | BIOS | UEFI |
|---|---|---|
| 磁盘格式 | MBR | GPT、MBR[1] |
| 运行模式 | 实模式 | 长模式、保护模式[2] |
| 安全性 | 弱 | 强 |
| 启动速度 | 慢 | 快 |
| 支持的系统 | 16 位、32 位、64 位 | 16 位[1]、32 位[1]、64 位 |
- UEFI Class 3 和 3+ 是没有 CSM 的,也就不支持从 MBR 启动,或者启动低于 64 位的操作系统。MBR 磁盘本身依然可以被操作系统读取。
- UEFI 的保护模式并没有真的支持页表等保护功能,程序依然可以访问任意位置,尽管寻址空间在这么一搞之后确实变大了……
新一点的电脑基本上都是 UEFI 启动,分界线在 2015 年左右。即,只要你的电脑不是老古董,就可以确定是 UEFI 了。如果要使用低于 64 位的操作系统,或是比较老的系统,例如 Windows 7,Windows XP,则要么使用 BIOS,要么需要开启 CSM。此外前几年的新设备都陆陆续续升级到了 UEFI Class 3,也就是说无法再启动这些系统了,最低只能够到达 Windows 8。
UEFI 因为支持保护模式,往往界面会炫酷一点。但这并不代表 UEFI 设置的界面一定是炫酷的,我之前家里有一台 UEFI Class 2 的电脑,那玩意儿的 UEFI 设置就和 BIOS 差不多。此外 UEFI 没有中断机制,只能通过轮询来调用硬件,导致 UEFI 下程序的运行效率其实是偏低的。
再看下 MBR 和 GPT 的区别:
| 项目 | MBR | GPT |
|---|---|---|
| 分区数量 | 4 个主分区/3 个主分区 + 1 个扩展分区 | 128 |
| 最大分区大小 | 2 TB | 9.4 ZB |
| 引导代码位置 | MBR/PBR/VBR | ESP |
常见的说法是 MBR 对应 BIOS 而 UEFI 对应 GPT,这个说法也不能说错,但最多只能算推荐做法。从上面我们可以看到 UEFI 也完全有能力支持 MBR 磁盘。
不过,如果你是比较大的硬盘,那么只可以使用 GPT 格式,如果执意要用 MBR 的话会导致超过 2 TB 的部分被浪费掉。此外虽说只是推荐做法,但它也确实是推荐做法,UEFI 的系统一般不建议搭配 MBR 格式的磁盘。

