PCD的全称是Platform Configuration Database,它是一个存放了UEFI下可访问数据的数据库。
它的特点是可以在UEFI存在的大部分时间内访问,在【UEFI实战】在库中使用全局变量中就曾经介绍过通过PCD来传递全局变量。这里说是大部分时间内,那是因为在诸如SEC阶段,以及PEI、DXE阶段的早期,某些PCD相关的模块还没有加载起来之前,这些类型的PCD还是不能访问的。
TokenSpaceGuidCName.PcdCName
TokenSpaceGuidCName是一个GUID,PcdCName是一个变量名,两者合起来构成了唯一的PCD变量。
PCD的类型
FeatureFlag PCD:它最终返回的是一个TRUE或者FALSE,用于判断条件中;FeatureFlag PCD跟FixedAtBuild是一样的,它相当于类型是BOOELAN的FixedAtBuild PC
PatchableInModule PCD:这种变量的值可以在编译的时候确定,这个不算特别,特别的是它可以在编译完成的二进制文件上通过工具来修改值;
FixedAtBuild PCD:静态值,在编译的时候确定,整个UEFI阶段不可变;
Dynamic PCD:前面的三种类型可以认为是静态的PCD,而这里以及之后的是动态的PCD;它的特点是可以在UEFI运行的过程中通过Set宏来修改值;在《edk-ii-build-specification.pdf》中有说明该种类型的PCD必须在DSC中在列一遍,但是实际使用似乎并不是必须的;
DynamicEx PCD:跟Dynamic PCD类似,算是加强版,使用宏PcdGetEx/PcdSetEx来访问变量;
需要注意的是上面的类型并不是在一个SPEC中定义的,前面的4中是满足EDKII规范,而最后一个满足的是PI规范,这个对使用的影响还不是很确定。
实现说明
下面说明各种PCD的实现。
FixedAtBuild PCD
不同的PCD类型实现方式有差异,这里首先介绍最简单的FixedAtBuild PCD。.然后在一个模块中使用

3. 编译后查看该模块编译目录中的AutoGen.c文件,可以看到如下的内容

这里的_PCD_VALUE_PcdTestVarx的值在AutoGen.h中声明:

也就是说,对应FixedAtBuild PCD来说,它就是在编译的时候通过宏的方式生成的。
也因此它是固定不变的一个值。
Dynamic PCD
下面介绍Dynamic PCD,首先看一个例子:
dec定义,

本文详细介绍了UEFI下的PlatformConfigurationDatabase(PCD)的各种类型,包括FeatureFlagPCD、PatchableInModulePCD、FixedAtBuildPCD、DynamicPCD和DynamicExPCD,以及它们的访问方式、实现机制和存储位置。着重讲解了FixedAtBuildPCD和DynamicPCD的区别,以及如何通过工具修改PatchableInModulePCD的值。
最低0.47元/天 解锁文章
617

被折叠的 条评论
为什么被折叠?



