【BIOS/UEFI】PCD配置和使用

news/2024/11/7 20:52:29/

概念

        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文件中块名称:
PcdsFeatureFlagFeaturePcd
PcdsFixedAtBuildFixedPcd
PcdsPatchableInModulePatchPcd
PcdsDynamicPcd
PcdsDynamicExPcdEx

     如果一个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


http://www.ppmy.cn/news/921530.html

相关文章

BIOS的BDS阶段解析

1、概述 BDS全称:Boot Dev Select(启动设备选择) 主要功能是加载并连接驱动程序,管理并启动引导项。在引导操作系统之前会初始化设备(USB键盘鼠标,VGA设备等),然后通过Variable功能来控制启动顺…

BIOS知识点--修改SMBIOS

以下函数实现的是修改SMBIOS中TYPE1的Product Name值 为LLLLL 主要是使用到了EFI_SMBIOS_PROTOCOL中的一些函数

第五章BIOS设置与硬盘分区

第五章 BIOS 设置与硬盘分区 1、主板BIOS的设置 BIOS负责开机时对系统中各个硬件进行初始化设置和测试,以确保系统能正常工作,是电脑硬件与软件程序之间的一座桥梁。 电脑在开机启动之前,首先要检查BIOS,它是计算机最底层的模板…

忘了BIOS密码不用慌 多种方法可解决

天无绝人之路,既然设置有密码,那我们想办法把它解开或恢复成默认值……  如果你设置了CMOS密码而又忘记,或者单位里的其他同事设置了CMOS密码又没告诉你,但你却很想进BIOS程序进行设置和修改,这时没有密码是很难的。但是,天无绝人之路,既然设置有密码,那我们想办法把…

常用电脑密码破解技巧

常用电脑密码破解技巧 CMOS密码破解 网管员在维护和使用电脑时,经常会遇到各种密码丢失的问题,这里,我们就为广大网管员准备了一些破解密码的方法,但是希望大家不要干坏事哦。开机密码是我们最先要遇到的因此我们就先从CMOS密码破解讲起。虽然CMOS种类各异,但它们的加密方…

MySQL八股学习记录4事务的实现from小林coding

MySQL八股学习记录4事务的实现from小林coding 事务的概念与特性并行事务引发的问题脏读不可重复读幻读 MySQL的应对策略InnoDB引擎可重复读详解ReadView在MVCC中的工作方式两种隔离级别通过MVCC实现幻读被完全解决了吗 事务的概念与特性 概念:一个操作要么执行成功,要么回滚到…

数据结构day3(2023.7.17)

一、Xmind整理: 二、课上练习: 练习1:时间复杂度 时间复杂度:只保留最高阶f(n)3*n^2n^2100nT(n)O(3*n^3n^2100n)O(3*n^3)O(n^3)1>O(1):常数阶int ta; 1ab; 1at; 1f(n)3T(n)O(3)O(3*n^0)O(n^0)O(1)2>O(n): 线性阶for…

IPAD USB 充电程序

Ai Charger 华硕的Ai Charger软件可以用在任意Windows系统的台式电脑、笔记本、上网本… 软件的原理官方没有解释过,我猜测应该是通过修改windows系统注册表,提高USB口的供电电流。除了通用性好(可用于任何windows系统电脑)之外&a…