UEFI原理与编程(七):包及.dsc、.dec、.fdf文件

包及.dsc、.dec、.fdf文件

前言

  前面的文章中比较详细介绍了UEFI工程文件即.inf。UEFI的包中一般都会包含一个.dsc文件和一个dec文件。在包生成固件Image、Option Rom Image,这个包还要包含.fdf文件。.fdf用于生成固件Image、Option Rom Image或可以启动Image。

  • build 命令用于编译包,它需要一个.dsc文件,一个.dec文件和一个或多个.inf文件。
  • GenFW 命令用于制作固件或Option Rom Image,它需要一个.dec文件和一个.fdf文件。

一、.dsc文件

  .inf用于编译一个模块,而.dsc用于编译一个Package。.dsc文件也是包括必需部分:[Defines],[LibraryClasses],[Components]和可选部分[PCD],[BuildOptions]等。

1. 必需部分

  • [Defines]块
    [Defines]用于设置build相关的全局变量,这些变量可以被.dsc文件的其它模块引用。[Defines]必须是.dsc文件的第一个部分,格式如下:
[Defines]
宏变量名 = 值
DEFINE 宏变量名 = 值
EDK_GLOBAL 宏变量名 = 值

  [Defines]中通过FEFINE和EDK_GLOBAL定义的宏可以在.dsc文件和.fdf文件中通过$(宏变量名)使用。
UEFI原理与编程
这里写图片描述
这里写图片描述

表3-4,表3-5 分别表示[Defines]必需变量和非必须变量
注:截图来源《UEFI原理与编程》第三章。

// /EDK2/ShellPkg/ShellPkg.dsc  示例
[Defines]PLATFORM_NAME                  = ShellPLATFORM_GUID                  = E1DC9BF8-7013-4c99-9437-795DAA45F3BDPLATFORM_VERSION               = 1.0DSC_SPECIFICATION              = 0x00010006OUTPUT_DIRECTORY               = Build/ShellSUPPORTED_ARCHITECTURES        = IA32|IPF|X64|EBC|ARM|AARCH64BUILD_TARGETS                  = DEBUG|RELEASESKUID_IDENTIFIER               = DEFAULT
  • [LibraryClasses]块
    在[LibraryClasses]块定义了库的名字以及库.inf的路径。这些库可以被[Components]块内的模块引用。
    • 语法
      [LibararyClasses.$(Arch).$(MODULE_TYPE)]
      LibraryName | path/LibraryName.inf
      另外还可以使用结构
      [LibararyClasses.$(Arch1).$(MODULE_TYPE1),LibararyClasses.$(Arch1).$(MODULE_TYPE1)]
      LibraryName | path/LibraryName.inf
      • $Arch$MODULE_TYPE是可选项。不使用表示通用。
      • $Arch表示体系结构,可以是下列值之一:IA32,X64,IPF,EBC,ARM,common。common表示对所有体系结构有效。
      • $MODULE_TYPE表示模块的类别,块内列出的库只能提供$(MODULE_TYPE)类别的模块连接。它可以是下列值:SECPEI_COREPEIMDEX_COREDEX_SAL_DRIVERBASEDXE_SMM_DRIVERDXE_DRIVER、\ DXE_RUNTIME_DRIVERUEFI_DRIVERUEFI_APPLICATIONUSER_DEFINED
    • 示例
[LibraryClasses.common]
UefiApplicationEntryPoint|MdePkg/Library/UefiApplicationEntryPoint/UefiApplicationEntryPoint.inf
···
[LibraryClasses.ARM]
NULL|ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf
···
[LibraryClasses.AARCH64]
NULL|ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf
···
  • [Components]块
    该区域块内定义的模块都会被build工具编译并生成.efi文件,格式如下:
    [Components]
     path\Exectuables.inf
    或者
    [Components]
     path\Exectuables.inf{
       < LibraryClasses> # 做嵌套
         LibraryName | Path/LibraryName.inf
       < BuildOptions> # 嵌套块
         #字块中还可以包含< Pcds*>
    }
    注意,path使用相对于EDK2根目录的相对路径。
    示例:
[Components]
···
ShellPkg/Library/UefiDpLib/UefiDpLib.inf {< LibraryClasses>TimerLib|MdePkg/Library/BaseTimerLibNullTemplate/BaseTimerLibNullTemplate.infPerformanceLib|MdePkg/Library/BasePerformanceLibNull/BasePerformanceLibNull.infDxeServicesLib|MdePkg/Library/DxeServicesLib/DxeServicesLib.inf···}

2. 非必须部分

  • [BuildOption]块
    此部分和.inf中的用法大致相同,可以翻阅前面的文章查看。
  • [PCD]块
    [PCD]块用于定义平台配置数据。它的目的是在不改动.inf文件的情况下完成对平台的配置。
    • 举例:在UEFI模拟器Nt32Pkg的.dsc文件Nt32Pkg.dsc中,可以通过PCD的PcdWinNtFileSystem来配置模拟器的文件系统路径。
gEFINt32PkgTokenSpaceGuid.PcdWinNtFileSystem | \
L".!..\..\..\..\EdkShellBinPkg\Bin\Ia32\Apps"|VOID*|106

数线|将配置分为了四个部分,第一部分名字的空间,第二部分是值,第三部分是变量法类型,第四部分是变量数据的最大长度。在源文件中可以使用LibPcdGetPtr(_PCD_TOKEN_PcdWinNtFileSystem)获得gEfiNt32PkgTokenSpaceGuid.PcdWinFileSyste定义的值。

二、.dec文件

  .dec文件定义了公开的数据和接口,供其他模块使用。它包含了必需区块[Defines]以及可选区块[Includes]、[LibraryClasses]、[Guids]、[Protocol]、[Ppis]和[PCD]几个部分。

1.[Defines]块

  [Defines]块用于提供Package的名称、GUID、版本号等信息。

## /EDK2/MdePkg/MdePkg.dec
[Defines] DEC_SPECIFICATION              = 0x00010005 PACKAGE_NAME                   = MdePkg PACKAGE_UNI_FILE               = MdePkg.uni PACKAGE_GUID                   = 1E73767F-8F52-4603-AEB4-F29B510B6766 PACKAGE_VERSION                = 1.06

2.[Includes]块

  列出本Package提供的头文件所在的目录
格式:
[Includes.$(Arch)]
path

## /EDK2/MdePkg/MdePkg.dec
[Includes]Include[Includes.IA32]Include/Ia32[Includes.X64]Include/X64[Includes.IPF]Include/Ipf[Includes.EBC]Include/Ebc[Includes.ARM]Include/Arm[Includes.AARCH64]Include/AArch64

3.[LibraryClasses]块

  Package可以通过.dec文件对外提供库,每个库都必须有一个头文件,放在Include\Library目录下。本区块用于明确库和头文件的对应关系。格式:
[LibraryClasses.$(Arch)]
LibraryName | Path/LibraryHeader.h

## /EDK2/MdePkg/MdePkg.dec
[LibraryClasses]##  @libraryclass  Provides most usb APIs to support the Hid requests defined in Usb Hid 1.1 spec#                  and the standard requests defined in Usb 1.1 spec.##UefiUsbLib|Include/Library/UefiUsbLib.h##  @libraryclass  Provides a service to retrieve a pointer to the EFI Runtime Services Table.#                  Only available to DXE and UEFI module types.UefiRuntimeServicesTableLib|Include/Library/UefiRuntimeServicesTableLib.h
···

4.[Guids]块

  在Package\Include\Guid目录中有很多文件,每个文件内定义了一个或几个GUID

## /EDK2/MdePkg/Include/Guid/Gpt.h
extern EFI_GUID gEfiPartTypeUnusedGuid;
extern EFI_GUID gEfiPartTypeSystemPartGuid;
extern EFI_GUID gEfiPartTypeLegacyMbrGuid;

  这些定义只是声明,常量真正定义在AutoGen.c中,它的值定义在.dec文件的[Guids]区块。

## /EDK2/MdePkg/MdePkg.dec
[Guids]
## Include/Guid/Gpt.hgEfiPartTypeLegacyMbrGuid      = { 0x024DEE41, 0x33E7, 0x11D3, { 0x9D, 0x69, 0x00, 0x08, 0xC7, 0x81, 0xF3, 0x9F }}## Include/Guid/Gpt.hgEfiPartTypeSystemPartGuid     = { 0xC12A7328, 0xF81F, 0x11D2, { 0xBA, 0x4B, 0x00, 0xA0, 0xC9, 0x3E, 0xC9, 0x3B }}## Include/Guid/Gpt.hgEfiPartTypeUnusedGuid         = { 0x00000000, 0x0000, 0x0000, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }}

  当在模块工程文件的[Guids]中引用这些Guid时,这些值就会复制到AutoGen.c中。

5.[Protocols]块

  与Guids类似,在Package\Include\Protocols目录下有很多头文件,每个头文件定义了一个或多个Protocol,这些Protocol的GUID值就定义在.dec文件的[Protocols]区块。
  在MdePkg\Include\Protocol 目录下的BlockIo.h定义了BlockIo Protocol。

extern EFI_GUID gEfiBlockIoProtocolGuid;

gEfiBlockIoProtocolGuid 的值就定义在MdePkg.dec 的[Protocols]块内

  ## Include/Protocol/BlockIo.h
gEfiBlockIoProtocolGuid        = { 0x964E5B21, 0x6459, 0x11D2, { 0x8E, 0x39, 0x00, 0xA0, 0xC9, 0x69, 0x72, 0x3B }}

6.其它块

  • [Ppis]用于定义源文件中用到的PPI(PPI是PEI阶段PEI模块之间通信的接口),语法类似于Protocol。
  • [PCD]块是.dsc文件中[PCD]块的补充。

三、总结

  本部分比较详细的介绍了.dec和.dsc文件结构和其起到的作用。对这两个文件的操作是编写UEFI程序过程中必不可少的一部分,有必要了解它们。

参考资料

  1. 《UEFI原理与编程》 戴正华 著。
  2.  UEFI Spec2_6。
  3.  EDKII GitHub
      

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/354186.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

UEFI学习——在qemu上读取设备PCI信息

1.编写读取设备PCI信息的Application 代码参考罗斌大佬&#xff0c;博客地址&#xff1a;UEFI开发探索13 – 访问PCI/PCI-E设备1 感谢罗斌大佬的贡献&#xff0c;让我在学习UEFI的道路上站在了巨人的肩膀上。 代码&#xff1a; #include <Uefi.h> #include <L…

UEFI开发与调试---ImageHandle和ControllerHandle

##1.ImageHandle 每个uefi module都是一个image&#xff0c;而每个image对应都有一个ImageHandle&#xff0c;其实ImageHandle的类型就是EFI_HANDLE typedef VOID *EFI_HANDLE;因此实际上每个ImageHandle是一个void*指针&#xff0c;那么也就是说任何结…

UEFI的诞生与优势

UEFI的诞生 随着CPU及其他硬件设备的技术革新&#xff0c;CPU和操作系统已支持到64位&#xff0c;而BIOS却还停留在16位&#xff1b;主板上更加丰富多样的扩展设备&#xff0c;也让BIOS愈加无能为力&#xff0c;使得硬件无法完成初始化。现实表明&#xff0c;BIOS已经无法满足…

UEFI shell - 标准应用程序的编译和加载过程

一、标准应用工程编译 首先了解下,应用程序是怎么被编译成.efi文件: UefiMain.c首先被编译成目标文件UefiMain.obj连接器将目标文件UefiMain.obj和其他库连接成UefiMain.dllGenFw工具将UefiMain.dll转换成UefiMain.efi 说明:连接器在生成UefiMain.dll时使用了/dll/entry:_Mo…

UEFI开发,记录第一场胜利——调用一个自己编写的protocol

本文参考BIOS/UEFI基础——Protocol介绍 大四第一个签三方的工作&#xff0c;BIOS的开发&#xff0c;第一次接触这个领域&#xff0c;在实习之前很好奇&#xff0c;也很有兴趣&#xff0c;但是学习BIOS在一开始注定要碰多次碰壁&#xff0c;实习第三周第二天&#xff0c;终于写…

linux系统nohob安装,Linux启动详解1

一、固件运行 本部分主要参考 戴正华 著《UEFI原理与编程》 CPU在加电后会进入16位实模式状态运行&#xff0c;同时CPU的逻辑电路设计为加电瞬间将CS的值设置为 0xF000、IP的值置为0xFFF0&#xff0c;这样CS&#xff1a;IP就指向0xFFFF0这个地址位置。然后开始执行固件 固件的执…

《UEFI原理与编程》读书笔记

《UEFI原理与编程》读书笔记 读书笔记仅摘取对个人有用的部分&#xff0c;详细内容请阅读原著 目前更新至第七章&#xff0c;因个人仅需要引导程序&#xff0c;故其余部分未介绍&#xff0c;详细内容请阅读原著 书及其资料均已放置在本人资源中&#xff0c;如需下载请移步资源模…

UEFI简介

前言 大多数人接触UEFI都是在PC的应用场景上&#xff0c;有在PC上安装过多操作系统的经历的同学&#xff0c;通常会进入UEFI界面设置操作系统引导顺序、CPU虚拟化等设置。UEFI诞生之初也确实是作为BIOS的替代者&#xff0c;主要应用在PC电脑上。随着手机/平板等移动设备的发展&…

10月书讯(上) | 小长假我读这些新书

华章科技提前祝大家国庆快乐 7天小长假&#xff0c;正是读书好时节 又到上新季&#xff0c;读书与休假更配哦 10月书讯&#xff08;上&#xff09;请查收 快来看看哪本书最属你心意 参与文末赠书活动&#xff0c;好书就要抢先读 — 新书速览 — 1、《计算机系统解密&#xff1a…

UEFI启动流程浅析

BIOS启动流程 SEC&#xff08;Security Phase&#xff0c;安全阶段&#xff09;阶段 SEC阶段是平台初始话的第一个阶段&#xff0c;计算机系统加电后首先进入这个阶段。 CPU上电之后&#xff0c;首先会进行硬件初始化&#xff08;hard reset&#xff09; 其次会进行可选的自检…

UEFI规范实现EDKII项目学习笔记绪论[0]

UEFI规范实现EDKII项目学习笔记绪论[0] 2015-07-10 北京海淀区 张俊浩 这段时间在学习UEFI( Unified Extensible Firmware Interface,统一的可扩展固件接口)&#xff0c;熟悉EDKII&#xff08;EFI Developer KitII&#xff0c;EFI开发工具包&#xff09;项目&#xff0c;…

3.UEFI-edk2 增加中文显示

UEFI-edk2源码中默认只有英文和法文的字库&#xff0c;在UI界面上或者shell终端打印中文字符串&#xff0c;则无法显示。例如&#xff0c;上一篇博客中的TestoneApp.cpp中&#xff0c;增加一行带中文字符串的打印&#xff1a; Print(L"Hello, world!\r\n");Print(L&…

UEFI原理与编程(一)

第一章 UEFI概述(Unified Extensible Firmware Interface 统一的可扩展固件接口) 常见缩写及描述&#xff1a; 缩略词全名描述UEFIUnified Extensible Firmware Interface统一的可扩展固件接口BSBoot Services启动服务RTRuntime Service运行时服务BIOSBasic Input Output Sys…

UEFI学习——事件函数WaitForEvent和CreateEvent/CreateEventEx

本文参考戴正华《UEFI原理与编程》 1.等待事件的服务WaitForEvent 启动服务中的WaitForEvent服务的函数原型&#xff1a; /**等待Event数组内任一事件被触发retval EFI_SUCCESS 下表为*index的事件被触发retval EFI_UNSUPPORTED 当前的TPL不是TPL_AP…

开宗明义—UEFI介绍 (二)

UEFI介绍 声明 上一篇介绍了UEFI的发展历史&#xff0c;以及对UEFI在ARM嵌入式领域的生态状况做了简单的调研。本篇旨在对UEFI规范和PI规范的内容以及二者之间的关系做一个简单的梳理。 本篇参考内容主要来源于以下3方面&#xff1a; (1) 微信公众号“ Wolf UEFI社区 ”系列文章…

UEFI学习——使用gRT->GetVariable读取Setup选项值

先列出代码&#xff0c;程序的解释在后面。 代码&#xff1a; #include <Uefi.h> #include <Library/UefiBootServicesTableLib.h> #include <Library/UefiRuntimeServicesTableLib.h> #include <Library/DebugLib.h> #include <Universal\DriverS…

2.1 对称量量化和非对称量化

前言 int8的数据范围可以表示为-128到127之间的整数 uint8的数据范围可以表示为0到255之间的整数 注释&#xff1a;int8就是用8个比特位来保存整数&#xff0c;第一位用来表示符号。uint8表示无符号整数&#xff0c;没有符号位&#xff0c;8个比特位全部用来表示整数。 1.问题…

Zinx框架学习 - 连接管理

Zinx - V0.9 连接管理 每个服务器的能够处理的最大IO数量是有限的&#xff0c;根据当前服务器能开辟的IO数量决定&#xff0c;最终决定权是内存大小现在我们要为Zinx框架增加链接个数的限定&#xff0c;如果超过⼀定量的客户端个数&#xff0c;Zinx为了保证后端的及时响应&…

澳网:公茂鑫/张择创历史 中国男网夺大满贯首胜

资料图&#xff1a;张择在比赛中。 中新网1月16日电 16日&#xff0c;2019年澳大利亚网球公开赛男双第一轮展开争夺&#xff0c;中国组合张择/公茂鑫苦战3盘战胜马特沃斯基/克里赞&#xff0c;收获中国男网在大满贯正赛的首场胜利&#xff0c;创造历史。 首盘比赛&#xff0c…

吴易昺,创造历史

中国网坛历史性一刻图片 当地时间2月12日 在ATP250达拉斯男单决赛中 中国球员吴易昺&#xff08;bǐng&#xff09;延续出色状态 顶住对手44记ACE的猛烈冲击&#xff0c;化解四个赛点后&#xff0c;以6-7(4)、7-6(3)、7-6(12)击败伊斯内尔&#xff0c;夺得个人以及中国大陆男网…