2. 创建最小UEFI应用程序

任务目标

编写一个最小UEFI应用程序,在启动时向控制台输出字符串 Hello UEFI!,并编译为可被UEFI固件加载的 .efi 可执行文件。该程序不依赖操作系统,直接在UEFI引导环境中运行。

环境与依赖

  • EDK2:UEFI开发标准框架,需提前安装并完成 source edksetup.sh 环境初始化(Linux)或对应Windows环境变量配置。
  • 编译工具链:EDK2默认使用GCC(Linux)或VS(Windows),需确保 build 命令可用。
  • 模拟器(可选验证):QEMU配合OVMF固件,用于实际加载运行生成的 .efi 文件。

实现步骤

在EDK2源码树的 MdeModulePkg/Applications 目录下创建独立应用文件夹 HelloUefi,包含以下三个文件:

1. 应用入口代码(HelloUefi.c)

#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 UEFI!\n");
  return EFI_SUCCESS;
}

2. 编译描述文件(HelloUefi.inf)

[Defines]
  INF_VERSION          = 0x00010006
  BASE_NAME            = HelloUefi
  FILE_GUID            = 8D0E8B3A-2F6A-4C5E-9B1D-3A7F6C2E5A91
  MODULE_TYPE          = UEFI_APPLICATION
  VERSION_STRING       = 1.0
  ENTRY_POINT          = UefiMain

[Sources]
  HelloUefi.c

[Packages]
  MdePkg/MdePkg.dec

[LibraryClasses]
  UefiApplicationEntryPoint
  UefiLib

3. 编译命令

# 在EDK2根目录执行
source edksetup.sh
build -p MdeModulePkg/MdeModulePkg.dsc -m MdeModulePkg/Applications/HelloUefi/HelloUefi.inf -t GCC5

# 生成文件位于:
# Build/MdeModulePkg/DEBUG_GCC5/X64/HelloUefi.efi

验证方法

使用QEMU + OVMF固件加载编译产物,观察运行输出:

# 准备OVMF固件(如已安装,路径可能不同)
qemu-system-x86_64 -bios /usr/share/ovmf/OVMF.fd \
  -drive format=raw,file=fat:rw:./UefiDisk \
  -net none -nographic

将 HelloUefi.efi 放入 UefiDisk 目录,在QEMU的UEFI Shell中执行 fs0:\HelloUefi.efi。

通过条件:屏幕输出 Hello UEFI! 且系统不崩溃、无错误码返回,即验证通过。

常见问题

  • 编译报错找不到头文件:确认 MdePkg.dec 路径正确,且已执行 edksetup.sh。
  • GUID冲突:若与其他模块GUID重复,替换 FILE_GUID 为任意新生成的唯一GUID。
  • QEMU无法识别文件系统:确保 UefiDisk 目录存在且为FAT格式(QEMU的 fat: 参数自动处理)。