1. UEFI 概述:从 BIOS 到 UEFI 的演进
大家好,我是你们的讲师。咱们这门课要聊的是 UEFI 启动流程。第一节课,我想先带大家看看,这东西到底是怎么来的,它比老 BIOS 强在哪,以及它的规范体系长什么样。
说实话,我入行那会儿,还在跟 Legacy BIOS 打交道。那时候调一个显卡 Option ROM,动不动就撞上 640KB 常规内存的墙。后来转到 UEFI 平台,感觉就像从 DOS 时代直接跳到了 Windows——虽然上手有点别扭,但用惯了是真回不去了。
1.1 为什么要有 UEFI?BIOS 的痛点
老 BIOS(Basic Input/Output System)从 1981 年 IBM PC 诞生就存在了。它设计之初,压根没想过 30 年后还能用。所以它有几个硬伤:
- 16 位实模式:CPU 一上电就在 16 位模式下跑,只能访问 1MB 地址空间。你想想看,现在一块显卡的显存都不止 1GB,这怎么玩?
- MBR 分区表:最大只支持 2TB 硬盘。我有个朋友买了块 4TB 的盘,插上去 BIOS 认不全,最后只能当两块用——这体验,嗯,很糟糕。
- 中断向量表:所有硬件操作靠 INT 中断,扩展性极差。加个新设备,得写一堆汇编。
- 单线程、无保护:BIOS 执行期间,整个系统就它一个在跑,死机了就是真死机,连个错误日志都留不下。
核心矛盾:BIOS 是为 8086 处理器设计的 16 位固件,而现代 CPU 是 64 位、多核、大内存。这个代沟,不是打补丁能解决的。
1.2 UEFI 的诞生与演进
UEFI 的前身是 Intel 的 EFI(Extensible Firmware Interface),最早用在安腾(Itanium)平台上。2005 年,Intel 把它捐给了 UEFI 论坛,从此变成了行业标准。
我个人习惯把 UEFI 的演进分成三个阶段:
| 阶段 | 版本 | 关键变化 |
|---|---|---|
| 萌芽期 | EFI 1.0 ~ 1.10 | Intel 主导,定义基础接口,支持 64 位启动 |
| 标准化期 | UEFI 2.0 ~ 2.3 | UEFI 论坛接管,加入安全启动、网络协议 |
| 成熟期 | UEFI 2.4+ | ARM 支持、HTTP Boot、TLS、Measured Boot |
我记得在 2012 年左右,Windows 8 强制要求支持 UEFI 安全启动,那会儿很多主板厂商还在 BIOS 和 UEFI 之间搞「兼容模式」。结果呢?用户经常搞混,启动不了系统。后来大家才慢慢统一到纯 UEFI。
1.3 UEFI 到底强在哪?
说白了,UEFI 就是一个微型操作系统。它有自己的驱动模型、内存管理、网络栈,甚至还能跑 Shell 脚本。咱们对比一下:
| 特性 | Legacy BIOS | UEFI |
|---|---|---|
| CPU 模式 | 16 位实模式 | 32/64 位保护模式 + 长模式 |
| 寻址空间 | 1MB | 理论无限制(实际受硬件限制) |
| 分区表 | MBR(2TB 上限) | GPT(9.4ZB 上限) |
| 驱动模型 | Option ROM(16 位) | UEFI 驱动(PE32+ 格式) |
| 启动速度 | 慢(轮询检测) | 快(事件驱动 + 并行初始化) |
| 安全性 | 无 | Secure Boot、Measured Boot |
| 网络支持 | 基本没有 | IPv4/IPv6、HTTP Boot、iSCSI |
避坑指南:我曾经在移植一个老网卡驱动时,发现它在 UEFI 下怎么都加载不了。查了半天,原来是 Option ROM 里还嵌着 16 位 BIOS 代码,UEFI 根本不认。解决方案是让厂商重新编译成 UEFI 驱动格式(.efi)。所以,如果你还在用 Legacy 模式的网卡,趁早换吧。
1.4 UEFI 规范体系结构
UEFI 规范不是一本书,而是一整套文档。我习惯把它分成三层来看:
- 底层:UEFI 运行时服务(Runtime Services)和启动服务(Boot Services)。这是固件和操作系统之间的契约。
- 中间层:UEFI 协议(Protocols)。比如磁盘协议、网络协议、图形输出协议。所有硬件操作都通过协议完成。
- 上层:UEFI 应用(Applications)。比如启动管理器、Shell、固件设置界面。
下面这张图,是我自己画的一个简化版 UEFI 架构。你把它理解成一座楼:地基是硬件,一楼是 UEFI 核心,二楼是各种协议,三楼是应用。
这里有个关键点:UEFI 的协议是动态发现的。设备插上去,驱动加载,然后协议安装到句柄数据库(Handle Database)里。应用通过 LocateProtocol() 或 OpenProtocol() 来获取接口。这种设计,说白了就是「即插即用」的固件版。
注意:UEFI 规范本身不规定具体实现。同样的规范,Intel 的 TianoCore、AMI 的 Aptio、Insyde 的 H2O,实现细节差异很大。你在一个平台上调通的代码,换到另一个平台可能就崩了。所以,写 UEFI 代码时,尽量用标准协议,少碰厂商私有接口。
1.5 小结
这一章咱们聊了 UEFI 的来龙去脉。从 BIOS 的 16 位桎梏,到 UEFI 的 64 位自由;从 MBR 的 2TB 天花板,到 GPT 的 9.4ZB 海量空间。UEFI 不是简单的 BIOS 升级,而是一次彻底的架构革命。
我个人觉得,理解 UEFI 最好的方式,就是把它当成一个「启动时的迷你操作系统」。它有进程(事件)、有内存管理、有驱动模型、有文件系统。后面咱们会一步步深入,看看这个迷你系统到底是怎么把操作系统拉起来的。