一、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的升级版,其实没那么简单。它们俩的架构完全不同。我画了一张对比图,你一看就明白了。

传统BIOS vs UEFI 架构对比 传统BIOS 16位实模式 寻址空间:1MB MBR分区表(≤2TB) 中断调用(INT 13h等) 扩展性差,厂商锁定 UEFI 32/64位保护模式 寻址空间:理论无限制 GPT分区表(支持大容量) Protocol/Handle驱动模型 模块化,可扩展,跨平台

从图上你能看到,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相关规范体系 UEFI 规范 (核心) 操作系统 (OS) PI 规范 (固件内部架构) ACPI 规范 SMBIOS 规范 说明:UEFI规范是核心,定义了OS与固件的接口;PI规范定义了固件内部各阶段的实现架构; ACPI和SMBIOS则是辅助规范,分别负责电源管理和系统信息描述。

在实际工作中,你接触最多的会是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规范共同构成了完整的固件生态。