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除标准应用程序工程模块外的其他工程模块--随记相关推荐

  1. elf section类型_在 498 行极小 OS 上跑标准 ELF 程序

    本文首发于 在 498 行极小系统跑标准 ELF 程序 简介 ELF 在 Linux 系统中作为标准可执行文件格式已经存在了 ~25 年. 如果要在 Linux 下直接研究 ELF,通常很难绕过 Li ...

  2. 使用make命令编译C语言程序,c, c++用makefile编译工程 - 1

    基本思路: 最外层有三个文件: Makefile, Make.share, Make.include. 每个工程目录中都有一个Makefile文件. 其中最外层的Makefile是外壳部分.需要调用者 ...

  3. python质数列_现代化程序开发笔记(3)——多文件与模块

    本系列文章以我的个人博客的搭建为线索(GitHub 仓库:Evian-Zhang/evian-blog),记录我在现代化程序设计中的一些笔记.在这篇文章中,我将对现代编程语言的多文件和模块部分进行一些 ...

  4. java微信小程序的校园外卖点餐平台 uniapp

    美食是人类永恒的话题,无论是在古代还是现代人们对美食都有一种非常的热爱在里面,但是随着时代的发展,人们可能没有更多的时间去研究美食,很多时候人们在下班或者放学之后更希望通过网络来进行订餐,为此我开发了 ...

  5. nodejs+vue微信小程序的饭店外卖点餐平台系统

    系统模块分析是对系统的各个模块做出相应的说明以及解释.此系统的模块分别有用户模块.服务端模块和管理端模块这两大基本模块,其中服务端模块包括了首页.菜品信息.菜品咨讯.购物车.我的等:而管理端模块则包括 ...

  6. 程序员在外打工怎么样才算活得精彩?你知道吗?

    程序员在外打工怎么样才算活得精彩?其实不止是程序员,所有在外打工的这一代人,怎么样才算活得精彩?有人说:"乐观一点,开心是一天不开心也是一天,为什么不活得开心点呢".那反过来是不是 ...

  7. Qt应用程序“xxx.exe 已停止工作 故障模块msvcr120.dll”

    Qt应用程序"xxx.exe 已停止工作 故障模块msvcr120.dll" 一.问题描述 二.解决办法: 三.遗留的问题: 一.问题描述 相信许多程序员都遇到过这种问题,好不容易 ...

  8. 浅析Microsoft .net PetShop程序中的购物车和订单处理模块(Profile技术,异步MSMQ消息)转...

    对于Microsoft .net PetShop程序中的购物车和订单处理模块,文中主要分析两种技术的应用: 1. Profile技术在PetShop程序中用于三处: 1) 购物车ShoppingCar ...

  9. ML:MLOps系列讲解之《CRISP-ML (Q)ML生命周期过程—了解机器学习开发的标准过程模型—业务和数据理解→数据工程(数据准备)→ML模型工程→评估ML模型→模型部署→模型监控和维护》解读

    ML:MLOps系列讲解之<CRISP-ML (Q)ML生命周期过程-了解机器学习开发的标准过程模型-业务和数据理解→数据工程(数据准备)→ML模型工程→评估ML模型→模型部署→模型监控和维护& ...

  10. 浅析PetShop程序中的购物车和订单处理模块(Profile技术,异步MSMQ消息)

    对于Microsoft .net PetShop程序中的购物车和订单处理模块,文中主要分析两种技术的应用: 1. Profile技术在PetShop程序中用于三处: 1) 购物车ShoppingCar ...

最新文章

  1. [转载]逐步建设企业DevOps能力
  2. 20_Android中apk安装器,通过WebView来load进一个页面,Android通知,程序退出自动杀死进程,通过输入包名的方式杀死进程
  3. hpux 下查看内存的的大小的几种方法:
  4. linux版英特尔酷睿i7,[图]英特尔酷睿i7 1165G7和AMD Ryzen 7 Pro 4750U Linux性能对比
  5. php图片遍历,php – 如何遍历图像的所有像素?
  6. socket网络编程-字典
  7. 已root手机在DDMS下无法读取data目录的解决办法
  8. uva-10245-分治
  9. C# 改变图片大小的功能代码片段 (wince5)
  10. ajax如何传两个不同的参数,ajax 如何从后台传多个data对象(多个参数)string类型的...
  11. RS485无线通讯模块工作原理详解
  12. 自抗扰控制器-1.跟踪微分器 TD
  13. 人工智能产品经理及十种AI常用算法
  14. wh计算公式_电池的wh和mah怎么换算?
  15. 【RL】算法简介与实现
  16. 疫情之下,企业如何突围?
  17. Apicloud开发新闻类App实战项目-老孟编程
  18. access 有效性规则和有效性文本
  19. 成功WEB商务的7步走(7)——PDCA
  20. JointJS中文文档

热门文章

  1. 入门OJ 1203: 酒鬼
  2. Matlab计算机视觉/图像处理工具箱推荐
  3. 前端 - 实习一个月总结
  4. json改键值大法,C# Newtonsoft.Json.Linq改字段名 增删改查 有屋设计拆单管理一体化软件 全屋定制拆单 橱柜衣柜设计拆单 整装 木门归方程序
  5. Mujoco基本情况介绍
  6. java 语音库_语音控制pc
  7. springboot配置文件为yml格式详解
  8. 甲方爸爸素材给得少,怎么做出高大上的设计?
  9. 细粒度分类网络之WS-DAN论文阅读附代码
  10. DELMIA软件弧焊仿真:以零件面与面相交线为焊缝的机器人弧焊焊接