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即可获取驱动中注册的服务,之后就可以调用服务中的函数了。

[DXEProtocol DEMO源码]

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值