UEFI Application是一种EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION类型的EFI Image。os loader 是一种特殊的application,执行完成后不会return或者exit,相反会调用EFI boot service gBS->ExitBootServices()来将控制权从fireware 传递给os。
下面是一个名为HelloWorld的UEFI Application的inf文件,从MODULE_TYPE可以明显的看出这是一个UEFI_APPLICATION,和pei/dxe/uefi driver 不同的是UEFI_APPLICATION没有dependency relationship section
[Defines]
  INF_VERSION                    = 0x00010005
  BASE_NAME                      = HelloWorld
  MODULE_UNI_FILE                = HelloWorld.uni
  FILE_GUID                      = 6987936E-ED34-44db-AE97-1FA5E4ED2116
  MODULE_TYPE                    = UEFI_APPLICATION
  VERSION_STRING                 = 1.0
  ENTRY_POINT                    = UefiMain

#
#  This flag specifies whether HII resource section is generated into PE image.
#
  UEFI_HII_RESOURCE_SECTION      = TRUE

#
# The following information is for reference only and not required by the build tools.
#
#  VALID_ARCHITECTURES           = IA32 X64 IPF EBC
#

[Sources]
  HelloWorld.c
  HelloWorldStr.uni

[Packages]
  MdePkg/MdePkg.dec
  MdeModulePkg/MdeModulePkg.dec

[LibraryClasses]
  UefiApplicationEntryPoint
  UefiLib
  PcdLib

[FeaturePcd]
  gEfiMdeModulePkgTokenSpaceGuid.PcdHelloWorldPrintEnable   ## CONSUMES

[Pcd]
  gEfiMdeModulePkgTokenSpaceGuid.PcdHelloWorldPrintString || gEfiMdeModulePkgTokenSpaceGuid.PcdHelloWorldPrintEnable    ## SOMETIMES_CONSUMES
  gEfiMdeModulePkgTokenSpaceGuid.PcdHelloWorldPrintTimes  || gEfiMdeModulePkgTokenSpaceGuid.PcdHelloWorldPrintEnable    ## SOMETIMES_CONSUMES

[UserExtensions.TianoCore."ExtraFiles"]
  HelloWorldExtra.uni

UEFI_APPLICATION的入口函数的原型必须是
EFI_STATUS EFIAPI UefiMain (IN EFI_HANDLE ImageHandle,IN EFI_SYSTEM_TABLE *SystemTable);
其中ImageHandle 表示当前执行的uefi application 也就是自己。SystemTable则是指向EFI System Table的一个指针。
在UefiMain 中可以通过gST得到system table,通过gBS得到boot service,通过gRT得到runtime service
通过LocateProtocol()/HandleProtocol()/ OpenProtocol() 来得到其他UEFI driver提供的protocol
还可以同GetVariable() and SetVariable()来读和写全局变量
EFI_STATUS
EFIAPI
UefiMain (
  IN EFI_HANDLE        ImageHandle,
  IN EFI_SYSTEM_TABLE  *SystemTable
  )
{
    UINT32 Index;
    
    Index = 0;
 
  //
  // Three PCD type (FeatureFlag, UINT32 and String) are used as the sample.
  //
  if (FeaturePcdGet (PcdHelloWorldPrintEnable)) {
      for (Index = 0; Index < PcdGet32 (PcdHelloWorldPrintTimes); Index ++) {
        //
        // Use UefiLib Print API to print string to UEFI console
        //
        Print ((CHAR16*)PcdGetPtr (PcdHelloWorldPrintString));
    }
  }

return EFI_SUCCESS;
}
可以看到在UEFI_APPLICATION 中可以使用pcd,而pcd定义的字符串或者值一般是定义在dec中
这个程序会输出PcdHelloWorldPrintString
而这个字符串的定义如下:
./MdeModulePkg/MdeModulePkg.dec:1255:  gEfiMdeModulePkgTokenSpaceGuid.PcdHelloWorldPrintString|L"UEFI Hello World!\n"|VOID*|0x40000004

从helloworld.map 文件中可以看到_gPcd_FixedAtBuild_PcdHelloWorldPrintString 是被放在rodata段.
  .rodata._gPcd_FixedAtBuild_PcdHelloWorldPrintString
                 0x0000000000001968       0x28 /home//uefi/uefi/Build/RELEASE_GCC49/AARCH64/MdeModulePkg/Application/HelloWorld/HelloWorld/OUTPUT/HelloWorld.lib(AutoGen.obj)
                 0x0000000000001968                _gPcd_FixedAtBuild_PcdHelloWorldPrintString

例如在这个例子中,就直接使用gBS 提供的HandleProtocol
EFI_STATUS
EFIAPI
UefiMain (
  IN EFI_HANDLE        ImageHandle,
  IN EFI_SYSTEM_TABLE  *SystemTable
  )
{
  EFI_STATUS                     Status;
  EFI_GRAPHICS_OUTPUT_PROTOCOL   *Gop;

Status = gBS->HandleProtocol (
                  gST->ConsoleOutHandle,
                  &gEfiGraphicsOutputProtocolGuid,
                  (VOID **) &Gop
                  );

}
因为gBS本来就是全局变量,所以可以直接用,但是也可以通过下面的方式从SystemTable中得到BootServices
EFI_STATUS
EFIAPI
PrintLibConstructor (
  IN EFI_HANDLE                ImageHandle,
  IN EFI_SYSTEM_TABLE          *SystemTable
  )
{
  EFI_STATUS                   Status;

Status = SystemTable->BootServices->LocateProtocol (
                                        &gEfiPrint2ProtocolGuid,
                                        NULL,
                                        (VOID**) &mPrint2Protocol
                                        );
  ASSERT_EFI_ERROR (Status);
  ASSERT (mPrint2Protocol != NULL);

return Status;
}

UEFI Application相关推荐

  1. UEFI——保姆级教程的HelloWold Application

    HelloWorld Application 前言 为什么是HelloWorld Application又是什么 代码部分 test_application.c文件 test_application. ...

  2. ARM64的启动过程之(五):UEFI

    原文地址: http://www.wowotech.net/linux_kenrel/UEFI.html 一.前言 在准备大刀阔斧进入start_kernel之际,我又重新review了一下head. ...

  3. 《UEFI内核导读》全集,2023年更新

    ===================================================================== 固件C字营·版权所有·欢迎转载 敬请关注We-Chat:&q ...

  4. 服务器raid配置和安装系统,R390X G2服务器配板载RSTe阵列卡UEFI模式安装windows2008 R2系统典型配置...

    第一步:设置BIOS启动模式为UEFI 通电启动服务器,待出现下图界面时,按ESC或者DEL键进入BIOS配置界面: 在BIOS配置菜单的Boot选项栏中,将"Boot Mode Selec ...

  5. UEFI统一可扩展固件接口

    统一可扩展固件接口(英语:Unified Extensible Firmware Interface,缩写UEFI)是一种个人电脑系统规格,用来定义操作系统与系统固件之间的软件界面,作为BIOS的替代 ...

  6. U-boot 对UEFI的支持

    U-boot 对UEFI的支持 UEFI on U-Boot Unified Extensible Firmware Interface Specification (UEFI) 已经成为 AArch ...

  7. 【转载】【UEFI学习】edk2中各个包介绍

    AppPkg UEFI Application Development Kit是一系列用来进行uefi app开发的套件,标准依赖库,工具以及demo,目标是降低UEFI app的开发门槛. MdeP ...

  8. Step to UEFI (137) 通过 BGRT 取得当前系统的 LOGO

    对于BIOS来说,用户能够看到的是非常重要的事情.开机Logo就是这样.自从 Win8.1开始,Windows在进入桌面的时候可以显示用户自定义的Logo,而不是Microsoft自定义的图片,这是很 ...

  9. UEFI 基础教程 (十一) - Shell下读取SMBIOS信息

    一. 编写源代码 编写UEFI Application 代码C:\edkii\OvmfPkg\MyHelloWorldSMBios\MyHelloWorldSMBios.c, EFI_STATUS E ...

最新文章

  1. A标签中通过href和onclick传递的this对象实现思路
  2. Java中设计模式之装饰者模式-2
  3. linux shell 编写菜单脚本事例
  4. 掌握Rabbitmq几个重要概念,从一条消息说起
  5. Gentoo Linux 学习笔记1
  6. PHP中include与require的特点和区别说明
  7. Windows 下 C/C++ 多线程编程入门参考范例
  8. 中级.NET开发人员应该知道些什么?
  9. Echarts地图动效制作
  10. JS获取浏览器高度和宽度
  11. 并行是什么意思?与并发的区别是什么?
  12. MindSpore21天实战营(1):基于MindSpore Lite开发目标检测的安卓APP实战
  13. php页面劫持网站,网站被劫持了怎么修复
  14. R 单样本wilcoxon test
  15. 4年前端狗,面试被虐,如何翻身?
  16. 产品从0~1第一步——市场分析
  17. 无线传感器网络数据融合技术
  18. 改变网络输入图像分辨率需要不需要重新训练?
  19. 压缩脚本linux shell
  20. C/C++ 提权与强制卸载DLL

热门文章

  1. 幻数java题_幻数
  2. MySQL数据库怎么进行分库分表?
  3. python import注意事项
  4. 推荐 130 个令你眼前一亮的网站,总有一个用得着
  5. 【个人笔记】photoshop中回退撤销问题
  6. C语言输出矩阵的主对角线和以及次对角线和
  7. 专属微信公众号消息推送(java版)
  8. 有三顶红帽子和两顶蓝帽子逻辑推理
  9. PTrade和QMT对比那个更好用?
  10. 百度智能云OCR获取APIKey和SecretKey