一、 编写源代码
-
编写UEFI Application 代码C:\edkii\OvmfPkg\MyHelloWorldAppProtocol\MyHelloWorldAppProtocol.c,
... static EFI_MYHELLOWORLD_PROTOCOL * gMyHelloWorldProtocol = NULL; EFI_STATUS EFIAPI MyHelloWorldAppProtocolEntry( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) { EFI_STATUS Status = EFI_SUCCESS; DEBUG ((EFI_D_ERROR , "[MyHelloWorldProtocol] MyHelloWorldAppProtocolEntry Start..\n")); Print (L"[MyHelloWorldProtocol] MyHelloWorldAppProtocolEntry Start..\n"); Status = gBS->LocateProtocol(&gMyHelloWorldPEIGUID,NULL,(VOID **)&gMyHelloWorldProtocol); if (EFI_ERROR(Status)){ Print(L"[MyHelloWorldProtocol] Locate Protocol gMyHelloWorldProtocol %r \n",Status); return Status; } gMyHelloWorldProtocol->PrintMsg(gMyHelloWorldProtocol,L"Hello World App.....\n"); DEBUG ((EFI_D_ERROR, "[MyHelloWorldProtocol] MyHelloWorldAppProtocolEntry End..\n")); Print (L"[MyHelloWorldProtocol] MyHelloWorldAppProtocolEntry End ... \n"); return Status; }
-
编写
UEFI DXE Driver
代码C:\edkii\OvmfPkg\MyHelloWorldDXEProtocol\MyHelloWorldDXEProtocol.c,... static EFI_MYHELLOWORLD_PROTOCOL gMyHelloWorldProtocol ; EFI_STATUS EFIAPI MyHelloWorldDXEProtocolEntry( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) { EFI_STATUS Status = EFI_SUCCESS; DEBUG ((EFI_D_ERROR , "[MyHelloWorldProtocol] MyHelloWorldDXEProtocolEntry Start..\n")); gMyHelloWorldProtocol.PrintMsg = PrintHelloWorldMsg; gMyHelloWorldProtocol.Revision = 1; Status = gBS->InstallProtocolInterface(&ImageHandle, &gMyHelloWorldPEIGUID, EFI_NATIVE_INTERFACE, &gMyHelloWorldProtocol ); if (!EFI_ERROR(Status)){ DEBUG ((EFI_D_ERROR ,"[MyHelloWorldProtocol] MyHelloWorldDXEProtocolEntry Installed Protocol Successfully..\n")); }else{ DEBUG ((EFI_D_ERROR ,"[MyHelloWorldProtocol] MyHelloWorldDXEProtocolEntry Installed Protocol Failly..\n")); } DEBUG ((EFI_D_ERROR , "[MyHelloWorldProtocol] MyHelloWorldDXEProtocolEntry End..\n")); return Status; }
二、 编译生成EFI文件
运行edksetup.bat
编译整个OvmfPkg Package
三、 运行 DXE Driver MyHelloWorldDXEProtocol
与UEFI APP MyHelloWorldAppProtocol
- 拷贝
C:\edkii\Build\OvmfX64\DEBUG_VS2013x86\FV\OVMF.fd
到C:\qemu
;拷贝C:\edkii\Build\OvmfX64\DEBUG_VS2013x86\X64\OvmfPkg\MyHelloWorldAppProtocol\MyHelloWorldAppProtocol\OUTPUT\MyHelloWorldAppProtocol.efi
到 虚拟盘HDD_BOOT.img
- 执行
setup-qemu-x64.bat
| findstr MyHelloWorldProtocol
, 然后在UEFI SHELL
中执行MyHelloWorldAppProtocol.efi
,结果如下,
四、 小结
借助Protocol 机制,应用程序可以很容易的访问驱动程序(DXE Driver)的资源。本文中,驱动模块MyHelloWorldDXEProtocol
在程序入口注册Protocol服务gMyHelloWorldProtocol
,该服务的标识为gMyHelloWorldPEIGUID
;而后应用程序MyHelloWorldAppProtocol
在其入口函数中借助GUID
即可获取驱动中注册的服务,之后就可以调用服务中的函数了。