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

构建与运行

  1. 将上述两个文件放入OvmfPkg/HelloWorld/目录。
  2. 在Conf/target.txt中设置ACTIVE_PLATFORM = OvmfPkg/OvmfPkgX64.dsc,并在该.dsc文件的[Components]段添加一行:OvmfPkg/HelloWorld/HelloWorld.inf。
  3. 执行build命令,生成的可执行文件位于Build/OvmfX64/DEBUG_GCC5/X64/HelloWorld.efi(路径因工具链而异)。
  4. 将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随即恢复控制权。