应用模块

应用模块包含标准应用程序模块,shell应用程序模块,以及main应用程序模块

  • 标准应用程序模块
    它是所有其他应用程序模块的基础,作为一个模块来说,同样由源文件和工程文件(.inf)组成。
    它的特征如下:

    (1) .inf中的ENTRY_POINT一般设置为UefiMain,这是一个约定俗称的名字,所以这个规则并不是一定的。
    (2) 指定的ENTRY_POINT入口函数必须要在模块源文件中有对应的实现。
    (3).inf中的MODULE_TYPE必须设置为UEFI_APPLICATION

    例如:

    [Defines]
    INF_VERSION                    = 0x00010006
    BASE_NAME                      = TestApp
    FILE_GUID                      = 7C04A583-9E3E-4f1c-AD65-E05268D0B4D1
    MODULE_TYPE                    = UEFI_APPLICATION
    VERSION_STRING                 = 1.0
    ENTRY_POINT                    = UefiMain 
  • shell应用程序模块
    故名思意,这是一种方便在uefi shell环境中执行的应用程序模块,可以方便的处理shell传入的命令行参数。
    它的特征如下:

    (1) ENTRY_POINT必须设置为ShellCEntryLib
    (2) MODULE_TYPE必须设置为UEFI_APPLICATION
    (3) [Packages]中需要引用MdePkg和ShellPkg这两个包
    (4) [LibraryClasses]中必须依赖ShellCEntryLib
    (5) 源文件中必须要定义函数EFIAPI ShellAppMain (IN UINTN Argc, IN CHAR16 **Argv)

    例如:

    [Defines]INF_VERSION                    = 0x00010006BASE_NAME                      = HelloFILE_GUID                      = a912f198-7f0e-4803-b908-b757b806ec83MODULE_TYPE                    = UEFI_APPLICATIONVERSION_STRING                 = 0.1ENTRY_POINT                    = ShellCEntryLib#  VALID_ARCHITECTURES           = IA32 X64 IPF[Sources]Hello.c
    [Packages]MdePkg/MdePkg.decShellPkg/ShellPkg.dec
    [LibraryClasses]UefiLibShellCEntryLib

    这类模块的运行都是从ShellCEntryLib开始,这个函数是在ShellCEntryLib中实现的,在其中会调用一个名为ShellAppMain的函数,这也就是为什么我们需要在源文件中必须实现ShellAppMain的原因。

  • main应用程序模块
    熟悉C语言的应该都知道此函数,UEFI中也支持这种类型的应用程序模块,但是这种类型的模块需要依赖libc库。特征如下:

    (1) ENTRY_POINT必须设置为ShellCEntryLib。
    (2) MODULE_TYPE必须设置为UEFI_APPLICATION
    (3) [Packages]中除了引用MdePkg和ShellPkg这两个包之外,还有StdLib包
    (4) [LibraryClasses]中必须依赖ShellCEntryLib,LibC和LibStdio库
    (5) 源文件中必须要定义main函数,和普通的C语言编程定义的格式一样。

库模块

一个大型工程中肯定缺少不了库,库作为一个公用模块,能够极大的复用代码,提高开发效率,UEFI中同样支持库模块,它的特征如下:

(1) MODULE_TYPE必须设置为BASE
(2) 必须要定义LIBRARY_CLASS为库名
(3) 不要设置入口函数ENTRY_POINT

驱动模块

驱动分为两种类型,一种为UEFI驱动,另一种为DXE驱动。UEFI驱动是符合UEFI驱动模型的一种模块,框架定义了如何驱动硬件以及如何提供服务(Protocol的绑定)。而DXE驱动主要是用于实现一些特殊功能的模块,简化驱动的开发,比如我们想仅仅提供一种服务,而不驱动硬件,那么可以采用DXE驱动的形式来简化此功能的实现。在UEFI中,驱动模块和应用模块都运行在同一个地址空间,不像Linux分为应用空间和内核空间,它们最大的区别是:应用程序只在运行时存在于内存在,而驱动是常驻内存的。所以对于一个服务来说,我们需要它常驻内存就必须通过驱动的方式来安装。

UEFI驱动和DXE驱动的最大区别是UEFI驱动需要按照UEFI定义的框架来实现一个驱动,而DXE驱动没有这个限制,更加自由,比如我们仅仅想提供一个服务,那么只需要在DXE驱动的ENTRY_POINT中去实现Procotol即可,而如果要通过UEFI驱动实现,当然是可以的,只是会稍微复杂一些。

它的特征如下:

(1) 它也有ENTRY_POINT入口函数,并且在驱动load时执行此入口函数,该函数需要在源文件中定义
(2) MODULE_TYPE被设置为UEFI_DRIVER或者DXE_DRIVER
(3) [LibraryClasses]块中必须要包含UefiDriverEntryPoint

Protocol

Protocol在UEFI是一个很重要的概念,它可以认为是一个服务,一个service和client之间的接口,通过上文,我们已经了解到,服务是需要常驻内存的,那么一般Protocol是实现在UEFI驱动模块和DXE驱动模块中的。当驱动模块作为Protocol的服务提供者加载以后,那么应用程序就可以作为客户端来使用此服务了。BootService提供了InstallProtocolInterface和OpenProtocol相关的一些操作。

UEFI开发与调试---edk2中的应用模块/库模块/驱动模块相关推荐

  1. UEFI开发与调试---edk2中的Module

    Edk2在设计是按照模块来进行的,其中模块包含有很多种类型,比如最常见的三种:应用程序模块,驱动模块,库模块.每个模块都包含了一个工程元数据文件(.inf)和源文件..inf文件是用来辅助编译的,功能 ...

  2. UEFI开发与调试---edk2中的Package

    在开始编写UEFI APP之前,我们需要先对UEFI包和模块的概念有个了解. 在edk2的根目录下,我们可以发现有很多*Pkg命令的目录,这些实际上都是各个不同的包,每个包中都是一组模块的集合,每个包 ...

  3. UEFI开发与调试--edk2中的基础组件

    还记得前面介绍的MdePkg和MdeModulePkg吗?这两个包中会实现UEFI内核中的基础组件,其中就包括了系统表,启动服务表,运行时服务表. 系统表(System Table) 系统表是edk2 ...

  4. UEFI开发探索97 – EDK2模拟器搭建网络环境

    (请保留-> 作者: 罗冰 https://blog.csdn.net/luobing4365) EDK2模拟器搭建网络环境 1 搭建EDK2开发环境 1)工具安装 2)下载代码库 3)更新子模 ...

  5. [UEFI开发] Linux Ubuntu EDK2环境搭建

    UEFI开发EDK2环境搭建(Ubuntu - Linux X86_64) UEFI是什么? 开发系统环境的选择--Linux 正文 安装工具 1.获取EDK 2代码 2.修改配置文件 3.编译Bas ...

  6. 使用Xilinx K7 KC705开发板调试PCIe中的问题【持续更新】

    开发板:Xilinx K7 KC705 软件:ISE14.7 1.由于应用需求,我们要将开发板作为主机端,通过PCIe接口转接板外接一个NVMe PCIe SSD.并由FPGA控制SSD的数据读写. ...

  7. UEFI开发与调试---QEMU虚拟盘的创建与修改

    支持的文件格式 qemu支持多种类型的文件系统,而最原生的以及最灵活的是qcow2类型了,这种文件系统支持写时复制,加密,压缩以及VM快照. 除了这种文件系统之外,如下类型也是被支持的:raw ,cl ...

  8. 移动app开发,调试过程中,手机端浏览器无法正常访问接口

    问题描述:前后端分离开发过程中,在本地启动一个tomcat服务后,pc端的浏览器可以访问接口,但是移动端的却访问不到 解决方案: 1 将pc和移动端放在同一个局域网内(连接wifi) 2 将pc端的C ...

  9. 微信开发工具及Hbuilder中引用阿里巴巴矢量库(步骤一样)

    第一步:创建一个阿里巴巴矢量库项目,将图标加入项目中,并生成一个在线的css文件 第二步:在微信开发者工具中新建一个.wxss文件,把第一步中的复制好的代码粘贴到这个文件中,如果将来有新的图标放置项目 ...

最新文章

  1. 【Verilog HDL 训练】第 05 天(序列检测)
  2. Hadoop科普文—常见的45个问题解答 #183; Hadoop
  3. npm安装不上nodemon_node.js - NPM安装在nodemon@1.18.9后安装脚本处失败 - 堆栈内存溢出...
  4. 成功解决Visual Studio 2015安装时,点击vs_community.exe 没有反应
  5. spring mvc @ModelAttribute 基本类型 自定义对象解析流程
  6. 计算机课实验三,成都信息工程学院计算机网络课程实验三
  7. 进程与线程的区别(面试题)
  8. k8s dashboard_【大强哥-k8s从入门到放弃02】Kubernetes1.17部署Dashboard2.0
  9. 基于JAVA+SpringMVC+Mybatis+MYSQL的毕业论文设计管理系统
  10. Spring Cloud与微服务学习总结(3)——认证鉴权与API权限控制在微服务架构中的设计与实现(一)
  11. Android热修复更改图标,Android手写热修复(一)--ClassLoader
  12. java性能、代码优化
  13. 【Objecitve C代码】让对象沿着某条路径移动的动画效果
  14. C#技术分享【PDF转换成图片——10种方案】(2013-07-25重新整理)
  15. java 拼音 排序_java对中文(拼音)进行排序
  16. 在哪里可以搜索英文文献?
  17. 崩坏3mmd中的渲染技术研究
  18. 程序执行报错Missing Connection or ConnectionString 解决方法
  19. halo开源博客搭建微信小程序实现内容同步-总结
  20. 后LHC时代对撞机:瞬间输出能量超全球电力千倍

热门文章

  1. 计蒜客 T1853:非常男女(前缀和)
  2. OSPF与BGP协议流程与协议格式简单学习
  3. web结课作业的源码——HTML+CSS+JavaScript仿oppo官网手机商城(1页)
  4. c# winform 查源码综合工具及方法、快速查c#源码方法,加壳工具
  5. Effective-Java 检查参数有效性
  6. 论文笔记:Controlling Decoding for More Abstractive Summaries with Copy-Based Networks
  7. 支付宝17年新春红包技术体系剖析
  8. 互动媒体技术——《代码本色》习作二:向量
  9. 流量控制工具TC详细说明
  10. 解决Whitelabel Error Page最简单的方式