上一章讲述如何在ubuntu搭建edk2编译环境,这一篇讲述如何在edk2环境下添加一个简单的APP,编译运行helloworld打印信息,并使用U盘进行加载生成的efi格式文件。qemu虚拟机运行uefi加载该应用。
1.应用源码编写与工程修改
(1)编写edk2\OvmfPkg\HelloWorld\HelloWorld.c
#include <Uefi.h>
#include <Library/UefiLib.h>
#include <Library/BaseLib.h>
#include <Library/DebugLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/UefiBootServicesTableLib.h>
//ShellCEntryLib call user interface ShellAppMain
EFI_STATUS
EFIAPI
HelloWorldEntry(
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
EFI_STATUS Status = EFI_SUCCESS;
Print (L"[Console] HelloWorldEntry Start..\n");
Print (L"[Console] HelloWorldEntry End ... \n");
return Status;
}
(2).编写edk2\OvmfPkg\HelloWorld\HelloWorld.inf
[Defines]
INF_VERSION=0x00010007
BASE_NAME = HelloWorld
FILE_GUID = 69A6DE6D-FA9F-485E-9A4E-EA70FDCFD82F
MODULE_TYPE = UEFI_APPLICATION
VERSION_STRING = 1.0
ENTRY_POINT = HelloWorldEntry
[Sources]
HelloWorld.c
[Packages]
MdePkg/MdePkg.dec
ShellPkg/ShellPkg.dec
MdeModulePkg/MdeModulePkg.dec
[LibraryClasses]
ShellCEntryLib
BaseLib
BaseMemoryLib
DebugLib
PrintLib
UefiBootServicesTableLib
MemoryAllocationLib
UefiLib
(3).修改edk2\OvmfPkg\OvmfPkgX64.dsc
......
ShellLib|ShellPkg/Library/UefiShellLib/UefiShellLib.inf
ShellCEntryLib|ShellPkg/Library/UefiShellCEntryLib/UefiShellCEntryLib.inf
S3BootScriptLib|MdeModulePkg/Library/PiDxeS3BootScriptLib/DxeS3BootScriptLib.inf
......
......
[Components]
OvmfPkg/ResetVector/ResetVector.inf
OvmfPkg/HelloWorld/HelloWorld.inf
......
提示:在编译时可能会报错,我编译时有ShellCEntryLib这个库说找不到,找了一下,我在上面这个文件中添加了相关的库的inf(ShellCEntryLib|ShellPkg/Library/UefiShellCEntryLib/UefiShellCEntryLib.inf是我加的),最终编译通过。
(4).修改edk2\OvmfPkg\OvmfPkgX64.fdf
......
INF OvmfPkg/Sec/SecMain.inf
INF RuleOverride=RESET_VECTOR OvmfPkg/ResetVector/ResetVector.inf
INF OvmfPkg/HelloWorld/HelloWorld.inf
......
2.编译生成efi文件
(1)在edk2路径下运行编译指令:
source edksetup.sh
build -a X64 -t GCC48 -p OvmfPkg/OvmfPkgX64.dsc
(2)编译完成后生成了efi文件
3.用U盘加载eif文件运行ovmf
把编译生成的efi文件拷贝到U盘根目录下,我的U盘时fat32格式,在安装了qemu的前提下在终端窗口到edk2工程路径下运行如下指令:
sudo qemu-system-x86_64 -bios Build/OvmfX64/DEBUG_GCC48/FV/OVMF.fd -M pc -m 256 -cpu qemu64 -vga cirrus -name UEFI -boot order=dc -hda /dev/sdb1 -serial stdio
其中“-hda /dev/sdb1”是加载U盘设备,这个可以根据具体的来修改,用lsblk查看设备。运行结果如下图:
总结:
编译应用时,会遇到缺少内部库模块的问题,可以在工程中搜索一下,看看是否能通过包含inf的方式解决。这里已经添加了shell输入和打印的功能的实现,在后期进行调试时,可以在调试过程中添加打印信息来掌握调试期间出现的问题。