UEFI 基础教程 (六) - PROTOCOL 简单使用

一、 编写源代码

  1. 编写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;
    }
    
  2. 编写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

  1. 拷贝 C:\edkii\Build\OvmfX64\DEBUG_VS2013x86\FV\OVMF.fdC:\qemu;拷贝C:\edkii\Build\OvmfX64\DEBUG_VS2013x86\X64\OvmfPkg\MyHelloWorldAppProtocol\MyHelloWorldAppProtocol\OUTPUT\MyHelloWorldAppProtocol.efi 到 虚拟盘HDD_BOOT.img
  2. 执行setup-qemu-x64.bat | findstr MyHelloWorldProtocol , 然后在UEFI SHELL 中执行 MyHelloWorldAppProtocol.efi,结果如下,
    在这里插入图片描述在这里插入图片描述

四、 小结

借助Protocol 机制,应用程序可以很容易的访问驱动程序(DXE Driver)的资源。本文中,驱动模块MyHelloWorldDXEProtocol 在程序入口注册Protocol服务gMyHelloWorldProtocol,该服务的标识为gMyHelloWorldPEIGUID;而后应用程序MyHelloWorldAppProtocol在其入口函数中借助GUID即可获取驱动中注册的服务,之后就可以调用服务中的函数了。

原文链接:加载失败,请重新获取