【edk2 】【01】【HelloWorld工程编译】
1. 新建HelloWorldPkg工程
- edk2根目录下新建HelloWorldPkg文件夹
- 新建HelloWorld.c文件:
#include <Uefi.h>
#include <Library/UefiLib.h>
EFI_STATUS
EFIAPI
UefiMain(
EFI_HANDLE ImageHandle,
EFI_SYSTEM_TABLE *SystemTable
)
{
Print(L"Hello world!\n");
return 0;
}
[Defines]
INF_VERSION = 0x00010006
BASE_NAME = HelloWorld
FILE_GUID = 3171ADAF-8527-140F-8193-946061EBAF5A
MODULE_TYPE = UEFI_APPLICATION
VERSION_STRING = 1.0
ENTRY_POINT = UefiMain
[Sources]
HelloWorld.c
[Packages]
MdePkg/MdePkg.dec
[LibraryClasses]
UefiApplicationEntryPoint
UefiLib
2. 在vs环境尝试编译HelloWorldPkg
- 将HelloWorld工程添加到EmulatorPkg工程一起编译,修改EmulatorPkg/EmulatorPkg.dsc,在Components中添加HelloWorld.inf
[Components]
HelloWorldPkg\HelloWorld.inf
!if "IA32" in $(ARCH) || "X64" in $(ARCH)
- 还是先进vs编译环境,修改Conf/target.txt
ACTIVE_PLATFORM = EmulatorPkg/EmulatorPkg.dsc
NMAKE : fatal error U1077: "D:\IASLiasl.exe" -pe:\edk2\Build\OvmfX64\DEBUG_VS2019\X64\MdeModulePkg\Universal\Disk\RamDiskDxe\RamDiskDxe\OUTPUT\.\RamDisk.aml e:\edk2\Build\OvmfX64\DEBUG_VS2019\X64\MdeModulePkg\Universal\Disk\RamDiskDxe\RamDiskDxe\OUTPUT\.\RamDisk.iiii: ش롰0x1
Stop.
- 显然这里的iasl.exe路径有问题,进系统环境变量重新设置
D:\IASL\iasl.exe
- 编译成功后在Build\EmulatorX64\DEBUG_VS2019\X64下得到HelloWorld.efi,这就是可以直接在UEFI启动阶段运行的固件
3. 编译UEFI固件OVMF.fd
- 按照类似方法编译OvmfX64工程,在Build\OvmfX64\DEBUG_VS2019\FV下得到OVMF.fd启动固件
4. 利用qemu运行编译得到的固件
.\qemu-system-x86_64.exe -pflash E:\edk2\Build\OVMF.fd -hda fat:rw:E:\edk2\Build -net none
- 在启动阶段输入ESC,fs0:,然后ls一下就能看到挂载的HelloWorld.efi文件,然后直接运行就能看到打印了