1. 搭建EDK2开发环境

任务目标

在Ubuntu系统上完成EDK2开发环境搭建,编译一个最小的UEFI应用程序(HelloWorld),生成可加载的EFI可执行文件,并验证编译产物存在且格式正确。

环境与依赖

  • Ubuntu 20.04/22.04(x86_64),需具备sudo权限
  • 必需工具包:build-essential、git、nasm、python3、uuid-dev
  • EDK2使用其自带的GCC工具链(基于系统gcc),无需额外安装交叉编译器

安装步骤

  1. 安装依赖包:sudo apt update && sudo apt install -y build-essential git nasm python3 uuid-dev
  2. 创建工作目录并克隆EDK2稳定分支(当前使用edk2-stable202405)
  3. 初始化子模块(EDK2依赖MdePkg、MdeModulePkg等子模块)
  4. 设置环境变量并激活编译环境

完整实现

以下命令序列完成环境搭建与最小应用编译。核心步骤为:克隆仓库、同步子模块、导入环境脚本、编译BaseTools、创建HelloWorld应用、编译生成EFI文件。

# 1. 安装依赖
sudo apt update
sudo apt install -y build-essential git nasm python3 uuid-dev

# 2. 克隆EDK2(稳定版)
cd ~
git clone https://github.com/tianocore/edk2.git -b edk2-stable202405
cd edk2

# 3. 初始化子模块(需数分钟,取决于网络)
git submodule update --init --recursive

# 4. 导入EDK2编译环境(每次新终端需重新执行)
source edksetup.sh

# 5. 编译BaseTools(EDK2构建工具链)
make -C BaseTools

# 6. 创建最小UEFI应用
mkdir -p MdePkg/Applications/HelloWorld
cat > MdePkg/Applications/HelloWorld/HelloWorld.c << 'EOF'
#include <Uefi.h>
#include <Library/UefiLib.h>
#include <Library/UefiApplicationEntryPoint.h>

EFI_STATUS
EFIAPI
UefiMain (
  IN EFI_HANDLE        ImageHandle,
  IN EFI_SYSTEM_TABLE  *SystemTable
  )
{
  Print (L"Hello EDK2!\r\n");
  return EFI_SUCCESS;
}
EOF

cat > MdePkg/Applications/HelloWorld/HelloWorld.inf << 'EOF'
[Defines]
  INF_VERSION          = 0x00010005
  BASE_NAME            = HelloWorld
  FILE_GUID            = 8D0E2C1A-2F5B-4E6A-9C3D-7B8A1F2E4C5D
  MODULE_TYPE          = UEFI_APPLICATION
  VERSION_STRING       = 1.0
  ENTRY_POINT          = UefiMain

[Sources]
  HelloWorld.c

[Packages]
  MdePkg/MdePkg.dec

[LibraryClasses]
  UefiApplicationEntryPoint
  UefiLib
EOF

# 7. 在target.txt中启用HelloWorld模块编译
cat >> Conf/target.txt << 'EOF'

ACTIVE_PLATFORM       = MdePkg/MdePkg.dsc
TARGET_ARCH           = X64
TOOL_CHAIN_TAG        = GCC5
EOF

# 8. 编译(生成Build/MdePkg/DEBUG_GCC5/X64/HelloWorld.efi)
build -m MdePkg/Applications/HelloWorld/HelloWorld.inf

关键说明:edksetup.sh会生成Conf/target.txt等配置文件;步骤7中通过追加配置指定了平台、架构与工具链。若Conf目录不存在,先执行source edksetup.sh生成。编译输出路径为Build/MdePkg/DEBUG_GCC5/X64/HelloWorld.efi。

验证方法

  1. 编译产物存在:检查Build/MdePkg/DEBUG_GCC5/X64/HelloWorld.efi文件是否生成,文件大小应大于0字节。
  2. PE32+格式确认:执行file Build/MdePkg/DEBUG_GCC5/X64/HelloWorld.efi,输出应包含PE32+ executable (EFI application) x86-64字样,证明是有效的UEFI可执行文件。
  3. (可选)QEMU运行验证:若已安装qemu-system-x86_64和OVMF,可创建FAT格式磁盘镜像放入该EFI文件,用UEFI Shell执行验证输出Hello EDK2!。此步骤非必需,编译产物格式正确即可判定环境搭建成功。

通过条件:步骤1和2均满足,即EFI文件生成且被file命令识别为x86-64的PE32+ EFI应用,则环境搭建与编译链路验证通过。