引言:从理论到实践的第一步
在初步了解UEFI的基本概念和工程结构后,编写第一个"Hello World"应用程序是掌握UEFI开发的关键一步。这个看似简单的程序将带您深入UEFI应用的运行机制,揭开固件层开发的神秘面纱。通过本文,您将完成从环境搭建到代码运行的完整开发闭环。
一、开发环境准备
我使用的Ubuntu 20.4搭建的开发环境,网上有很多教程可以参考,这边对于环境的搭建就不再做过多的赘述.
二、编写Hello World程序
2.1HelloWorld.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");//打印函数
//使用ConOut输出协议输出
SystemTable->ConOut->OutputString(SystemTable->ConOut, L"Hello, World!\n");
return EFI_SUCCESS;
}
2.2HelloWorld.inf
[Defines]
INF_VERSION = 0x00010005
BASE_NAME = HelloWorldApp
FILE_GUID = cf4365b2-d5f3-4598-862c-7625ec71e1a2
MODULE_TYPE = UEFI_APPLICATION
VERSION_STRING = 1.0
ENTRY_POINT = UefiMain
[Sources]
HelloWorld.c
[Packages]
MdePkg/MdePkg.dec
[LibraryClasses]
UefiLib
UefiBootServicesTableLib
UefiApplicationEntryPoint
三、工程配置与编译
3.1 平台配置文件
edk2/OvmfPkg/OvmfPkgX64.dsc
3.2 编译命令
编译OVmf同时也生成我们所需要的HelloWorldApp.efi,也可以在edk2目录下创建自己Package,创建对应的包声明文件(.dec)、包配置文件(.dsc)
build -p edk2/OvmfPkg/OvmfPkgX64.dsc -t GCC5 -a X64
四、运行与调试
4.1 生成文件路径
Build/OvmfX64/DEBUG_GCC5/X64/HelloWorldApp.efi
4.2 使用QEMU测试
bios.bin就是Ovmf生成的镜像OVMF.fd(Build/OvmfX64/DEBUG_GCC5/FV/OVMF.fd)
hda-contents就是将对应的.efi文件拷贝到这里
debug.log对应的就是调试日志
run.sh对应的就是qemu得运行脚本,可自行更改对应的选项
配合OVMF镜像启动:
qemu-system-x86_64 -bios bios.bin -net none -drive format=raw,file=fat:rw:hda-contents -serial stdio -m 2048 -enable-kvm -smp 2 -vga qxl -cpu host