【BIOS/UEFI】PCD配置和使用
概念
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分为三类:
- DynamicDefault:存在于Mem/Hob中,下次启动时,更改的值就丢失了,从默认值开始启动;
- DynamicHii:存在于EFI Variable中,下次Boot还是起效的;
- 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配置和使用相关推荐
- 绕过BIOS/UEFI固件写保护写入SPI闪存
针对Bootkit:LoJax或MosaicRegressor和TrickBot等开始进行固件感染方式的病毒逐渐增多而作笔记整理. 对主板上的SPI闪存芯片中存储的UEFI固件的所有请求都将通过SPI ...
- Grub2 引导 WIM / Slax Linux (BIOS UEFI)
文章目录 Grub2 引导 WIM / Slax Linux (BIOS & UEFI) 安装Grub2到U盘 / 硬盘 1. 准备分区格式 2.安装Grub2 3.复制Grub2 配置文件和 ...
- uefi多linux系统启动盘,DIY制作无需格BIOS+UEFI双启动U盘工具|支持syslinux+grub+boomgr+grub2多启动...
如果你想让你的U盘可启动的话,要怎么做呢,可能很多人都知道借助软件能自动实现,但那些方式都需要把U盘格式化一遍,而这个工具完全不需要,只需要把下载的文件解压到U盘根目录就能实现多启动了,支持bios和 ...
- 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 ...
- 天意u盘启动盘安装linux,(BIOS+UEFI双启WINPE)天意u盘维护系统技术员版V2.1
大家应该注意到了,最新的笔记本电脑都改成了UEFI而不是我们以前的bios启动了. 所以天意老师出了这个UEFI+bios双启版,修改于ISO全能版. 去掉了linux.dos菜鸟工具箱:去掉了软件工 ...
- (BIOS+UEFI双启)天意u盘维护系统技术员版V1.0
大家应该注意到了,最新的笔记本电脑都改成了UEFI而不是我们以前的bios启动了. 所以天意老师出了这个UEFI+bios双启版,修改于ISO全能版. 去掉了linux.dos菜鸟工具箱:去掉了软件工 ...
- 磁盘分区 (MBR, GPT)、启动流程 (BIOS, UEFI)
本文为<鸟哥的 Linux 私房菜>读书笔记 目录 磁盘分区 MBR (MS-DOS) 分区表 GPT (GUID partition table) 磁盘分区表 BIOS 与 UEFI 启 ...
- 中柏 EZpad 8 Windows 平板电脑 |驱动备份|系统优化|不能调节显示器亮度|进入Bios/uefi 快捷键 |蓝牙扫描不到设备|CPU占用过高解决方案
前言 之前一直使用的这个平板,但是有个很严重的问题就是性能实在太差了,每次都是CPU百分百,Mem 百分之50% 这个结果真的很意外, 但是又无可奈何,后面花时间做了一些优化包括 进程限制 启动优化 ...
- linux创建虚拟声卡,Pear BIOS 安装和配置指引
Pear BIOS 安装指引 Pear BIOS是一套硬件模拟系统,操作系统可以在这套模拟硬件上运行. Pear BIOS可以让用户同时安装多套操作系统,使用时可以选择任何一套操作系统启动. 在传统电 ...
最新文章
- 更换VC后DDC提示证书不可用
- PHP的优点和缺点分别是什么,CSS的优点和缺点分别是什么
- @请注意查收:《史上最全的AI论文资料》.pdf
- 发现一个很不错的正则表达式生成器
- spring cloud 入门系列七:基于Git存储的分布式配置中心--Spring Cloud Config
- dw网页设计期末设计一个网页_Dreamweaver网页设计期末模拟试题(1)
- 锁表次数一般多大_「健身增肌」有些肌肉喜欢“大重量”,有些肌肉需要“高次数”...
- 独家总结| 一文读懂卡尔曼滤波
- python画散点图分布-python中画散点图
- ug中文字大小设置_UG编辑文字怎么放大或缩小?
- 腾讯云云服务器遭DDoS攻击被封堵的解决方法
- android的轮播图Banner之本地加载和网络加载图片
- 计算机电子预览室配置清单,完整的停车场管理系统设计方案-附停车场管理详细大样图及安装图!...
- python 跨知乎app发私信以及Python专栏30万用户信息爬取
- 5.物体的多边形表示
- Ubuntu 10.04风扇声音太大
- html里p标签里面如何让首行缩进两格?
- Lanenet 车道线检测网络模型学习(论文解读+官方模型)
- Chunk at 0000001313C1A500 of size 512
- ip地址转换数字函数 iton_IP 地址转换(在点分格式和数字之间相互转换)