1个人理解

  个人理解PCD基本等同于Token,应当算是一种描述性语言,按照规定书写好PCD的配置档,在编译的过程中,会根据你的配置生成同等含义的C文档,而在C文档中对应会出现相应的define或者变量声明定义。下面通过具体的例子来说明PCD档的基本含义和使用方式以及注意事项:首先需要准备EDK的环境,具体到某个案子的代码也可以,因为UEFI的架构下,基本上都是使用EDK编译的。

2 实例介绍

  先用一个实际的例子,让大家对于PCD有个直观的感受(以EDKII/MdeModulePkg/Application/HelloWorld为例

2.1 MdeModulePkg/Application/HelloWorld.c的代码如下所示:

2.2 PCD在MdeModulePkg/MdeModulePkg.dec中的定义如下图所示:

  /* PCD的TOKEN值*/

在上图的PCD的定义中,最后都有一些0x0001200a这样的值,这些都是TOKEN的值,它的主要作用是用来区分每个Token,给每个Token一个独立的编号,必须赋值,否则会编译失败。用户在DEC中定义PCD时会指定每个PCD的TOKEN值,编译器编译之后,在     AutoGen.h文件中可以发现TOKEN的值会被宏定义成下列的值,与用户指定的不太一样,这是因为编译器会自动为每一个PCD再次生成一个TOKEN值,以免由于用户方面操作不当,而导致TOKEN的值重复。

2.3  MdeModulePkg/Application/HelloWorld.inf配置档如下图所示:

  一般看到的PCD定义如2.2中所示,PCD的定义一般是在*.dec的文件里进行第一次默认声明,比如:MdeModulePkg/Application/HelloWorld.c文档中所用到的这三个PCD就是在MdeMoulePkg/MdeMoulePkg.dec中进行声明。在PCD的定义中,一般需要关注的就是变量名,默认值,变量类型。

  *.inf文档配置后可以在*.c文档中使用,之所以能使用,是因为在编译过程中,编译器会帮助生成宏定义或者变量声明的东西。在EDK的环境下直接编译HelloWorld例子,在build/MdeModulePkg/Application/HelloWorld/DEBUG文件夹下有AutoGen.h和AutoGen.c这两个文件,这两个文件中括了PCD的声明和定义,个人理解是编译器解析DEC和INF档中有关PCD的说明,接着首先生成中间文件AutoGen.h和AutoGen.c,接着HelloWorld.c负责去调用这两个文件中的内容。从而达到使用PCD的目的(个人理解,仅供参考)。

  我将AutoGen.h和AutoGen.c文件中的内容做了一些截取,筛选出来了一些重要部分show给大家看。根据PCD最开始的描述,在相应的C文档中,都有其对应的宏定义和说明,我们的HelloWorld.c中最终所使用的PCD应该是也是来源于这两个中间文件,从这两个文件怎么与HelloWorld.c联系在一起,如果实现调用生成.efi目标程序,还需要再研究一下(未完待续)

3 PCD基本类型介绍总结

   基本可以将PCD当作一个描述性语言,编译工具(例如AutoGen工具)在编译过程中会根据相应DEC文件或这DSC文件中的描述,进行编译然后在生成的AutoGen.h和AutoGen.c或者其他的.h与.C文件中,对每个PCD所表述的变量进行定义或者宏定义。

3.1 PCD涉及的基本文件类型

  *.inf是编译某个模块的指导文件。

  *.dsc是编译一个Package的指导文件。

  *.dec中定义了公开的数据和接口,供其他Package中的某个Moudle使用。

3.2 PCD类别

  EDK II中PCD根据其作用的时间,分为两大类:

3.1.1 在编译过程中起作用,

这类PCD等同C语言中的全局静态变量,包含FeatureFlag PCD, FixedAtBuild PCD以及 PatchableInModule PCD三种:

1)PcdsFeatureFlag:

  表示一个Feature是On还是Off,Value一般是TRUE或者FALSE,该类型的PCD在编译时会赋予Const类型,定义在AutoGen.h文件中,多用来描述一些BOOL型的变量值。

  如1.2实例所示:

  在HelloWorld.inf文档中定义了如下的PCD

   [FeaturePcd]

      gEfiMdeModulePkgTokenSpaceGuid.PcdHelloWorldPrintEnable

  在最终生成的AutoGen.c和AutoGen.h中可以看到PcdHelloWorldPrintEnable的宏定义以及最终的赋值是赋了一个BOOL型的真值1,如下:

#define _PCD_VALUE_PcdHelloWorldPrintEnable   ((BOOLEAN)1U)

2)FixedAtBuild:

  与PcdsFeatureFlag类似,最大的不同在于它可以宣告多种不同的变量类型,不仅限于Bool型。可以是UINT32型的变量等.例如,我在MdeModulePkg/MdeModulePkg.dec中增添如下定义:

  在其HelloWorld.inf中增添如下声明:

   

   build过之后可以看到在AutoGen.c和AutoGen.h中有如下定义和声明:

   

  

3)PatchableInModule:

  该种变量与上述最大的不同是在Runtime时可以去变动它的数值,除此之外,它将被宣告成一个Global变量,被宣告成该种变量同一时刻,仅有同一个Module可以存取,不能透过它与各Module相互传递数值。

3.1.2 在平台初始化过程中起作用

  包含: DynamicDefaultPCD, DynamicHIIPCD, 和DynamicVpdPCD等几种:

1)DynamicDefault:

  DynamicDefault形态的PCD的最大又是在于,各个Module之间可以借由这个PCD来互相传递数值。典型的例子:比如预先把某个不会变动的值从HW中读出来,并且存储到一个DynamicDefault类型的PCD中,这样其他的Module就可以不用再经过繁杂的动作去存取HW上的值,而是可以直接透过PCD读取就好。

PcdsDynamicExDefault:

  多了Ex的PCD与上述DynamicDefault很相似,但如果一个Module不是同时间与整个Platform一起Build的,而是一个外部的Binary,Platform与Binary又需要互相存取某个PCD的数值的话,这时候一开始就应该把该PCD宣告成PcdsDynamicExDefault的形态,但是外部的Binary在使用该PCD的时候,必须先知道该PCD的TOKEN值才可通过LibPcdGetExXX或者LibPcdSetExXX来进行存取。

2)DynamicHIIPCD:

  HII型態的PCD在DSC需定好它所對應的Variable Name、GUID、Offset(位於Variable Data的哪個Offset)還有Default Value。如果系統中不存在著該Variable,那麼就會從PCD取得DSC所定好的預設值,否則就會回傳該Variable的Data加上Offset。

DynamicExHIIPCD:

  多了Ex的DynamicExHii則意思跟DynamicEx很相似。

3)PcdsDynamicVpd and PcdsDynamicExVpd:

  VPD (Vital Product Data),在NVS會有一塊區域被用來儲存VPD的資料,與其它Dynamic PCD不同,VPD只能唯讀,無法在執行期間去修改它的數值。關於VPD的部分,目前我還沒有機會用到,故不多说

4 关于PCD默认值和重新赋值

  PCD最开始声明定义的地方在*.dec文件中,如果直接使用的该PCD的话,那么编译器从*.dec取出该值作为默认值供使用,多数情况下,用户可能会不使用*.dec中所提供的默认值,那么就需要对默认值进行修改。如何修改呢?仍旧以HelloWorld为例进行说明。

   

  如上图是在MdeModule.dec文件中对HelloWorld所用的PCD的默认定义,在进行编译之后,在AutoGen.h中生成的字符串数组如下如所示:假如你仍旧想使用这个PCD但是不想使用这个UEFI HELLO……的字符串,该如何做呢?

   

  一般是在MdeModule.dsc文件中做如下修改,然后编译:

  

  编译出来的Autogen.c文件中,可以看到原来的PCD所定义的字符串已经改为了你想要的,如下图:

   

  以上是关于PCD的一些基本了解,以上内容为本人自己学习总结,仅供参考如有错误,请及时指出,谢谢!

  目前还需要深入了解的是关于Dynamic类型PCD的定义,使用,传递,以后看代码的时候需多加注意。

【UEFI】--- 关于UEFIPCD的总结介绍相关推荐

  1. ghost还原固态硬盘_最完整用GHOST安装UEFI(GPT)引导的系统请关注收藏

    这篇文章可能是关于GHOST安装UEFI引导系统干货最多的文章,请关注并收藏 随着计算机技术的发现,M.2硬盘,2t以上的硬盘,uefi引导的系统已经成为了主流,但是UEFI引导的系统安装却给许多小白 ...

  2. UEFI开发探索100 – 《UEFI编程实践》发布啦

    (请保留-> 作者: 罗冰 https://blog.csdn.net/luobing4365) <UEFI编程实践>发布 1 内容简介 第一部分 UEFI环境搭建及UEFI应用构建 ...

  3. UEFI入门必读的12本书

    作者简介 罗冰:系统安全(特别是物理隔离领域)专家,主导开发网络隔离卡.双网隔离机.国产隔离系统.单向光传输等各类安全产品,拥有十几项发明和实用新型专利.致力于UEFI技术的研究.实践和推广,在CSD ...

  4. 支持UEFI的原装win10安装U盘制作教程

    现在电脑主板都是uefi的了.要重装系统就得使用原装win10安装盘且支持uefi,下面我就来介绍一下如何制作. 1,去msdn上下载原版win10镜像.下载 最好使用迅雷下载. 2,下载rufus. ...

  5. uefi引导gpt安装win10_Win10系统安装教程(U盘PE+UEFI安装)

    一.准备工作 U盘,电脑一台,Win10原版镜像,建议去MSDN官网的 I Tell You下载.有很多版本,选择适合自己的下载就可以了. 二.下载wepe工具箱 下载64位的Win10 pe,使用工 ...

  6. 【操作系统】系统分区介绍

    文章目录 必须的分区 根分区/ (root分区) /boot 分区 swap分区 efi分区(内容较多) 非必须分区 /usr分区 /backup /home /tmp 注:主要记录磁盘分区问题,是否 ...

  7. Acer 4750 安装黑苹果_黑苹果系统安装通用教程图文版

    在开始之前,不管你要安装的是台式组装机,台式品牌机,一体机,还是笔记本,都要大概了解一下硬件信息. 因为黑苹果的安装确实比安装Windows的系统要复杂的多. 不管是前期准备工作,安装,还是安装之后要 ...

  8. 如何用光盘映像文件重装服务器系统,光盘映像文件如何装系统_通过光盘映像文件装系统的方法...

    光盘映像文件是一种虚拟光盘文件,通常有iso.img等格式,我们网上下载的windows操作系统光盘映像一般都是iso格式,,网上下载的Windows光盘映像文件一般是iso.很多用户不知道光盘映像文 ...

  9. linux桌面环境日志,小白的Linux桌面环境的配置手记

    Linux桌面环境的配置 Linux不同于Windows和macOS,是一种开源的操作系统.在网上你可以找到很多以Linux为核心的操作系统,它们统称为Linux distributions,包括Ub ...

  10. android AVB2.0(二)Uboot阶段AVB2.0校验流程

    android AVB2.0学习总结传送门 本篇属于android AVB2.0学习总结系列的第二篇文章,本篇主要介绍一下UBOOT或者UEFI阶段AVB2.0的介绍. 支持原创,转载请标明链接 ht ...

最新文章

  1. Spring学习笔记_IOC
  2. 阿里云服务器外网访问问题
  3. php强类型作用,php类、接口、抽象、trait、强类型使用
  4. 移动硬盘提示无法访问使用驱动器中的光盘之前需要格式化,里面的数据怎么恢复...
  5. 控制抽象之简化客户代码
  6. 智能终端会议系统(20)---网络视频传输协议--RTP/RTCP/RTSP/SIP/SDP 之间关系
  7. 此计算机必须为委派而被信任_实际利用Kerberos Bronze Bit漏洞绕过委派限制(CVE202017049)...
  8. java io流区别_Java中IO流的分类和BIO,NIO,AIO的区别
  9. [转载] python中的bin()方法
  10. 有学问,还是牛逼啊!
  11. 124.二叉树中的最大路径和
  12. FMEA失效模式和影响分析
  13. iOS LBS地图服务--高德地图使用大全
  14. 知名密码管理应用LastPass启用双因素认证
  15. JIRA REST API调用方式
  16. ros中msg文件的bool类型并不会生成bool类型变量
  17. bazel切换版本笔记
  18. 面对不同种类的处理结果——result type=
  19. python期末试题汇总
  20. linux 列转行函数,GP行转列、列转行函数

热门文章

  1. 百万人核酸检测,大数据助力北京战疫
  2. 如何构建下一代大数据架构——数据湖
  3. java:编写“百钱买百鸡”问题
  4. java 的一丢丢知识
  5. SQL Server语法入门
  6. 微信微型计算机的主机包括,微型计算机主机由什么组成
  7. 2020秋招知识点查漏补缺(预热期),大量高频大厂面试题集合(有解析)
  8. OpenCV中 视频的读取、图像序列的读取、摄像头的调用
  9. 哪家期货公司的保证金比例最低
  10. Windows 2000/2003 server域和活动目录