在实际开发中我们通常对于代码是否优秀有一个代码可配置性有要求,在kernel中我们使用 dts 来配置,在android中有property,那么对于 UEFI ,它的可配置性体现在PCD上面,加入我们同一套UEFI代码应用于PC和Mobile,他们的memory layout是不同的,那么我们通过在不同项目的 dsc 中对memory base, memorysize, Peripheral address base, peripheral address size 作动态配置,这样同一套代码也是可以应用不同平台的。
PCD 的全称是 Platform Configuration Database, 也就是全局可配置数据库。
通常一个 PCD 的定义如下:
TokenSpaceGuidCName.PcdCName
其中:
TokenSpaceGuidCName: 是GUID,通常定义在 dec 文件中
PcdCName: 是 PcdName, 通常定义在 dsc/dsc.inc 中
NOTE:PCD 变量在 Sec, Dxe 的早期因为环境没有准备好,可能是无法使用的,需要注意使用周期问题。
PCD 变量有几种类型:
类型 | 描述 |
PcdsFeatureFlag | 条件判断的Pcd,通常用于宏控或者状态判断 |
PcdsPatchableInModule | 在编译阶段赋值,但是可以在编译生成的二进制文件中更改对应变量 |
PcdsFixedAtBuild | 在编译过程中赋值,在整个UEFI运行周期内不可改变 |
PcdsDynamicDefault | 动态的 Pcd 信息,可以在运行过程中通过 PcdGetXXX, PcdSetXXX 来更改 |
PcdsDynamicExDefault | 跟Dynamic PCD类似,算是加强版,使用宏PcdGetExXXX/PcdSetExXXX来访问变量; |
Pcds 的赋值方式
- # 将 DefaultValue 赋值给 PcdCName
- TokenSpaceGuidCName.PcdCName | DefaultValue
- #各个段意义: PcdName, 默认值, 数据类型,pcd 全局唯一的 token
- TokenSpaceGuidCname.PcdCname|DefaultValue|DatumType|Token
-
- 对于PCD 的定义,一定需要先在 dec 文件中定义,之后使用
- #
- # edk2/MdeModulePkg/MdeModulePkg.dsc
- #
- [PcdsFeatureFlag]
- gEfiMdePkgTokenSpaceGuid.PcdDriverDiagnostics2Disable|TRUE
- gEfiMdePkgTokenSpaceGuid.PcdComponentName2Disable|TRUE
- [PcdsFixedAtBuild]
- gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x0f
- gEfiMdePkgTokenSpaceGuid.PcdReportStatusCodePropertyMask|0x06
- gEfiMdeModulePkgTokenSpaceGuid.PcdMaxSizeNonPopulateCapsule|0x0
- #
- # Core.dsc.inc
- #
- [PcdsPatchableInModule]
- # This PCD should be set to 0 then video resolution could be at highest resolution.
- gEfiMdeModulePkgTokenSpaceGuid.PcdVideoHorizontalResolution|0 gEfiMdeModulePkgTokenSpaceGuid.PcdVideoVerticalResolution|0
- #
- # MdeModulePkg.dec
- #
- [PcdsDynamic, PcdsDynamicEx]
- gEfiMdeModulePkgTokenSpaceGuid.PcdS3BootScriptTablePrivateDataPtr|0x0|UINT64|0x00030000