UEFI Application
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相关推荐
- UEFI——保姆级教程的HelloWold Application
HelloWorld Application 前言 为什么是HelloWorld Application又是什么 代码部分 test_application.c文件 test_application. ...
- ARM64的启动过程之(五):UEFI
原文地址: http://www.wowotech.net/linux_kenrel/UEFI.html 一.前言 在准备大刀阔斧进入start_kernel之际,我又重新review了一下head. ...
- 《UEFI内核导读》全集,2023年更新
===================================================================== 固件C字营·版权所有·欢迎转载 敬请关注We-Chat:&q ...
- 服务器raid配置和安装系统,R390X G2服务器配板载RSTe阵列卡UEFI模式安装windows2008 R2系统典型配置...
第一步:设置BIOS启动模式为UEFI 通电启动服务器,待出现下图界面时,按ESC或者DEL键进入BIOS配置界面: 在BIOS配置菜单的Boot选项栏中,将"Boot Mode Selec ...
- UEFI统一可扩展固件接口
统一可扩展固件接口(英语:Unified Extensible Firmware Interface,缩写UEFI)是一种个人电脑系统规格,用来定义操作系统与系统固件之间的软件界面,作为BIOS的替代 ...
- U-boot 对UEFI的支持
U-boot 对UEFI的支持 UEFI on U-Boot Unified Extensible Firmware Interface Specification (UEFI) 已经成为 AArch ...
- 【转载】【UEFI学习】edk2中各个包介绍
AppPkg UEFI Application Development Kit是一系列用来进行uefi app开发的套件,标准依赖库,工具以及demo,目标是降低UEFI app的开发门槛. MdeP ...
- Step to UEFI (137) 通过 BGRT 取得当前系统的 LOGO
对于BIOS来说,用户能够看到的是非常重要的事情.开机Logo就是这样.自从 Win8.1开始,Windows在进入桌面的时候可以显示用户自定义的Logo,而不是Microsoft自定义的图片,这是很 ...
- UEFI 基础教程 (十一) - Shell下读取SMBIOS信息
一. 编写源代码 编写UEFI Application 代码C:\edkii\OvmfPkg\MyHelloWorldSMBios\MyHelloWorldSMBios.c, EFI_STATUS E ...
最新文章
- A标签中通过href和onclick传递的this对象实现思路
- Java中设计模式之装饰者模式-2
- linux shell 编写菜单脚本事例
- 掌握Rabbitmq几个重要概念,从一条消息说起
- Gentoo Linux 学习笔记1
- PHP中include与require的特点和区别说明
- Windows 下 C/C++ 多线程编程入门参考范例
- 中级.NET开发人员应该知道些什么?
- Echarts地图动效制作
- JS获取浏览器高度和宽度
- 并行是什么意思?与并发的区别是什么?
- MindSpore21天实战营(1):基于MindSpore Lite开发目标检测的安卓APP实战
- php页面劫持网站,网站被劫持了怎么修复
- R 单样本wilcoxon test
- 4年前端狗,面试被虐,如何翻身?
- 产品从0~1第一步——市场分析
- 无线传感器网络数据融合技术
- 改变网络输入图像分辨率需要不需要重新训练?
- 压缩脚本linux shell
- C/C++ 提权与强制卸载DLL