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 应用。 |
| Protocol | UEFI 驱动和应用之间的接口契约,类似面向对象中的接口。 |
| 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 | 核心模块实现,如内存管理、事件、引导服务。 |
| UefiCpuPkg | CPU 架构相关驱动和库,支持 x86/ARM 等。 |
| NetworkPkg | UEFI 网络协议栈实现(TCP/IP、DHCP、PXE)。 |
| ShellPkg | UEFI Shell 实现,提供命令行交互环境。 |
关键点:EDK II 不是固件产品,而是构建固件的工具包。OEM/ODM 基于 EDK II 定制自己的平台固件。
1.3 EDK II 与 BIOS 的关系
传统 BIOS 和 UEFI 是两种不同的固件接口标准。EDK II 是 UEFI 规范的开源实现,而 BIOS 则对应 Legacy BIOS 规范。下表对比两者的核心差异:
| 特性 | 传统 BIOS | UEFI (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 构建流程
- 设置环境变量:运行
edksetup.bat(Windows)或source edksetup.sh(Linux)。 - 配置目标:编辑
Conf/target.txt,指定ACTIVE_PLATFORM(如OvmfPkg/OvmfPkgX64.dsc)。 - 执行构建:运行
build命令,生成Build/目录下的固件镜像(如OVMF.fd)。 - 测试运行:使用 QEMU 模拟器加载固件镜像:
qemu-system-x86_64 -bios Build/OvmfX64/DEBUG_GCC5/FV/OVMF.fd。
实战建议:初学者推荐使用 OvmfPkg(OVMF)作为目标平台,配合 QEMU 模拟器进行开发和调试,无需真实硬件。
1.5 UEFI 启动流程与 EDK II 模块关系
下图展示了 UEFI 固件的典型启动阶段,以及 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(用于模拟测试)。