一、UEFI概述:从起源到行业规范
大家好,我是你们的讲师。在嵌入式固件这行摸爬滚打了十几年,我见过太多工程师一上来就扎进代码里,结果被各种奇怪的启动问题折磨得焦头烂额。其实,很多坑都源于对UEFI本身的理解不够深。今天这第一讲,我们就先把地基打牢。
UEFI,全称是 Unified Extensible Firmware Interface,统一可扩展固件接口。说白了,它就是操作系统和硬件之间的一个“翻译官”。你按下电源键后,CPU 第一个执行的代码就是它。它负责把硬件初始化好,然后找到启动设备,把操作系统内核加载到内存里。
核心观点:UEFI 不是一个操作系统,而是一个定义在操作系统启动之前,硬件平台与操作系统之间的接口规范。它规定了固件应该怎么做,而不是固件本身。
1.1 UEFI的起源:为什么会有它?
在UEFI出现之前,整个PC行业用的都是传统BIOS(Basic Input/Output System)。BIOS从1981年IBM PC诞生起就存在了,算是个老古董。我刚开始做固件时,用的就是BIOS,那会儿觉得它也挺好,直到后来遇到了瓶颈。
传统BIOS有几个硬伤,我简单列一下:
- 16位实模式:BIOS只能在16位模式下运行,寻址空间只有1MB。你想想看,现在的内存动不动16GB、32GB,BIOS根本管不过来。
- MBR分区表:只支持2TB以下的硬盘。现在随便一个服务器硬盘都超过这个数了。
- 启动慢:BIOS启动时要把所有硬件轮询一遍,效率很低。
- 扩展性差:想加个新功能?得改BIOS代码,而且不同厂商的BIOS还不兼容。
到了90年代末,Intel开始推动安腾(Itanium)处理器。安腾是64位的,BIOS那套16位的东西根本跑不起来。于是Intel搞了个EFI(Extensible Firmware Interface),这就是UEFI的前身。后来,2005年,Intel把EFI 1.10规范贡献给了UEFI论坛,由这个行业组织来统一管理和发展,从此改名为UEFI。
个人经验:我参与过一个项目,客户要求支持3TB的硬盘做启动盘。用传统BIOS死活搞不定,最后切换到UEFI才解决。从那以后,我对UEFI的兼容性就特别有信心。
1.2 UEFI与传统BIOS的区别:不只是升级
很多人觉得UEFI就是BIOS的升级版,其实没那么简单。它们俩的架构完全不同。我画了一张对比图,你一看就明白了。
从图上你能看到,UEFI 最大的变化就是脱离了16位实模式的束缚。它运行在32位或64位保护模式下,可以直接访问全部内存。这意味着什么呢?意味着UEFI可以加载更大的驱动、更复杂的图形界面,甚至可以在启动阶段运行网络协议栈。
我整理了一个表格,把关键区别列出来,方便你对照:
| 对比项 | 传统BIOS | UEFI |
|---|---|---|
| 运行模式 | 16位实模式 | 32/64位保护模式 |
| 寻址能力 | 1MB | 理论无限制 |
| 分区表 | MBR(≤2TB) | GPT(支持大容量) |
| 驱动模型 | Option ROM,中断调用 | UEFI Driver Model,Protocol |
| 启动速度 | 慢(轮询硬件) | 快(并行初始化) |
| 安全性 | 无 | Secure Boot |
| 网络支持 | 基本没有 | UEFI Network Stack |
| 用户界面 | 文本菜单 | 图形界面(HII) |
避坑指南:我曾经遇到过一台机器,BIOS里明明开启了UEFI模式,但死活装不上Windows。查了半天,发现是CSM(Compatibility Support Module,兼容性支持模块)没有关闭。CSM是UEFI为了兼容老系统而保留的一个模块,如果你要纯UEFI启动,记得把它关掉,否则可能会出各种奇怪的问题。
1.3 UEFI的行业标准与规范
UEFI不是某一家公司的私有技术,它是一个开放的标准。UEFI论坛(UEFI Forum)负责维护和更新这个规范。目前最新的版本是UEFI 2.10(截至2024年)。
UEFI规范本身是一份非常庞大的文档,我粗略数过,大概有2500多页。不过别怕,我们不需要全部读完。作为固件工程师,你只需要掌握几个核心部分:
- UEFI规范(UEFI Specification):定义了固件与操作系统之间的接口,包括启动服务、运行时服务、Protocol等。
- PI规范(Platform Initialization Specification):定义了固件内部各阶段(SEC、PEI、DXE、BDS等)的架构和接口。这部分我们后面会详细讲。
- ACPI规范(Advanced Configuration and Power Interface):定义了固件如何向操作系统描述硬件资源和电源管理信息。
- SMBIOS规范(System Management BIOS):定义了主板、BIOS版本、内存等系统信息的标准格式。
我画了一张UEFI相关规范的关系图,帮你理清它们之间的联系:
在实际工作中,你接触最多的会是UEFI规范和PI规范。比如,你要写一个UEFI驱动,就得知道Protocol是怎么注册和调用的;你要做启动优化,就得理解PI规范里SEC、PEI、DXE各阶段是干什么的。
我的建议:刚开始学UEFI,不要试图通读规范。先看UEFI规范的前几章,了解基本概念和术语。然后直接上手写代码,遇到不懂的再回头查规范。这样效率最高。我当年就是这么过来的。
1.4 本章小结
这一讲我们聊了UEFI的来龙去脉。从传统BIOS的局限性,到UEFI的诞生,再到它和BIOS的本质区别。最后我们梳理了UEFI相关的规范体系。
记住几个关键点:
- UEFI是一个接口规范,不是具体的固件实现。
- UEFI运行在32/64位保护模式下,突破了BIOS的1MB寻址限制。
- UEFI使用GPT分区表,支持2TB以上的硬盘。
- UEFI规范、PI规范、ACPI规范、SMBIOS规范共同构成了完整的固件生态。