2. 编写并运行Hello World UEFI应用
任务目标
在EDK2环境中编写一个最小的UEFI应用程序,该应用在启动时向控制台输出一行Hello World,然后退出返回UEFI Shell。通过本案例掌握UEFI应用程序的基本结构、入口点签名以及EDK2构建系统的使用。
环境准备
需要一台安装了EDK2开发环境的Linux或Windows机器。EDK2的安装与配置(包括edksetup.sh或edksetup.bat的执行、Conf/target.txt中ACTIVE_PLATFORM与TARGET_ARCH的设置)属于前置工程依赖,此处不展开源码,直接使用已配置好的环境。
实现步骤
在EDK2源码树的OvmfPkg(或其他平台包)下新建一个应用目录,包含.inf构建描述文件和.c源文件。核心代码只需实现一个符合UEFI入口点约定的函数,调用Print库函数输出字符串。
关键完整代码
// HelloWorld.c
#include <Uefi.h>
#include <Library/UefiLib.h>
#include <Library/UefiBootServicesTableLib.h>
EFI_STATUS
EFIAPI
UefiMain (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
Print (L"Hello World\n");
return EFI_SUCCESS;
}
# HelloWorld.inf
[Defines]
INF_VERSION = 0x00010006
BASE_NAME = HelloWorld
FILE_GUID = 8D0E8C7A-2F5D-4B6A-9E3C-1A2B3C4D5E6F
MODULE_TYPE = UEFI_APPLICATION
VERSION_STRING = 1.0
ENTRY_POINT = UefiMain
[Sources]
HelloWorld.c
[Packages]
MdePkg/MdePkg.dec
[LibraryClasses]
UefiLib
UefiBootServicesTableLib
构建与运行
- 将上述两个文件放入
OvmfPkg/HelloWorld/目录。 - 在
Conf/target.txt中设置ACTIVE_PLATFORM = OvmfPkg/OvmfPkgX64.dsc,并在该.dsc文件的[Components]段添加一行:OvmfPkg/HelloWorld/HelloWorld.inf。 - 执行
build命令,生成的可执行文件位于Build/OvmfX64/DEBUG_GCC5/X64/HelloWorld.efi(路径因工具链而异)。 - 将
HelloWorld.efi复制到UEFI Shell可访问的FAT分区(或QEMU虚拟磁盘),启动到UEFI Shell后进入该分区,执行HelloWorld.efi。
验证方法
在UEFI Shell中运行HelloWorld.efi后,屏幕输出Hello World并自动返回Shell提示符,即表示应用正确编译并运行。若使用QEMU,可执行:
qemu-system-x86_64 -bios Build/OvmfX64/DEBUG_GCC5/FV/OVMF.fd -hda fat:./disk/
其中disk/目录包含HelloWorld.efi,进入Shell后切换到fs0:再运行应用。
预期输出
Shell> fs0:
FS0:\> HelloWorld.efi
Hello World
FS0:\>
以上输出由代码逻辑直接推出:Print输出一行字符串后函数返回EFI_SUCCESS,Shell随即恢复控制权。