概念

PCD(Platform Configuration Database,平台配置数据)就是抽取出代码中可配置的数据而不修改源代码。类似于C语言中的宏,降低了代码维护的工作量,增加了可复用性。不同于宏的是,有些PCD(动态PCD)可以在代码运行的时候修改。

PCD常用类型

  • 所谓模块级别就是在不同的模块中可以有不同的值;在Boot阶段不可修改类似于宏定义或者用const修饰的变量;FeatureFlag比FixedAtBuild更加特殊,它的值只能是Boolean的TRUE或者FALSE,可以看作是Boolean类型的FixedAtBuild;
  • PatchableInModule类型的PCD值在Boot阶段可以修改,可以用于以二进制形式发布的模块中;
  • Dynamic和DynamicEx是系统级的、动态的,在整个boot过程中可以被修改,同时在整个系统中都能生效。DynamicEx类的PCD主要用在二进制文件中使用到PCD的情况,可以实现跨平台访问和修改以二进制发布的驱动中的PCD的值。

Dynamic分为三类:

  1. DynamicDefault:存在于Mem/Hob中,下次启动时,更改的值就丢失了,从默认值开始启动;
  2. DynamicHii:存在于EFI Variable中,下次Boot还是起效的;
  3. DynamicVpd:存在于Vpd空间的(Flash上,是只读的),一般用于出厂配置。

【进阶PCD类型基本用不到,还有难度,略过……】

PCD的数据类型:

PCD的数据类型有BOOLEAN、UINT8、UINT16、UINT32、UINT64或VOID *型。

使用PCD

Pcd 是一个包对外的一个接口,在 Dec(Pkg)中声明,在 Inf (Module)中使用,在 DSC (Platform)中配置。

DEC文件中声明

[Guids.common]

PcdTokenSpaceGuidName={0xXXXXXXXX,0xXXXX,0xXXXX,{0xXX,...}}

...

[Pcds...]

PcdTokenSpaceGuidName.PcdTokenName | Value [ | DatumType [ | MaxSize ] ] | Token

  • PcdTokenSpaceGuidName可以使用DEC文件中现有的,也可以自己声明一个。在 [Guids] 块下声明,大括号中的内容是唯一不重复的Guid;
  • PCD 由 TokenSpaceGuid 和 TokenNumber (就是上面标红的)唯一确定,与TokenName无关(数据要转成binary的,所以不会是由TokenName决定唯一);
  • TokenName (与PcdTokenSpaceGuidName一起)在获取PCD的值的时候使用;
  • DatumType 是PCD数据类型;
  • 一个.dsc文件中的TokenSpaceGuid一般是同一个;
  • [Pcds...] 指出了该PCD支持的类型,可以用FixedAtBuild,FeatureFlag,PatchableInModule,Dynamic 以及 DynamicEx 中的任意一种代替,也可以是除了 FeatureFlag 之外的多个组合在一起并使用 ’,’ 进行分隔;
  • 声明后,只有Value是可以在DSC中更改的,其他的都不可以;
  • PcdTokenSpaceGuidName 类似于C++ 中的命名空间,在不同的 PcdTokenSpaceGuidName 下,PcdTokenName 可以相同。

INF文件中引用

[...Pcd...]

PcdTokenSpaceGuidName.PcdTokenName | [ Value ]

不同类型的 PCD 在 文件中对应的块名称不同,使用多种类型的 PCD 要分别在 INF 文件中对应的块中引用。

PCD类型: INF文件中块名称:
PcdsFeatureFlag FeaturePcd
PcdsFixedAtBuild FixedPcd
PcdsPatchableInModule PatchPcd
PcdsDynamic Pcd
PcdsDynamicEx PcdEx

如果一个PCD被声明多种类型且在INF文件中引用时都放 [Pcd] 块中,编译工具会根据优先级决定PCD的类型:PcdsFixedAtBuild > PcdsPatchableInModule > PcdsDynamicDefault > PcdsDynamicExDefault。

DSC文件中可修改

[...Pcd...]

PcdTokenSpaceGuidName.PcdTokenName | Value [ | DatumType[ |MaximumDatumSize ] ]

在 DSC 文件中对 PCD做初始化,如果没有初始化则使用 DEC 中默认的 PCD 值。

在C代码中修改/访问

PcdLib 提供了接口用于 PC的 的读取和修改。PcdGetXX() 和 PcdSetXX() 可以用于任何 PCD 类型(XX:8、16、32、Size、Ptr、Boolean)。PcdGetXX() 用于根据 PCD Name 获取 PCD 值,就是 TokenNumber;PcdSetXX() 用于根据 PCD 的名称重新设置 PCD 的。

【本文源自于卓易云课堂中高黎明老师的课程学习笔记,相关连接贴上:】

卓易云课堂 (zqtong.com)https://cloudclass.zqtong.com/hall

【BIOS/UEFI】PCD配置和使用相关推荐

  1. 绕过BIOS/UEFI固件写保护写入SPI闪存

    针对Bootkit:LoJax或MosaicRegressor和TrickBot等开始进行固件感染方式的病毒逐渐增多而作笔记整理. 对主板上的SPI闪存芯片中存储的UEFI固件的所有请求都将通过SPI ...

  2. Grub2 引导 WIM / Slax Linux (BIOS UEFI)

    文章目录 Grub2 引导 WIM / Slax Linux (BIOS & UEFI) 安装Grub2到U盘 / 硬盘 1. 准备分区格式 2.安装Grub2 3.复制Grub2 配置文件和 ...

  3. uefi多linux系统启动盘,DIY制作无需格BIOS+UEFI双启动U盘工具|支持syslinux+grub+boomgr+grub2多启动...

    如果你想让你的U盘可启动的话,要怎么做呢,可能很多人都知道借助软件能自动实现,但那些方式都需要把U盘格式化一遍,而这个工具完全不需要,只需要把下载的文件解压到U盘根目录就能实现多启动了,支持bios和 ...

  4. deepin efi 启动u盘_【2017.12.16】启动U盘简单手动制作BIOS+UEFI的syslinux/grub/boomgr/grub2互转...

    本帖最后由 lintrainwy 于 2018-1-4 15:05 编辑 文件和方法来源于网上,本人做了整合,方便U盘启动 1.BIOS方式下,这个U盘启动是syslinux 6.03+grub4do ...

  5. 天意u盘启动盘安装linux,(BIOS+UEFI双启WINPE)天意u盘维护系统技术员版V2.1

    大家应该注意到了,最新的笔记本电脑都改成了UEFI而不是我们以前的bios启动了. 所以天意老师出了这个UEFI+bios双启版,修改于ISO全能版. 去掉了linux.dos菜鸟工具箱:去掉了软件工 ...

  6. (BIOS+UEFI双启)天意u盘维护系统技术员版V1.0

    大家应该注意到了,最新的笔记本电脑都改成了UEFI而不是我们以前的bios启动了. 所以天意老师出了这个UEFI+bios双启版,修改于ISO全能版. 去掉了linux.dos菜鸟工具箱:去掉了软件工 ...

  7. 磁盘分区 (MBR, GPT)、启动流程 (BIOS, UEFI)

    本文为<鸟哥的 Linux 私房菜>读书笔记 目录 磁盘分区 MBR (MS-DOS) 分区表 GPT (GUID partition table) 磁盘分区表 BIOS 与 UEFI 启 ...

  8. 中柏 EZpad 8 Windows 平板电脑 |驱动备份|系统优化|不能调节显示器亮度|进入Bios/uefi 快捷键 |蓝牙扫描不到设备|CPU占用过高解决方案

    前言 之前一直使用的这个平板,但是有个很严重的问题就是性能实在太差了,每次都是CPU百分百,Mem 百分之50% 这个结果真的很意外, 但是又无可奈何,后面花时间做了一些优化包括 进程限制  启动优化 ...

  9. linux创建虚拟声卡,Pear BIOS 安装和配置指引

    Pear BIOS 安装指引 Pear BIOS是一套硬件模拟系统,操作系统可以在这套模拟硬件上运行. Pear BIOS可以让用户同时安装多套操作系统,使用时可以选择任何一套操作系统启动. 在传统电 ...

最新文章

  1. 更换VC后DDC提示证书不可用
  2. PHP的优点和缺点分别是什么,CSS的优点和缺点分别是什么
  3. @请注意查收:《史上最全的AI论文资料》.pdf
  4. 发现一个很不错的正则表达式生成器
  5. spring cloud 入门系列七:基于Git存储的分布式配置中心--Spring Cloud Config
  6. dw网页设计期末设计一个网页_Dreamweaver网页设计期末模拟试题(1)
  7. 锁表次数一般多大_「健身增肌」有些肌肉喜欢“大重量”,有些肌肉需要“高次数”...
  8. 独家总结| 一文读懂卡尔曼滤波
  9. python画散点图分布-python中画散点图
  10. ug中文字大小设置_UG编辑文字怎么放大或缩小?
  11. 腾讯云云服务器遭DDoS攻击被封堵的解决方法
  12. android的轮播图Banner之本地加载和网络加载图片
  13. 计算机电子预览室配置清单,完整的停车场管理系统设计方案-附停车场管理详细大样图及安装图!...
  14. python 跨知乎app发私信以及Python专栏30万用户信息爬取
  15. 5.物体的多边形表示
  16. Ubuntu 10.04风扇声音太大
  17. html里p标签里面如何让首行缩进两格?
  18. Lanenet 车道线检测网络模型学习(论文解读+官方模型)
  19. Chunk at 0000001313C1A500 of size 512
  20. ip地址转换数字函数 iton_IP 地址转换(在点分格式和数字之间相互转换)

热门文章

  1. gitolite 搭建Android仓库(三)
  2. IE11浏览器中的My97日历控件刷新后无法打开问题解决办法
  3. 魔兽怀旧服怎么看服务器信息,老玩家怎么看怀旧服?进服务器排队四小时,不排队不是魔兽...
  4. OSChina 周二乱弹 —— 感觉和十几万擦肩而过
  5. 为什么字节跳动全面使用 Go 语言?
  6. 全球围剿苹果税,iPhone14销量下滑,苹果的衰退真的开始了么?
  7. 元宇宙的几大核心问题
  8. 10张图片告诉你为什么说数学史也是一部艺术史
  9. 如何在 3Dmax 中启用 GPU 渲染?
  10. 递归打印1-n的两种方法