前言
上一篇文章对EDK2进行了编译运行,我发现,是对EmulatorPkg进行操作,因在target.txt文件中,有指定默认编译文件。此编译文件是一种UEFI的模拟器。会生成QEMU能识别的UEFI模拟器。所以昨天在使用Build命令后,会出现此结果。在EDK2文件夹中,还有一个很重要的固件:OVMF。同样可以使用QEMU打开。OVMF即开放虚拟机固件,它一般用于测试,是虚拟机上的UEFI固件。
编译OVMF
- 首先还是要运行批处理文件edksetup.bat。
-
然后如下命令编译64位的OVMF固件。
在使用build命令编译时,可以使用 -a 选择目标平台,可以是IA32,X64,ARM,IPF或EBC,此操作会代替target.txt文件中的TARGET_ARCH。使用 -p 是通过指定.dsc文件指定要编译的Package。
编译成功如下:
3. 编译后的固件为,在如下路径中的OVMF.fd文件
运行OVMF
1.首先将OVMF.fd文件复制到QEMU的固件库中,如下:
2.然后在此目录下,打开CMD命令行。使用如下命令打开虚拟机。
可以看到这里与上篇文章的模拟器的不同之处。
遇到的问题
NMAKE : fatal error U1077:\BaseTools\Bin\Win32\GenFfs.EXE: ش롰0x2
Stop.
产生原因:在使用新版的edk-master时,因为edk2-BaseTools-win32比较老,新版代码中使用了参数"-oi",旧版不支持这个参数,所以会报错。
解决办法:重新编译edk2-BaseTools或者更新\BaseTools\Source\C\Brotli里的内容。
应用程序工程模块
在完成EDK2环境的搭建后,我接下来,实现了应用程序工程模块的搭建与运行。其实就是一个简单的打印“Hello World”。首先要了解需要哪些文件,一般地需要一个入口函数所在的C文件和一个.inf后缀的工程文件。
1.C文件,我这里使用的是一个简单模块的源程序。
#include<Uefi.h>
EFI_STATUS UefiMain(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable)
{
SystemTable->ConOut->OutputString(SystemTable->ConOut,L"HelloWorld\n");
return EFI_SUCCESS;
}
2.工程文件。在UEFI中想要编译Main.c,需要编写.inf文件。这是模块的工程文件,用于指导EDK2编译工具自动编译模块。如下代码。
[defines]
INF_VERSION = 0x00010005
BASE_NAME = UefiMain
FILE_GUID = 698793E-ED34-ffdb-AE97-1FA5E4D2117
MODULE_TYPE = UEFI_APPLICATION
VERSION_STRING = 1.0
ENTRY_POINT = UefiMain
[Sources]
main.c
[Packages]
MdePkg/MdePkg.dec
[LibraryClasses]
UefiApplicationEntryPoint
UefiLib
3.将此工程文件,引入到此Package中的.dsc中。这里我是在EmulatorPkg.dsc中,方便在虚拟机中展示。
[Components]
EmulatorPkg/Win/Host/UefiMain.inf
4.最后的运行结果如下: