UEFI协议与平台服务开发工程 - 第1节

1.1 UEFI 的起源与发展

UEFI(统一可扩展固件接口)是个人计算机固件接口标准的演进产物,旨在替代传统 BIOS(基本输入输出系统)。其发展历程可归纳为以下关键阶段:

阶段 时间 关键事件
Intel Boot Initiative (IBI) 1998 Intel 为安腾(Itanium)平台启动 EFI 1.0 规范
EFI 1.10 2002 增加驱动模型、协议接口,奠定可扩展基础
UEFI 2.0 2006 统一 EFI 论坛(UEFI Forum)接管,规范更名为 UEFI
UEFI 2.3+ 2010+ 安全启动(Secure Boot)、网络引导、UEFI Shell 标准化
UEFI 2.10 2022 支持 Arm 架构、RISC-V 架构,扩展至嵌入式与服务器领域
关键认知:UEFI 并非“图形化 BIOS”,而是一个完整的、可编程的固件接口规范,支持 C 语言开发、动态协议绑定和模块化驱动架构。

1.2 与传统 BIOS 的区别

传统 BIOS 受限于 16 位实模式、1 MB 地址空间和中断调用方式,已无法满足现代硬件需求。UEFI 在架构、性能和安全性上实现了全面升级:

对比维度 传统 BIOS UEFI
运行模式 16 位实模式 32/64 位保护模式、长模式
寻址空间 1 MB(受限) 4 GB 以上(平坦内存模型)
编程语言 汇编为主 C 语言为主,支持高级语言
驱动模型 Option ROM(16 位) UEFI 驱动模型(可加载、可卸载)
用户界面 文本菜单(少数图形) 图形化界面(HII)、鼠标支持
安全特性 无原生安全机制 安全启动(Secure Boot)、固件验证
扩展性 中断向量表、固定入口 协议(Protocol)动态注册与发现
启动速度 串行初始化,较慢 并行初始化,支持快速启动
开发者视角:UEFI 最大的变革在于引入了“协议(Protocol)”机制——所有功能(磁盘、网络、显示、输入)都以 GUID 标识的协议接口暴露,驱动和应用通过协议进行交互,实现了真正的模块化和可组合性。

1.3 UEFI 规范体系结构

UEFI 规范定义了从硬件到操作系统的完整固件接口层次。下图展示了 UEFI 固件的核心架构:

UEFI 规范体系结构 硬件层(Platform Hardware) CPU / 芯片组 / 内存 / 外设控制器 UEFI 固件核心(Firmware Core) SEC(安全验证)→ PEI(EFI 前期初始化)→ DXE(驱动执行环境) BDS(启动设备选择)→ TSL(临时系统加载)→ RT(运行时) UEFI 协议层(Protocol Layer) 设备路径协议 / 块 I/O 协议 / 简单文件系统协议 / 网络协议 图形输出协议 / 串行 I/O 协议 / 安全架构协议 UEFI 应用层(Application Layer) UEFI Shell / 启动管理器 / 诊断工具 / 操作系统加载器 操作系统(OS Loader / OS Runtime)

UEFI 规范体系的核心设计原则是分层与协议化:

  • 硬件抽象:固件核心层屏蔽 CPU 架构和芯片组差异,向上提供统一的系统表(System Table)和启动服务(Boot Services)。
  • 协议接口:所有硬件功能(磁盘、网络、显示)都通过 GUID 标识的协议暴露,驱动和应用通过 LocateProtocol / OpenProtocol 获取接口。
  • 运行时与启动时:启动服务在 ExitBootServices() 后失效,运行时服务(Runtime Services)在操作系统运行期间仍可调用。

1.4 UEFI 启动流程

UEFI 固件从加电到操作系统接管,经历七个明确定义的阶段。下图展示了完整的启动流水线:

UEFI 启动流程(七阶段) SEC 安全验证 PEI 前期初始化 DXE 驱动执行 BDS 启动选择 TSL 临时系统 RT 运行时 AL 后阶段 阶段说明 SEC:验证固件完整性,建立临时安全域 PEI:初始化 CPU、芯片组、内存控制器,发现内存 DXE:加载并执行 UEFI 驱动,构建协议数据库 阶段说明(续) BDS:枚举启动选项,根据优先级选择启动设备 TSL:执行 OS Loader(如 bootmgfw.efi),准备退出启动服务 RT:调用 ExitBootServices(),操作系统接管,仅保留运行时服务
开发注意:在 DXE 阶段,UEFI 驱动通过协议注册与发现机制动态加载。开发者编写的 UEFI 驱动通常作为 DXE 驱动运行,必须遵循 UEFI 驱动模型——包括 Driver Binding Protocol、Component Name Protocol 和 Supported/Start/Stop 接口规范。

启动流程关键节点详解

  1. SEC(安全验证阶段):固件入口点,验证固件卷(FV)的签名和完整性,建立临时内存(Cache-as-RAM),为 PEI 阶段准备执行环境。
  2. PEI(EFI 前期初始化阶段):通过 PEIM(PEI 模块)初始化 CPU、芯片组和内存控制器。内存初始化完成后,将控制权移交给 DXE 阶段。
  3. DXE(驱动执行环境阶段):核心阶段。DXE 基础架构(DXE Foundation)加载 DXE 驱动,驱动通过协议注册自身功能。所有硬件抽象在此阶段完成。
  4. BDS(启动设备选择阶段):读取 NVRAM 中的启动顺序(BootOrder),枚举启动选项,加载对应的 OS Loader。
  5. TSL(临时系统加载阶段):OS Loader 执行,加载操作系统内核。Loader 调用 ExitBootServices() 释放固件控制权。
  6. RT(运行时阶段):操作系统运行,仅保留运行时服务(如 GetVariable、SetVariable、ResetSystem)。
  7. AL(后阶段):操作系统完全接管,UEFI 固件仅作为 ACPI、SMBIOS 等数据表的提供者。
实战要点:UEFI 协议开发的核心战场在 DXE 阶段。开发者编写的驱动通过 gBS->InstallProtocolInterface() 注册协议,通过 gBS->LocateProtocol() 查找并使用其他驱动提供的协议。理解 DXE 阶段的协议生命周期管理,是掌握 UEFI 开发的关键。