UEFI除标准应用程序工程模块外的其他工程模块--随记
UEFI其他类型的工程模块(除标准应用程序工程模块)
- Shell应用工程模块
- 用户入口函数
- 工程文件
- UEFI入口函数ShellCEntryLib
- 使用main函数的应用程序工程模块
- 库模块
- 驱动模块
- 驱动类型
- 工程文件
Shell应用工程模块
标准应用程序工程模块,它 的 入参有很多系统参数需要处理,还有很多其他的命令行参数处理,很不方便。但一般的应用程序都需要在Shell下去执行,它就需要带命令行参数。edk2就提供了Shell应用程序工程模块
用户入口函数
INTN
EFIAPI
ShellAppMain (IN UINTN Argc,IN CHAR16 **Argv)
{UINTN Index;if (Argc == 1) {Print (L"Argv[1] = NULL\n");}for (Index = 1; Index < Argc; Index++) {Print(L"Argv[%d]: \"%s\"\n", Index, Argv[Index]);}return 0;
}
Shell应用程序模块的入口函数都是INIT ShellAppMain函数,它 的入参里面没有了系统参数,我们要使用系统表这些系统参数,就需要gST这些全局量。
工程文件
Shell应用程序的工程文件和标准应用程序的工程文件有区别部分区别:
MODULE_TYPE和标准应用程序一样是UEFI_APPLICATION,但是它的ENTRY_POINT必须是ShellCEntryLib,并且必须要在源文件中实现ShellAppMain。必须要有MdePkg/MdePkg.dec和ShellPkg/ShellPkg.dec声明文件。必须要有ShellCEntryLib库,一般还要使用系统表,需要有UefiBootServicesTableLib库。
[Defines]INF_VERSION = 0x00010006BASE_NAME = ShellCTestAppFILE_GUID = 7a6ca3b8-ee1b-489c-b300-24544a7bd418MODULE_TYPE = UEFI_APPLICATIONVERSION_STRING = 1.0ENTRY_POINT = ShellCEntryLib[Sources]ShellCTestApp.c[Packages]MdePkg/MdePkg.decShellPkg/ShellPkg.dec[LibraryClasses]ShellCEntryLibUefiLib
UEFI入口函数ShellCEntryLib
Shell应用程序的入口函数是ShellCEntryLib,它的原型在ShellPkg/Library/UefiShellCEntryLib/UefiShellCEntryLib.c下面:
EFI_STATUS
EFIAPI
ShellCEntryLib (IN EFI_HANDLE ImageHandle,IN EFI_SYSTEM_TABLE *SystemTable)
{###################################Status = SystemTable->BootServices->OpenProtocol(ImageHandle,&gEfiShellParametersProtocolGuid,(VOID **)&EfiShellParametersProtocol,ImageHandle,NULL,EFI_OPEN_PROTOCOL_GET_PROTOCOL);if (!EFI_ERROR(Status)) {//// use shell 2.0 interface//ReturnFromMain = ShellAppMain (EfiShellParametersProtocol->Argc,EfiShellParametersProtocol->Argv);} else {
###################################
}
}
它的入参和标准应用程序的入参是一样的,它会去打开EFI_SHELL_PAEAMETERS_PROTOCOL,通过这个protocol获得ShellAppMain的入参,就是首先获取命令行参数,然后再调用用户的入口函数ShellAppMain去打开Shell。
使用main函数的应用程序工程模块
使用main函数的应用程序工程模块会使用StdLib,在StdLib中提供了ShellAppMain函数,我们自己实现main函数作为程序的入口函数供ShellAppMain去调用,真正的模块入口函数是ShellCEntryLib,调用过程是:ShellCEntryLib———>ShellAppMain——>main
使用main函数的应用程序工程模块要在AppPkg环境下才能编译成功,所以需要将main.inf添加到AppPkg.dsc文件的[Components]块下。
自己没遇到过这种,和shell应用程序工程模块用法一样
库模块
在开发uefi工程过程中,会使用到大量的库。库也有源文件、工程文件,其他模块要使用库,要将这个库添加到包的dsc声明文件中
UefiLib.inf:
[Defines]INF_VERSION = 0x00010005BASE_NAME = UefiLibMODULE_UNI_FILE = UefiLib.uniFILE_GUID = 3a004ba5-efe0-4a61-9f1a-267a46ae5ba9MODULE_TYPE = UEFI_DRIVERVERSION_STRING = 1.0LIBRARY_CLASS = UefiLib|DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SMM_DRIVER UEFI_APPLICATION UEFI_DRIVER SMM_CORECONSTRUCTOR = UefiLibConstructorBaseDebugLibNull.inf:
[Defines]INF_VERSION = 0x00010005BASE_NAME = BaseDebugLibNullMODULE_UNI_FILE = BaseDebugLibNull.uniFILE_GUID = 9ba1d976-0624-41a3-8650-28165e8d9ae8MODULE_TYPE = BASEVERSION_STRING = 1.0LIBRARY_CLASS = DebugLib
可以看到库的工程文件和其他应用程序有很大的区别。没有ENTRY_POINT;它会指定 MODULE_TYPE是BASE函数DRIVER等类型;通过LIBRARY_CLASS设定库名,指定库的适用范围,让它仅能被特定的模块调用
其他模块要使用这个库,就将库添加到自己的dsc文件中:
[LibraryClasses]
UefiLib|MdePkg/Library/UefiLib/UefiLib.inf
然后在自己的inf中添加这个库:
[LibraryClasses]
UefiLib
然后在源文件中就可以使用这个库了
库如果要在使用之前需要初始化,那要在库的工程文件中指定CONSTRUCTOR和DESTRUCTOR
驱动模块
驱动和应用程序的最大区别就是驱动会常驻内存,而应用程序在执行完毕之后就会从内存中清除。
驱动类型
1、符合UEFI驱动模型的驱动,驱动模型是UEFI_DRIVER,称为UEFI驱动
2、不遵循UEFI驱动模型的驱动,包括类型:DXE_DRIVER、DXE_SAL_DRIVER、DXE_SMM_DRIVER、DXE_RUNTIME_DRIVER,称为DXE驱动
驱动
工程文件
[Defines]INF_VERSION = 0x00010005BASE_NAME = UefiLibMODULE_UNI_FILE = UefiLib.uniFILE_GUID = 3a004ba5-efe0-4a61-9f1a-267a46ae5ba9MODULE_TYPE = UEFI_DRIVERVERSION_STRING = 1.0LIBRARY_CLASS = UefiLib|DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SMM_DRIVER UEFI_APPLICATION UEFI_DRIVER SMM_CORECONSTRUCTOR = UefiLibConstructor
参考:UEFI原理与编程《戴正华》
UEFI除标准应用程序工程模块外的其他工程模块--随记相关推荐
- elf section类型_在 498 行极小 OS 上跑标准 ELF 程序
本文首发于 在 498 行极小系统跑标准 ELF 程序 简介 ELF 在 Linux 系统中作为标准可执行文件格式已经存在了 ~25 年. 如果要在 Linux 下直接研究 ELF,通常很难绕过 Li ...
- 使用make命令编译C语言程序,c, c++用makefile编译工程 - 1
基本思路: 最外层有三个文件: Makefile, Make.share, Make.include. 每个工程目录中都有一个Makefile文件. 其中最外层的Makefile是外壳部分.需要调用者 ...
- python质数列_现代化程序开发笔记(3)——多文件与模块
本系列文章以我的个人博客的搭建为线索(GitHub 仓库:Evian-Zhang/evian-blog),记录我在现代化程序设计中的一些笔记.在这篇文章中,我将对现代编程语言的多文件和模块部分进行一些 ...
- java微信小程序的校园外卖点餐平台 uniapp
美食是人类永恒的话题,无论是在古代还是现代人们对美食都有一种非常的热爱在里面,但是随着时代的发展,人们可能没有更多的时间去研究美食,很多时候人们在下班或者放学之后更希望通过网络来进行订餐,为此我开发了 ...
- nodejs+vue微信小程序的饭店外卖点餐平台系统
系统模块分析是对系统的各个模块做出相应的说明以及解释.此系统的模块分别有用户模块.服务端模块和管理端模块这两大基本模块,其中服务端模块包括了首页.菜品信息.菜品咨讯.购物车.我的等:而管理端模块则包括 ...
- 程序员在外打工怎么样才算活得精彩?你知道吗?
程序员在外打工怎么样才算活得精彩?其实不止是程序员,所有在外打工的这一代人,怎么样才算活得精彩?有人说:"乐观一点,开心是一天不开心也是一天,为什么不活得开心点呢".那反过来是不是 ...
- Qt应用程序“xxx.exe 已停止工作 故障模块msvcr120.dll”
Qt应用程序"xxx.exe 已停止工作 故障模块msvcr120.dll" 一.问题描述 二.解决办法: 三.遗留的问题: 一.问题描述 相信许多程序员都遇到过这种问题,好不容易 ...
- 浅析Microsoft .net PetShop程序中的购物车和订单处理模块(Profile技术,异步MSMQ消息)转...
对于Microsoft .net PetShop程序中的购物车和订单处理模块,文中主要分析两种技术的应用: 1. Profile技术在PetShop程序中用于三处: 1) 购物车ShoppingCar ...
- ML:MLOps系列讲解之《CRISP-ML (Q)ML生命周期过程—了解机器学习开发的标准过程模型—业务和数据理解→数据工程(数据准备)→ML模型工程→评估ML模型→模型部署→模型监控和维护》解读
ML:MLOps系列讲解之<CRISP-ML (Q)ML生命周期过程-了解机器学习开发的标准过程模型-业务和数据理解→数据工程(数据准备)→ML模型工程→评估ML模型→模型部署→模型监控和维护& ...
- 浅析PetShop程序中的购物车和订单处理模块(Profile技术,异步MSMQ消息)
对于Microsoft .net PetShop程序中的购物车和订单处理模块,文中主要分析两种技术的应用: 1. Profile技术在PetShop程序中用于三处: 1) 购物车ShoppingCar ...
最新文章
- [转载]逐步建设企业DevOps能力
- 20_Android中apk安装器,通过WebView来load进一个页面,Android通知,程序退出自动杀死进程,通过输入包名的方式杀死进程
- hpux 下查看内存的的大小的几种方法:
- linux版英特尔酷睿i7,[图]英特尔酷睿i7 1165G7和AMD Ryzen 7 Pro 4750U Linux性能对比
- php图片遍历,php – 如何遍历图像的所有像素?
- socket网络编程-字典
- 已root手机在DDMS下无法读取data目录的解决办法
- uva-10245-分治
- C# 改变图片大小的功能代码片段 (wince5)
- ajax如何传两个不同的参数,ajax 如何从后台传多个data对象(多个参数)string类型的...
- RS485无线通讯模块工作原理详解
- 自抗扰控制器-1.跟踪微分器 TD
- 人工智能产品经理及十种AI常用算法
- wh计算公式_电池的wh和mah怎么换算?
- 【RL】算法简介与实现
- 疫情之下,企业如何突围?
- Apicloud开发新闻类App实战项目-老孟编程
- access 有效性规则和有效性文本
- 成功WEB商务的7步走(7)——PDCA
- JointJS中文文档