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:参数自动处理)。