2. UEFI概述

UEFI(Unified Extensible Firmware Interface,统一可扩展固件接口)是当代计算机平台固件的核心规范。它并非简单的“BIOS升级版”,而是重新定义了固件与操作系统之间的接口边界、启动模型和驱动加载机制。理解UEFI的规范演进、与传统BIOS的本质差异、启动流程以及系统架构,是进行UEFI设备驱动与固件开发的前提。

一、UEFI规范的演进脉络

UEFI的起源可追溯到Intel在1998年提出的EFI 1.0,其目标是替代传统16位实模式BIOS,解决启动性能低、扩展性差、接口不统一等问题。2005年,Intel将EFI规范移交给UEFI论坛,并更名为UEFI 2.0,从此进入社区化、标准化演进阶段。

  • EFI 1.10:奠定启动服务、运行时服务、协议(Protocol)等核心概念。
  • UEFI 2.0~2.3:完善驱动模型、安全启动(Secure Boot)、网络协议栈与图形输出协议。
  • UEFI 2.4~2.7:引入HTTP Boot、REST协议、内存属性、 capsule更新增强等。
  • UEFI 2.8及以后:强化安全启动密钥管理、TCG测量、RISC-V等新架构支持。

规范演进的核心逻辑是:从“能启动”走向“安全、可扩展、跨架构、可管理”。每一版都在驱动模型、安全机制和平台抽象上做增量增强,而非推翻重来。

二、与传统BIOS的本质差异

传统BIOS运行于16位实模式,依赖中断向量表(IVT)和固定内存布局,扩展能力受限于Option ROM和MBR分区。UEFI则运行于32/64位保护模式或长模式,采用协议驱动模型,支持GPT分区、模块化驱动和丰富的启动服务。

对比维度 传统BIOS UEFI
运行模式 16位实模式 32/64位保护模式或长模式
接口方式 中断调用(INT 13h等) 协议(Protocol)与句柄服务
分区格式 MBR(最大2TB) GPT(支持超大容量)
驱动模型 Option ROM,静态加载 UEFI Driver Model,动态绑定
启动方式 读取MBR引导代码 加载EFI应用或OS Loader
安全机制 基本无 Secure Boot、度量启动

关键认知:UEFI不是“更快的BIOS”,而是固件运行时环境。它提供启动服务(Boot Services)和运行时服务(Runtime Services),操作系统加载后仍可调用运行时服务获取时间、变量、capsule更新等能力。

三、UEFI启动流程

UEFI启动流程可概括为:SEC → PEI → DXE → BDS → TSL → RT。每个阶段承担不同职责,并通过PPI(PEIM间接口)和Protocol传递数据与控制权。

  1. SEC(Security):平台复位入口,建立临时内存,验证PEI核心,移交控制权。
  2. PEI(Pre-EFI Initialization):初始化内存控制器、芯片组基础,发现并调度PEIM。
  3. DXE(Driver Execution Environment):加载DXE驱动,构建协议数据库,完成设备枚举与驱动绑定。
  4. BDS(Boot Device Selection):按启动策略选择启动项,加载EFI应用或OS Loader。
  5. TSL(Transient System Load):OS Loader运行阶段,调用ExitBootServices结束启动服务。
  6. RT(Runtime):操作系统运行阶段,仅保留运行时服务可用。

其中,DXE阶段是设备驱动开发的主战场。驱动通过Driver Binding Protocol匹配设备,通过Component Name Protocol提供可读名称,通过I/O Protocol暴露硬件访问接口。

四、UEFI系统架构与组成模块

从架构视角看,UEFI系统由平台硬件、固件核心、驱动集合、协议接口和上层应用组成。下图展示了各模块之间的层次关系与数据流向。

UEFI 系统架构与启动阶段 SEC 安全验证 / 临时内存 PEI 内存 / 芯片组初始化 DXE 驱动调度 / 协议构建 BDS 启动项选择 / OS Loader RT 运行时服务 启动服务 Boot Services 内存分配 / 事件 / 协议句柄 驱动加载 / 镜像服务 运行时服务 Runtime Services 变量 / 时间 / 复位 / Capsule OS运行期仍可调用 驱动模型 Driver Model Driver Binding / I/O Protocol 设备路径 / 句柄数据库 协议接口 Protocol GOP / Block I/O / Simple File 网络 / 安全 / 存储 平台硬件 CPU / 芯片组 / PCIe 存储 / 网络 / 显示 操作系统 OS Loader 内核 / 驱动 / 应用 DXE阶段是驱动开发核心:驱动通过Binding Protocol匹配设备,通过I/O Protocol暴露硬件访问能力

从图中可见,启动服务与运行时服务构成UEFI的两大服务基座;驱动模型和协议接口是设备驱动开发的核心抽象;平台硬件与操作系统分别位于固件之下和之上,形成完整的启动链路。

五、典型场景与开发误区

在实际项目中,开发者常遇到以下场景:为PCIe网卡编写UEFI驱动时,需要在DXE阶段通过PCI I/O Protocol枚举设备,安装Driver Binding Protocol,并在Start()中初始化硬件、安装Simple Network Protocol。若驱动未正确安装Binding Protocol,BDS阶段将无法识别该设备,导致网络启动失败。

常见误区:把UEFI驱动写成“直接操作硬件”的裸机程序。UEFI驱动应通过协议访问硬件资源,避免硬编码地址;同时要注意ExitBootServices后,启动服务不可用,驱动若需在OS运行期继续工作,必须使用运行时服务或转为OS原生驱动。

另一个典型误区是忽视阶段边界:在PEI阶段访问尚未初始化的内存,或在DXE阶段过早调用BDS策略。正确做法是遵循阶段职责,利用PPI和Protocol传递信息,而不是跨阶段直接调用。

六、小结与开发视角

UEFI规范演进体现了固件从“启动固件”向“平台运行时”的转变。与传统BIOS相比,UEFI在运行模式、接口模型、分区格式、驱动机制和安全能力上均有本质提升。启动流程的SEC→PEI→DXE→BDS→TSL→RT六阶段模型,为驱动加载和系统初始化提供了清晰的时序边界。系统架构中的启动服务、运行时服务、驱动模型和协议接口,构成了UEFI设备驱动开发的四大支柱。

对于固件开发者而言,掌握DXE驱动模型、Protocol安装与消费、以及启动服务与运行时服务的生命周期差异,是后续编写PCIe、USB、网络、存储等UEFI驱动的基础。下一阶段的学习应聚焦于具体协议的实现与调试方法。