版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiaopangzi313/article/details/89599328
一、 编写源代码
-
编写C:\edkii\OvmfPkg\MyHelloWorldPEIMDriver\MyHelloWorldPEIMDriver.c
#include <uefi.h> #include <Library/UefiLib.h> #include <Library/BaseLib.h> #include <Library/DebugLib.h> #include <Library/BaseMemoryLib.h> #include <Library/UefiDriverEntryPoint.h> #include <Library/PeimEntryPoint.h> #include <Library/PeiServicesLib.h> #include <Library/PeiServicesTablePointerLib.h> #include <Pi/PiHob.h> EFI_GUID gMyHelloWorldPEIGUID = { 0xbdb38129, 0x4d65, 0x39f4, { 0x72, 0x12, 0x68, 0xcf, 0x5a, 0x19, 0xa, 0xf8 }}; //ShellCEntryLib call user interface ShellAppMain EFI_STATUS EFIAPI MyHelloWorldPEIMDriverEntry( IN EFI_PEI_FILE_HANDLE FileHandle, IN CONST EFI_PEI_SERVICES **PeiServices ) { EFI_STATUS Status = EFI_SUCCESS; DEBUG ((EFI_D_ERROR, "MyHelloWorldPEIMDriver Start..\n")); DEBUG ((EFI_D_ERROR, "MyHelloWorldPEIMDriver End..\n")); return Status; }
-
编写C:\edkii\OvmfPkg\MyHelloWorldPEIMDriver\MyHelloWorldPEIMDriver.inf
[Defines] INF_VERSION = 0x00010006 BASE_NAME = MyHelloWorldPEIMDriver FILE_GUID = 69E6DE6D-F09E-485f-9937-EB70FDCFC82B MODULE_TYPE = PEIM VERSION_STRING = 1.0 ENTRY_POINT = MyHelloWorldPEIMDriverEntry [Sources] MyHelloWorldPEIMDriver.c [Packages] MdePkg/MdePkg.dec ShellPkg/ShellPkg.dec MdeModulePkg/MdeModulePkg.dec [LibraryClasses] BaseLib PeimEntryPoint BaseMemoryLib DebugLib PeiServicesLib [depex] TRUE
-
修改C:\edkii\OvmfPkg\OvmfPkgX64.dsc
[Components]... # # PEI Phase modules # OvmfPkg/MyHelloWorldPEIMDriver/MyHelloWorldPEIMDriver.inf ...
-
修改C:\edkii\OvmfPkg\OvmfPkgX64.fdf
[FV.PEIFV] ... # # PEI Phase modules # ... INF OvmfPkg/MyHelloWorldPEIMDriver/MyHelloWorldPEIMDriver.inf ...
二、 编译生成EFI文件
运行edksetup.bat
编译整个OvmfPkg Package,之后查看生成的efi如下,
三、 运行HelloWorld Pei Driver
- 拷贝 C:\edkii\Build\OvmfX64\DEBUG_VS2013x86\FV\OVMF.fd 到
C:\qemu
- 执行
setup-qemu-x64.bat
, 将输出定向到日志文件MyHelloWorldPEIMDriver.log
然后, 从日志文件查看MyHelloWorldPEIMDriver PEI driver的输出如下,
四、 小结
UEFI PEIM
和UEFI APP
的写法区别:
- 就是INF文件中的MODULE_TYPE不同(
PEIM、UEFI_APPLICATION
) FDF
文件中放置位置不同
PEIM
需要放在[FV.PEIFV]
下,编译完成后会打包到OVMF.fd中;而APP
不用强制放在FDF
中,一般放在存储设备(HDD)中执行。