EDK II平台固件开发工程 - 第1节

1.1 UEFI 规范简介

UEFI(统一可扩展固件接口)是定义操作系统与平台固件之间接口的公开规范。它取代了传统 BIOS(基本输入输出系统),为 x86、ARM 等架构提供更现代、更安全的启动环境。

1.1.1 核心设计目标

  • 平台无关性:不依赖特定 CPU 架构或硬件平台。
  • 模块化与可扩展:通过协议(Protocol)和句柄(Handle)机制动态加载驱动。
  • 安全启动:支持 Secure Boot,防止未授权代码在启动阶段执行。
  • 网络与图形支持:原生支持 TCP/IP 协议栈和 GOP(图形输出协议)。

1.1.2 关键概念

概念说明
EFI 系统分区 (ESP)存放启动管理器、驱动和应用的分区,格式为 FAT32。
Boot Manager固件内置的启动项管理器,决定加载哪个 EFI 应用。
ProtocolUEFI 驱动和应用之间的接口契约,类似面向对象中的接口。
Handle Database固件维护的对象数据库,每个 Handle 关联一组 Protocol。
UEFI 应用在启动阶段运行的可执行文件(如 Shell、OS Loader)。
提示:UEFI 规范由 UEFI 论坛维护,当前最新版本为 2.10(2024 年发布)。所有 EDK II 开发均以该规范为基准。

1.2 EDK II 项目背景

EDK II(EFI Development Kit II)是 Intel 主导的开源 UEFI 固件开发框架,托管于 TianoCore 社区。它提供了完整的工具链、库函数和构建系统,用于开发 UEFI 驱动、应用和固件。

1.2.1 发展历程

  • EDK (2006):第一代开发套件,基于 C 语言,构建系统较简单。
  • EDK II (2010):重构版本,引入 .inf / .dec / .dsc 元数据文件,支持更复杂的模块依赖管理。
  • TianoCore 社区:2010 年后由开源社区维护,成为 UEFI 固件开发的事实标准。

1.2.2 核心组件

组件作用
MdePkg基础定义包,包含 UEFI 规范定义的数据类型、协议头文件。
MdeModulePkg核心模块实现,如内存管理、事件、引导服务。
UefiCpuPkgCPU 架构相关驱动和库,支持 x86/ARM 等。
NetworkPkgUEFI 网络协议栈实现(TCP/IP、DHCP、PXE)。
ShellPkgUEFI Shell 实现,提供命令行交互环境。
关键点:EDK II 不是固件产品,而是构建固件的工具包。OEM/ODM 基于 EDK II 定制自己的平台固件。

1.3 EDK II 与 BIOS 的关系

传统 BIOS 和 UEFI 是两种不同的固件接口标准。EDK II 是 UEFI 规范的开源实现,而 BIOS 则对应 Legacy BIOS 规范。下表对比两者的核心差异:

特性传统 BIOSUEFI (EDK II)
接口模式16 位实模式32/64 位保护模式或长模式
磁盘分区MBR(最大 2TB)GPT(最大 9.4ZB)
启动速度较慢(逐项自检)较快(并行初始化)
驱动模型Option ROM,固定地址UEFI 驱动,动态加载
安全特性无原生安全机制Secure Boot、Measured Boot
网络支持需额外 PXE ROM原生 UEFI 网络协议栈
图形界面文本模式为主支持 GOP 图形输出
注意:EDK II 可以同时支持 UEFI 启动和 Legacy BIOS 兼容(CSM 模块),但 CSM 在 Intel 11 代平台后逐步移除。

1.4 EDK II 开发环境概览

搭建 EDK II 开发环境需要准备以下工具和配置:

1.4.1 必备工具链

  • 编译器:VS2019/VS2022(Windows)、GCC5+(Linux)、XCODE5+(macOS)。
  • Python 3.8+:用于运行构建脚本(build.py)。
  • Git:从 TianoCore 仓库克隆源码。
  • NASM:汇编器,用于编译汇编代码(如 ResetVector)。

1.4.2 目录结构

edk2/
├── BaseTools/          # 构建工具(C/Python 源码)
├── Conf/               # 构建配置文件(target.txt, tools_def.txt)
├── MdePkg/             # 基础定义包
├── MdeModulePkg/       # 核心模块包
├── UefiCpuPkg/         # CPU 架构包
├── NetworkPkg/         # 网络协议包
├── ShellPkg/           # UEFI Shell 包
├── OvmfPkg/            # OVMF(QEMU 虚拟固件)包
└── edk2-libc/          # C 标准库移植(可选)

1.4.3 构建流程

  1. 设置环境变量:运行 edksetup.bat(Windows)或 source edksetup.sh(Linux)。
  2. 配置目标:编辑 Conf/target.txt,指定 ACTIVE_PLATFORM(如 OvmfPkg/OvmfPkgX64.dsc)。
  3. 执行构建:运行 build 命令,生成 Build/ 目录下的固件镜像(如 OVMF.fd)。
  4. 测试运行:使用 QEMU 模拟器加载固件镜像:qemu-system-x86_64 -bios Build/OvmfX64/DEBUG_GCC5/FV/OVMF.fd。
实战建议:初学者推荐使用 OvmfPkg(OVMF)作为目标平台,配合 QEMU 模拟器进行开发和调试,无需真实硬件。

1.5 UEFI 启动流程与 EDK II 模块关系

下图展示了 UEFI 固件的典型启动阶段,以及 EDK II 中各模块的对应关系:

UEFI 启动流程与 EDK II 模块关系 UEFI 启动流程与 EDK II 模块关系 SEC (安全验证) ResetVector / SecCore PEI (EFI 前期初始化) PeiCore / 内存初始化 DXE (驱动执行环境) DxeCore / 协议注册 BDS 启动选择 TSL / RT OS Loader / 运行时 EDK II 模块对应关系 • SEC 阶段:UefiCpuPkg/ResetVector、MdePkg/SecCore • PEI 阶段:MdeModulePkg/PeiCore、UefiCpuPkg/CpuMpPei • DXE 阶段:MdeModulePkg/DxeCore、各设备驱动 • BDS 阶段:MdeModulePkg/BdsDxe、UefiBootManagerLib 💡 每个阶段对应 EDK II 中的一个或多个模块包,开发者可通过修改对应包实现定制化固件。

1.6 本章小结

本章介绍了 UEFI 规范的核心概念、EDK II 项目背景及其与传统 BIOS 的关系,并概述了开发环境的搭建要点。理解这些基础是后续深入学习 EDK II 框架的前提。

核心要点回顾:
  • UEFI 是操作系统与固件之间的现代接口规范,EDK II 是其开源实现。
  • EDK II 采用模块化设计,通过 .inf / .dec / .dsc 文件管理依赖。
  • UEFI 启动流程分为 SEC → PEI → DXE → BDS → TSL/RT 五个阶段。
  • 开发环境需要编译器、Python、Git、NASM 和 QEMU(用于模拟测试)。