1. UEFI概述:UEFI与BIOS的区别、发展历史与行业意义

各位同学,咱们今天正式开讲《UEFI启动流程深度剖析》的第一章。在深入代码和协议之前,我觉得有必要先把UEFI这个“老朋友”的身世捋清楚。你可能会问:“我平时按电源键就能开机,管它BIOS还是UEFI干嘛?”嗯,等你真正遇到系统起不来、或者想定制启动流程的时候,就知道这些底层知识有多重要了。

1.1 从BIOS到UEFI:一次不得不做的升级

先说说BIOS。BIOS的全称是Basic Input/Output System,它从1981年IBM PC时代就开始服役了。说实话,它很稳定,但也很“老”。我早年做嵌入式开发时,被BIOS的16位实模式折腾得够呛——你想想看,一个现代CPU要切换到16位模式去跑BIOS,这本身就是一种妥协。

BIOS有几个硬伤:

  • 只能从MBR启动:MBR分区表最大只支持2TB硬盘,而且只能有4个主分区。
  • 16位实模式:寻址空间只有1MB,代码效率极低。
  • 扩展性差:想加个新功能?得改BIOS源码,还得过主板厂商的认证流程。

UEFI(Unified Extensible Firmware Interface)就是来收拾这个烂摊子的。它最早是Intel在2000年左右搞的EFI规范,后来统一成了UEFI论坛的标准。说白了,UEFI就是一个运行在32位或64位模式下的微型操作系统——它有驱动模型、有协议栈、甚至有网络功能。

核心区别一句话总结:BIOS是固化在ROM里的汇编代码,UEFI是一个可编程的、模块化的固件框架。

1.2 UEFI vs BIOS:一张表看懂差异

我习惯把对比做成表格,这样一目了然。下面这张表是我在项目里经常翻出来看的:

对比维度 BIOS UEFI
运行模式 16位实模式 32/64位保护模式或长模式
寻址空间 1MB 理论无限制(实际受硬件限制)
分区表 MBR(最大2TB) GPT(最大9.4ZB)
启动速度 慢(逐项初始化) 快(并行初始化)
驱动模型 无标准驱动接口 UEFI Driver Model
网络支持 基本没有 内置HTTP、iSCSI、PXE等
安全性 无 Secure Boot、TPM支持
用户界面 文本菜单 图形界面(可定制)

避坑指南:我曾经在移植UEFI到一个老平台时,发现BIOS的SMI中断和UEFI的Timer协议冲突。折腾了两天才定位到问题——所以,如果你做混合模式开发,一定要先搞清楚硬件的中断路由。

1.3 UEFI的发展历史:从Intel的“私生子”到行业标准

UEFI的发展史,其实是一部PC固件行业的进化史。我把它分成几个关键节点:

  1. 1998-2000年:Intel的EFI原型。Intel在开发安腾处理器时,发现BIOS根本撑不住64位环境。于是他们搞了个“Intel Boot Initiative”,后来改名叫EFI。
  2. 2005年:UEFI论坛成立。Intel把EFI规范捐给了统一可扩展固件接口论坛,从此UEFI不再是Intel一家的事。AMD、Microsoft、AMI等厂商都加入了。
  3. 2010年:UEFI 2.3规范发布。这个版本引入了Secure Boot,直接影响了Windows 8的启动要求。我记得当时很多Linux发行版都因为Secure Boot闹过兼容性问题。
  4. 2017年:UEFI 2.7规范。加入了HTTP Boot、NVDIMM支持等。这时候UEFI已经不只是PC的固件了,服务器、嵌入式设备都在用。
  5. 2020年至今:UEFI 2.9+。持续演进,加入了更多安全特性和虚拟化支持。

为什么会从EFI变成UEFI?说白了,就是行业不想被Intel一家牵着走。UEFI论坛的成立,让这个规范变成了真正的行业标准。

1.4 UEFI的行业意义:为什么它如此重要?

我个人觉得,UEFI最大的贡献不是技术本身,而是它改变了固件开发的生态。以前写BIOS,你得懂汇编、懂硬件中断、懂各种厂商的私有接口。现在写UEFI,你只需要遵循一套标准的协议和API——说白了,就是把固件开发“软件化”了。

具体来说,UEFI带来了几个革命性的变化:

  • 模块化设计:UEFI固件由多个独立的DXE驱动组成,可以动态加载和卸载。我在项目中就经常只替换某个驱动来修复bug,不用重新烧写整个固件。
  • 跨平台能力:同样的UEFI代码,可以跑在x86、ARM、RISC-V上。我去年帮一个客户把UEFI移植到RISC-V平台,核心代码几乎没改。
  • 安全启动链:从固件到OS,每一级都有签名验证。这不仅仅是防病毒,更是整个可信计算的基础。
  • 网络启动标准化:UEFI的HTTP Boot和PXE协议,让无盘工作站和自动化部署变得异常简单。

注意:UEFI虽然强大,但也不是万能的。它的复杂性也带来了新的攻击面——比如Bootkit、NVRAM变量篡改等。所以,做UEFI开发一定要把安全放在第一位。

1.5 UEFI启动流程全景图

为了让你对UEFI有个整体印象,我画了一张启动流程图。这张图会贯穿我们整个课程,建议你多看几遍:

UEFI启动流程全景图 UEFI启动流程全景图 SEC 安全验证阶段 PEI EFI预初始化 DXE 驱动执行环境 BDS 启动设备选择 各阶段核心任务: • SEC:验证固件完整性,建立临时安全环境。我见过有些平台在这里做TPM度量。 • PEI:初始化CPU、芯片组、内存控制器。说白了就是让内存能用。 • DXE:加载各种驱动(存储、网络、显示等),建立完整的UEFI运行时环境。 • BDS:根据BootOrder变量,依次尝试启动设备(硬盘、U盘、PXE等)。 TSL(操作系统加载前期) Boot Manager → OS Loader RT(运行时) UEFI Runtime Services + OS ExitBootServices()

这张图里,从SEC到BDS是UEFI的四个核心阶段。TSL和RT虽然也属于UEFI规范,但通常被认为是操作系统接管前后的过渡区。注意那个ExitBootServices()调用——这是UEFI把控制权交给OS的临界点。过了这个点,UEFI的Boot Services就失效了,只剩下Runtime Services还能用。

个人经验:我在调试一个UEFI网络驱动时,发现DXE阶段加载的驱动在ExitBootServices之后就不能用了。后来查规范才知道,网络协议属于Boot Services,运行时阶段必须重新初始化。这个坑,很多新手都会踩。

1.6 本章小结

好了,第一章的内容就到这里。我们讲了UEFI和BIOS的本质区别,捋了一遍UEFI的发展史,也聊了它为什么能成为行业标准。最后那张流程图,我希望你能记住——它就是我们后续29章的导航图。

记住一句话:UEFI不是一个简单的“启动程序”,它是一个微型操作系统。理解了这个,你才能真正驾驭它。