2. EDK2 开发环境搭建:源码获取、编译器配置与模拟器运行

搭建一个稳定、可复现的 EDK2 开发环境是 UEFI 协议开发的第一步。本章将引导你完成从源码拉取、工具链安装到模拟器验证的全流程,确保你拥有一个可直接编译并运行 UEFI 应用程序的本地环境。

2.1 环境概览与版本选择

EDK2 支持 Windows、Linux 和 macOS 三大主流平台。在 Windows 环境下,推荐使用 VS2019 或 VS2022 作为 C 编译器,配合 Python 3.x 和 Git 完成构建。下表列出了核心组件的推荐版本与作用:

组件 推荐版本 核心作用
操作系统 Windows 10/11 (64-bit) 提供基础运行环境
EDK2 源码 edk2-stable202311 或最新 master UEFI 固件开发框架与协议实现
Visual Studio VS2019 (16.x) 或 VS2022 (17.x) C 编译器、链接器与标准库
Python Python 3.8 ~ 3.12 构建脚本 (BaseTools) 运行环境
Git Git 2.30+ 源码版本管理与子模块同步
NASM 2.15+ 汇编器,用于编译汇编语言模块
版本兼容性提示: 虽然 EDK2 master 分支持续更新,但为减少环境问题,初学者建议使用 edk2-stable202311 标签版本。该版本与 VS2019/VS2022 及 Python 3.10 有良好的兼容性验证。

2.2 获取 EDK2 源码

EDK2 项目托管在 GitHub,采用子模块 (submodule) 管理依赖包。正确的拉取方式必须包含 --recursive 参数,以确保同步 MdeModulePkg、MdePkg、BaseTools 等核心子仓库。

# 1. 创建本地工作目录
mkdir C:\UEFI_Workspace
cd C:\UEFI_Workspace

# 2. 克隆 EDK2 主仓库(包含所有子模块)
git clone --recursive https://github.com/tianocore/edk2.git

# 3. 进入 edk2 目录
cd edk2

# 4. (可选)切换到稳定标签
git checkout edk2-stable202311

# 5. 更新子模块(如果之前未使用 --recursive)
git submodule update --init --recursive
网络注意事项: 由于 GitHub 及子模块服务器位于海外,国内开发者可能遇到克隆超时或子模块下载失败。建议使用代理或 Git 镜像加速。若子模块下载不完整,后续编译 BaseTools 时会报错。

2.3 安装编译工具链

EDK2 在 Windows 下的标准工具链是 VS2019/VS2022 + NASM + Python。以下为详细安装与配置步骤:

  1. 安装 Visual Studio:安装 VS2019 或 VS2022 时,务必勾选“使用 C++ 的桌面开发”工作负载,并确保包含 Windows 10 SDK (或 11 SDK)。
  2. 安装 Python:从 python.org 下载安装包,安装时勾选“Add Python to PATH”。
  3. 安装 NASM:从 nasm.us 下载 Windows 安装包,安装后手动将 C:\NASM 添加到系统 PATH 环境变量。
  4. 配置 EDK2 环境变量:打开“x64 Native Tools Command Prompt for VS 2019/2022”,执行以下命令设置 EDK2 构建环境:
# 在 VS 开发者命令提示符中执行
cd C:\UEFI_Workspace\edk2

# 设置 EDK2 环境变量(必须每次在新终端中执行)
edksetup.bat

# 验证环境:显示当前工具链配置
build -h
关键检查点: 执行 edksetup.bat 后,控制台应输出 Loading previous configuration from ... 且无错误。若提示 Python not found,请检查 Python 是否在 PATH 中。

2.4 编译 EmulatorPkg 模拟器

EmulatorPkg 是 EDK2 提供的一个特殊平台包,它将 UEFI 固件编译为 Windows 原生可执行文件 (.exe),无需真实硬件即可运行 UEFI Shell 和应用程序。这是学习和调试 UEFI 协议的最佳起点。

编译 EmulatorPkg 的完整流程如下:

# 1. 确保在 VS 开发者命令提示符中,且已执行 edksetup.bat
cd C:\UEFI_Workspace\edk2

# 2. 编译 EmulatorPkg(Debug 模式,VS2019/VS2022 工具链)
build -p EmulatorPkg\EmulatorPkg.dsc -a X64 -t VS2019 -b DEBUG

# 3. 编译成功后,运行模拟器
# 输出文件位于 Build\EmulatorX64\DEBUG_VS2019\X64\WinHost.exe
Build\EmulatorX64\DEBUG_VS2019\X64\WinHost.exe
编译参数说明: -p 指定平台描述文件 (DSC),-a 指定架构 (X64),-t 指定工具链 (VS2019 或 VS2022),-b 指定构建类型 (DEBUG/RELEASE)。若使用 VS2022,将 -t VS2019 改为 -t VS2022。

首次编译 EmulatorPkg 时,EDK2 会自动编译 BaseTools(Python 和 C 混合的构建工具集)。编译时间取决于机器性能,通常需要 5~15 分钟。编译成功后,你将看到 WinHost.exe 窗口启动,并进入 UEFI Shell 界面。

EDK2 开发环境搭建流程 1. 获取 EDK2 源码 2. 安装 VS2019/2022 3. 安装 Python+NASM 4. 执行 edksetup.bat 5. 编译 EmulatorPkg 6. 运行 WinHost.exe 关键说明 步骤 1~3 为一次性安装;步骤 4 需在每次打开新终端时执行。 编译 EmulatorPkg 成功后,可直接在 Windows 中运行 UEFI Shell。

2.5 验证环境:运行 UEFI Shell

当 WinHost.exe 成功启动后,你将看到类似下图的 UEFI Shell 界面。在 Shell 提示符 Shell> 下输入以下命令,验证环境是否正常工作:

# 查看当前文件系统
Shell> map

# 查看 UEFI 版本信息
Shell> ver

# 退出 Shell 并关闭模拟器
Shell> reset

如果 map 命令能列出文件系统映射,ver 命令能显示 UEFI 规范版本号 (如 2.10),则说明你的 EDK2 开发环境已完全搭建成功,可以开始编写和调试 UEFI 应用程序了。

常见问题排查:
  • 编译错误: 检查是否在 VS 开发者命令提示符中执行,而非普通 CMD。
  • NASM 未找到: 确认 nasm.exe 所在目录已添加到系统 PATH,并重启终端。
  • Python 模块缺失: 执行 pip install --upgrade -r BaseTools/requirements.txt 安装依赖。
  • 模拟器闪退: 检查 Windows 防火墙是否阻止了 WinHost.exe,或尝试以管理员身份运行。
EDK2 源码目录结构(EmulatorPkg 相关) edk2/ EmulatorPkg/ MdePkg/ MdeModulePkg/ BaseTools/ EmulatorPkg.dsc EmulatorPkg.fdf Win/ 各目录/文件作用 • EmulatorPkg.dsc:平台描述文件,定义模块与库 • EmulatorPkg.fdf:固件描述文件,定义固件布局 • Win/:包含 Windows 宿主代码 (WinHost.c)

2.6 本章小结

通过本章的学习,你已完成以下关键任务:

  • 从 GitHub 获取 EDK2 完整源码(含子模块)。
  • 安装并配置 VS2019/VS2022、Python 3.x 和 NASM 编译工具链。
  • 执行 edksetup.bat 初始化 EDK2 构建环境。
  • 成功编译并运行 EmulatorPkg 模拟器,进入 UEFI Shell。