1、UEFI概述:从BIOS到UEFI,一场固件革命
大家好,我是你们的固件工程讲师。今天咱们聊聊UEFI——这个现代计算机启动时第一个跑起来的软件。说实话,我入行那会儿还在跟BIOS打交道,后来亲眼看着UEFI一步步取代它。这中间的故事,挺有意思的。
1.1 UEFI的历史:为什么要有它?
先说说BIOS。BIOS(Basic Input/Output System)从1981年IBM PC时代就有了。它跑在16位实模式下,代码只能访问1MB内存。你想想看,现在随便一个手机都有8GB内存,BIOS却只能看到1MB——这差距太大了。
BIOS有几个硬伤:
- 16位实模式:只能寻址1MB,代码效率极低
- MBR分区表:最大支持2TB硬盘,现在4TB硬盘都普及了
- 启动慢:每次都要自检所有硬件,开机等半天
- 扩展性差:想加个新功能?得改BIOS源码,风险极高
我在2010年做过一个项目,客户要求支持3TB硬盘。用BIOS?不行,MBR根本不认。最后只能上UEFI。那次经历让我深刻体会到——BIOS真的老了。
UEFI(Unified Extensible Firmware Interface)最早叫EFI,是Intel在2000年左右搞出来的。后来统一成了UEFI论坛标准。说白了,它就是BIOS的现代替代品。
1.2 UEFI vs BIOS:核心区别
| 特性 | BIOS | UEFI |
|---|---|---|
| 运行模式 | 16位实模式 | 32/64位保护模式 |
| 寻址空间 | 1MB | 无限制(取决于CPU) |
| 分区表 | MBR(最大2TB) | GPT(最大9.4ZB) |
| 启动速度 | 慢(全自检) | 快(快速初始化) |
| 驱动模型 | 无标准驱动接口 | 有标准驱动协议 |
| 网络支持 | 基本没有 | 原生支持网络协议栈 |
| 安全性 | 无安全启动 | 支持Secure Boot |
核心要点:UEFI本质上是一个微型操作系统。它有驱动程序模型、协议接口、甚至自己的Shell。BIOS只是个固件,UEFI是个平台。
1.3 UEFI规范核心概念
UEFI规范里几个关键概念,我建议你记牢:
1.3.1 固件与协议
UEFI里一切都是协议(Protocol)。你想访问硬盘?用Block IO协议。你想显示文字?用Simple Text Output协议。每个协议就是一个接口,驱动实现了协议,应用调用协议。这种设计让UEFI非常模块化。
我记得有一次调试一个NVMe硬盘不识别的问题。查了半天,发现是NVMe驱动没有正确安装Block IO协议。嗯,这种问题在UEFI开发中很常见。
1.3.2 启动管理器
UEFI的启动管理器(Boot Manager)负责决定启动顺序。它读取NVRAM里的启动项,然后逐个尝试。每个启动项指向一个EFI应用——比如Windows的bootmgfw.efi,或者Linux的grubx64.efi。
小技巧:你可以用bcfg命令在UEFI Shell里手动添加/删除启动项。我曾经在系统起不来时,靠这个命令从U盘启动修复了引导。
1.3.3 运行时服务与启动服务
UEFI把服务分成两类:
- 启动服务(Boot Services):只在启动阶段可用。比如分配内存、加载驱动、安装协议。一旦调用
ExitBootServices(),这些服务就没了。 - 运行时服务(Runtime Services):操作系统启动后仍然可用。比如读取系统时间、设置NVRAM变量。
这里有个坑:你在驱动里分配了内存,如果没在退出启动服务前释放,操作系统就再也拿不回来了。我曾经因为这个导致系统内存泄漏,查了两天才找到原因。
1.4 UEFI启动流程概览
好,现在咱们看看UEFI从按下电源键到加载操作系统,到底经历了什么。我画了一张流程图,帮你理清思路。
启动流程分七个阶段,我一个个说:
- SEC(Security)阶段:CPU刚上电,执行第一条指令。做安全验证、初始化缓存作为临时内存。代码量极小,通常只有几百行汇编。
- PEI(Pre-EFI Initialization)阶段:初始化真正的内存,发现基本硬件。这个阶段很关键——没有内存,啥也干不了。
- DXE(Driver Execution Environment)阶段:加载各种驱动,安装协议。这时候UEFI才真正活起来。显卡驱动、硬盘驱动、网络驱动都在这里加载。
- BDS(Boot Device Selection)阶段:启动管理器登场。它读取启动顺序,尝试加载操作系统引导程序。
- TSL(Transient System Load)阶段:操作系统引导程序(比如GRUB)开始执行。它准备加载内核。
- RT(Runtime)阶段:调用
ExitBootServices(),UEFI交出控制权。操作系统接管所有硬件。 - AL(After Life)阶段:操作系统完全运行。UEFI只提供运行时服务,比如ACPI表、系统重置等。
注意:在ARM平台上,ATF(ARM Trusted Firmware)会在SEC阶段之前运行。ATF负责初始化安全世界,然后才跳转到UEFI的SEC阶段。这个对接细节,我们后面章节会详细讲。
1.5 我的经验总结
做了这么多年固件,我总结了几点:
- UEFI不是BIOS的升级版,而是完全不同的架构。别用BIOS的思路去理解UEFI。
- 协议是UEFI的灵魂。学会写协议、用协议,你就掌握了UEFI开发的核心。
- 启动流程的每个阶段都有严格的内存使用规则。在PEI阶段别想着用堆,在DXE阶段别想着直接访问硬件。
- 调试UEFI很难。我建议你从一开始就配好串口输出,不然出了问题只能干瞪眼。
嗯,第一章就到这里。内容不少,但都是基础。把这些概念吃透了,后面讲ATF对接时你才不会懵。