在开始编写UEFI APP之前,我们需要先对UEFI包和模块的概念有个了解。

在edk2的根目录下,我们可以发现有很多*Pkg命令的目录,这些实际上都是各个不同的包,每个包中都是一组模块的集合,每个包中都有对应的描述文件(.dsc),声明文件(.dec)。当然如果这个包是用来生成固件Image或者Option Rom Image,那么这个包还需要包含一个.fdf文件(Flash Description File),此文件是用来生成固件Image,Option Rom Image或者可启动Image的。

包的编译过程包括:

  • build 命令利用.dsc和.dec以及一个或者多个.inf文件来编译Package

  • GenFW 命令用来生成固件,利用.dec和.fdf文件来生成一个目标Image

描述文件(.dsc)

.dsc文件用于编译Package,它包含了[Defines],[LibraryClasses],[Components]几个必须部分以及[PCD],[BuildOptions]等可选部分。

  • [Defines]
    定义用于描述该包的全局变量,它必须是dsc文件的第一个描述项目,必须定义的宏变量如下:

    [Defines]
    PLATFORM_NAME                  = Ovmf
    PLATFORM_GUID                  = 5a9e7754-d81b-49ea-85ad-69eaa7b1539b
    PLATFORM_VERSION               = 0.1
    DSC_SPECIFICATION              = 0x00010005
    SUPPORTED_ARCHITECTURES        = X64
    BUILD_TARGETS                  = NOOPT|DEBUG|RELEASE
    SKUID_IDENTIFIER               = DEFAULT

    当然也有可选择定义的宏,如下列出两个常用的:

    OUTPUT_DIRECTORY               = Build/OvmfX64
    FLASH_DEFINITION               = OvmfPkg/OvmfPkgX64.fdf
    ......
    
  • [LibraryClasses]
    该块中定义引用的Library,格式需要指定库的名字已经对应的.inf路径,这里定义的Library,可以被包中所有的Components所引用。

    [LibraryClasses]PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.infTimerLib|OvmfPkg/Library/AcpiTimerLib/BaseAcpiTimerLib.infPrintLib|MdePkg/Library/BasePrintLib/BasePrintLib.infBaseMemoryLib|MdePkg/Library/BaseMemoryLibRepStr/BaseMemoryLibRepStr.infBaseLib|MdePkg/Library/BaseLib/BaseLib.infSafeIntLib|MdePkg/Library/BaseSafeIntLib/BaseSafeIntLib.inf
    

    如上所示,Library的定义需要name和.inf文件路径,并且中间以一个|符号分割开。也可以通过[LibraryClasses.$(ARCH).$(MODULE_TYPE)]来区分不同的Arch和Module Type。

  • [Components]
    列出本包中所有的模块组件,各个模块是通过指定对应的.inf文件来加入到包中的:

    [Components]
    OvmfPkg/ResetVector/ResetVector.inf# SEC Phase modulesOvmfPkg/Sec/SecMain.inf {<LibraryClasses>NULL|MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf
    }# PEI Phase modulesMdeModulePkg/Core/Pei/PeiMain.inf
    MdeModulePkg/Universal/PCD/Pei/Pcd.inf  {<LibraryClasses>PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
    }
    MdeModulePkg/Universal/ReportStatusCodeRouter/Pei/ReportStatusCodeRouterPei.inf {<LibraryClasses>PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
    }

    如上所示,除了能够指定对应的模块inf文件,还可以通过{}来包含该模块的一些私有属性,比如在{}中定义的,这里的库是仅给父模块引用的,对包中其他的模块没有影响,而.dsc中定义的[LibraryClasses]块,则整个包中的模块都可以引用,如果模块私有引用了相同库名,但不同路径下的库,那么会覆盖公共区定义的引用。

  • [BuildOptions]
    定义编译选项,此处定义的编译选项对该包中的所有模块都有效,格式如下:

    [BuildOptions.$(Arch).$(CodeBase)]
    [编译器]:[$(Target)]_[Tool]_[$(Arch)]_[CC|DLINK]_FLAGS=
    

    实例:

    [BuildOptions]
    GCC:*_UNIXGCC_*_CC_FLAGS             = -DMDEPKG_NDEBUG
    GCC:RELEASE_*_*_CC_FLAGS             = -DMDEPKG_NDEBUG
    INTEL:RELEASE_*_*_CC_FLAGS           = /D MDEPKG_NDEBUG
    MSFT:RELEASE_*_*_CC_FLAGS            = /D MDEPKG_NDEBUG
    
  • PCD Section
    用于定义平台配置数据,其中定义的变量是可以直接被源程序通过接口获取到,其目的是在不改动.inf文件和源文件的情况下完成对平台的配置。这样就达到灵活配置平台选项,不用为了兼容不同平台而去修改代码,[PcdsFeatureFlag],[PcdsFixedAtBuild], [PcdsDynamicDefault]这三个都属于PCD Section的可选部分。

声明文件(.dec)

声明文件用来定义公开的数据和接口,供其他模块使用,包含必需块[Defines]以及可选块[Includes],[LibraryClasses],[Guids],[Protocols],[Ppis],[PCD]。.dec文件需要被调用模块.inf文件所包含。

  • [Defines]
    提供包的名字,版本号,GUID:

    [Defines]
    DEC_SPECIFICATION              = 0x00010005
    PACKAGE_NAME                   = OvmfPkg
    PACKAGE_GUID                   = 2daf5f34-50e5-4b9d-b8e3-5562334d87e5
    PACKAGE_VERSION                = 0.1
  • [Includes]
    头文件所在目录,起始于.dec所在目录的相对目录:

    [Includes]
    Include
    
  • [LibraryClasses]
    该包对外提供的库的集合,格式为:库名 | 头文件

    [LibraryClasses]
    LoadLinuxLib|Include/Library/LoadLinuxLib.h
  • [Guids]
    在Package/Include/Guid目录中有很多文件,每个文件内定义了一个或者多个GUID,例如OvmfPkg/Include/Guid/OvmfPlatformConfig.h头文件中:

    extern EFI_GUID gOvmfPlatformConfigGuid;

    可以看到这里仅仅是一个声明,那么它的定义就是在本块中完成的:

    [Guids]
    gOvmfPlatformConfigGuid      = {0x7235c51c, 0x0c80, 0x4cab, {0x87, 0xac, 0x3b, 0x08, 0x4a, 0x63, 0x04, 0xb1}}
  • [Protocols]
    和Guids配置方法类似,在Package/Include/Protocols目录定义了Protocol的头文件,比如头文件/OvmfPkg/Include/Protocol/VirtioDevice.h:

    extern EFI_GUID gVirtioDeviceProtocolGuid;

    头文件仅仅是声明,定义在dec文件中:

    [Protocols]
    gVirtioDeviceProtocolGuid           = {0xfa920010, 0x6785, 0x4941, {0xb6, 0xec, 0x49, 0x8c, 0x57, 0x9f, 0x16, 0x0a}}
  • [Ppis]
    定义源文件中用到的PPI(PEI模块之间通信的接口),语法类似Protocols。

  • [PCD]
    此块是对dsc文件中[PCD]块的补充。

UEFI开发与调试---edk2中的Package相关推荐

  1. UEFI开发与调试---edk2中的应用模块/库模块/驱动模块

    应用模块 应用模块包含标准应用程序模块,shell应用程序模块,以及main应用程序模块 标准应用程序模块 它是所有其他应用程序模块的基础,作为一个模块来说,同样由源文件和工程文件(.inf)组成. ...

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

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

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

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

  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. 飞腾FT2000/4 u-boot/UEFI开发环境搭建

    参考 UEFI开发与调试-edk2中子目录介绍 ACP基础--Resource Descriptors for ACPI ubuntu16.04操作系统下的edk2安装 [UEFI实战]如何在OS下获 ...

最新文章

  1. elcipse 安装lombok插件解决 @Slf4j 等找不到log变量问题
  2. 用ORBSLAM2运行TUM Dataset数据集Monocular Examples
  3. 4)PHP命名规则,传值方式
  4. java图书凭租_如何通过java一步实现租书系统
  5. C++使用ICE实现两台主机通信实例
  6. SuperSQL:跨数据源、跨DC、跨执行引擎的高性能大数据SQL中间件
  7. php sql获取字段名称,mssql获取字段名及注释,以及一系列问题
  8. 程序员如何确保软件没 Bug?
  9. python字符串split()函数
  10. php写 被转移,php从windows往linux迁移注意事项
  11. Python基础语句
  12. C\C++ | FILE文件基本操作函数
  13. 黑马12期配套15年6天hadoop培训
  14. 最全Ansible学习总结
  15. Android 8.1 从零开始写 HAL -- (2) 实现 HAL 主体
  16. uni-app中如何引入uViewUI?
  17. Dos攻击与DDos攻击原理与区别,怎么防护?
  18. Solr基础知识总结
  19. IVD-Net01:代码涉及函数
  20. Unity-TA 成长之路(三)URP-Universal Render Pipeline

热门文章

  1. npm安装报错(npm ERR! code EPERM npm ERR! syscall mkdir npm ERR! path C:\Program Files\nodejs\node_ca...)
  2. 计蒜客 T1853:非常男女(前缀和)
  3. 动态调试之——x64dbg的使用
  4. Python中的字符串
  5. Mysql子查询优化技术
  6. torch.cat()函数的官方解释,详解以及例子
  7. Android SwipeRefreshLayout GMail的下拉刷新效果
  8. iphone13 设备类型 DeviceType
  9. 很二2022,滚蛋吧! 幸福2023,过来吧!
  10. unity 骨骼物理 头发 布料模拟