UEFI——PCD的简单使用

一、PCD的定义及概念

在UEFI固件接口中,PCD(Platform Configuration Database)是一个用于存储和访问平台特定配置信息的机制。PCD允许UEFI驱动程序和应用程序在运行时获取和设置平台相关的参数,而无需硬编码这些值。PCD变量可以被动态的读取和修改。(类似于C语言中的宏而区别于宏)

PCD的种类可以分为两大类:

(1)在编译过程中起作用,包含PcdsFeatureFlag , PcdsFixedAtBuild 以及 PatchableInModule;其中FeatureFlag 类型PCD只能定义为Bool值,FixedAtBuild可以支持多种数据类型UINIT32、UINT8、VOID* 等,PcdsPatchableInModule类型PCD在编译阶段可以被GenPatchPcdTable修改其值,并且在运行时也可以改变其值(PatchableInModule 本质上就讲PCD存放在EFI module的data 段 )。

(2)在运行过程中起作用,这类PCD包括PcdsDynamicDefault、PcdsDynamicExDefault、 PcdsDynamicHii、PcdsDynamicExHii、PcdsDynamicVpd、PcdsDynamicExVpd、PcdsDynamic 、PcdsDynamicEx;
其中, PcdsDynamicDefault与PcdsDynamicExDefault在Runtime阶段可以被改变, 但是当内存掉电后change值将会丢失,格式如下: 

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

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

【PCD与宏的区别】

 PCD用于存储和访问平台特定的配置信息。这些配置信息可以在固件映像构建时设置,也可以在固件运行时动态地读取和修改。PCD变量用于控制固件的行为,如硬件设置、性能选项、调试级别等。宏定义用于在编译时替换代码中的文本。宏定义通常用于代码重用、代码简化、避免重复代码编写等,一旦定义是不可变的。

二、PCD的简单使用

 1、编写MyHelloWorldPCD.c

FeaturePcdGet宏是一个获取FeaturePcd变量的值的宏定义,使用了预处理器宏_PCD_GET_MODE_BOOL_,它将TokenName替换为FeaturePcd变量的Token Space和名称,其代码原型为:

/**Retrieves a Boolean PCD feature flag based on a token name.根据token名称检索布尔PCD特征标识Returns the Boolean value for the PCD feature flag specified by TokenName.If TokenName is not a valid token in the token space, then the module will not build.If TokenName is not a feature flag PCD, then the module will not build.@param   TokenName  The name of the PCD token to retrieve a current value for.@return  Boolean value for the PCD feature flag.**/
#define FeaturePcdGet(TokenName)  _PCD_GET_MODE_BOOL_##TokenName

利用PcdGet32(TokenName)获取32位PCD值,代码原型为

/**Retrieves a 32-bit PCD token value based on a token name.根据Token名称检索一个32位的PCD token值Returns the 32-bit value for the token specified by TokenName.If TokenName is not a valid token in the token space, then the module will not build.@param   TokenName  The name of the PCD token to retrieve a current value for.@return  32-bit value for the token specified by TokenName.**/

PcdGetPtr(TokenName)检索指向PCD token缓冲区的指针,代码原型为:

/**Retrieves a pointer to a PCD token buffer based on a token name.根据token名称检索PCD token缓冲区的指针Returns a pointer to the buffer for the token specified by TokenName.If TokenName is not a valid token in the token space, then the module will not build.@param   TokenName  The name of the PCD token to retrieve a current value for.@return  A pointer to the buffer. //返回一个指向缓冲区的指针**/
#define PcdGetPtr(TokenName)  _PCD_GET_MODE_PTR_##TokenName

完整代码为:

#include <uefi.h> 
#include <Library/UefiLib.h> 
#include <Library/BaseLib.h>
#include <Library/DebugLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/PcdLib.h>EFI_STATUS
EFIAPI
MyHelloWorldPCDEntry(IN EFI_HANDLE        ImageHandle,IN EFI_SYSTEM_TABLE  *SystemTable
)
{ EFI_STATUS  Status = EFI_SUCCESS;UINT32  PrintTimes ;UINT32  i ;CONST CHAR16 *PrintStr; // DEBUG ((EFI_D_ERROR , "[MyHelloWorldPCD] MyHelloWorldPCDEntry Start..\n"));Print(L"[MyHelloWorldPCD] MyHelloWorldPCDEntry Start..\n");if (!FeaturePcdGet(PcdMyHelloWorldPrintEnable)){ //PcdMyHelloWorldPrintEnable是一个token 名称,返回一个Boolean值Print (L"[MyHelloWorldPCD] PcdHelloWorldPrintEnable ..\n");PrintTimes = PcdGet32(PcdMyHelloWorldPrintTimes);for (i = 0; i < PrintTimes; i++){PrintStr = PcdGetPtr(PcdHelloWorldPrintString);Print (L"[MyHelloWorldPCD]  Pcd  Str = %s\n",PrintStr);}}// DEBUG ((EFI_D_ERROR , "[MyHelloWorldPCD] MyHelloWorldPCDEntry End..\n"));Print(L"[MyHelloWorldPCD] MyHelloWorldPCDEntry End..\n");return Status;
}

 使用PCD要在INF文件中引用

#use to operate bool value
[FeaturePcd]gEfiMdeModulePkgTokenSpaceGuid.PcdMyHelloWorldPrintEnable  ## CONSUMES[Pcd]gEfiMdeModulePkgTokenSpaceGuid.PcdHelloWorldPrintString  ## CONSUMESgEfiMdeModulePkgTokenSpaceGuid.PcdHelloWorldPrintTimes    ## SOMETIMES_CONSUMES

使用PCD要在DEC文件中声明

...[PcdsFeatureFlag]gEfiMdeModulePkgTokenSpaceGuid.PcdMyHelloWorldPrintEnable|FALSE|BOOLEAN|0x0001200d//PcdMyHelloWorldPrintEnable是PCD变量的名称;FALSE是PCD变量的默认值;BOOLEAN是PCD变量的数据类型;0x0001200d是PCD token的值,用于在PCD数据库中表示和引用特定的PCD变量。[PcdsFixedAtBuild, PcdsPatchableInModule, PcdsDynamic, PcdsDynamicEx]# @Prompt HellowWorld print times.gEfiMdeModulePkgTokenSpaceGuid.PcdHelloWorldPrintTimes|3|UINT32|0x40000005# @Prompt HelloWorld print string.gEfiMdeModulePkgTokenSpaceGuid.PcdHelloWorldPrintString|L"UEFI Hello World!\n"|VOID*|0x40000004...

在DSC文件中修改(如果没有修改会使用DEC中默认的PCD值)

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

运行代码生成EFI文件,并将efi文件拷贝到虚拟盘HDD_BOOT.img中运行,运行结果如下:

参考文章

EFI 基础教程 (八)- PCD 简单使用

PCD配置和使用 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/53116.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

加速电商物流效率:推荐几款实用的快递批量查询工具

做电商必不可少的快递批量查询平台分享&#xff1a;固乔快递查询助手使用全攻略 在电商行业日益竞争的今天&#xff0c;高效管理物流信息成为了商家们不可或缺的一环。面对每天成百上千的订单和快递单号&#xff0c;如何快速、准确地查询并跟踪物流状态&#xff0c;成为了电商…

stun和trun

在 WebRTC 中&#xff0c;STUN&#xff08;Session Traversal Utilities for NAT&#xff09;和 TURN&#xff08;Traversal Using Relays around NAT&#xff09;是用于NAT穿透的两种不同的技术&#xff0c;它们解决的问题不同&#xff0c;因此在某些情况下需要同时使用。 ST…

产品需求过程管理重要性

产品需求过程管理重要性 背景 以下都是真实事项经历回顾&#xff0c;在产品开发过程中&#xff0c;产品经理与研发团队之间的沟通至关重要。然而&#xff0c;沟通不畅或信息缺失常常导致需求无法准确传达&#xff0c;最终影响产品的成功。以下是一些常见的问题&#xff1a; 1.需…

C++基础【字符串】(Ac-Wing)

字符串加空格 #include <iostream> #include <cstring> #include <algorithm>using namespace std;int main() {string s;getline (cin, s);for (int i 0; i < s.size(); i )cout << s[i] << " "; }字符串插入 #include<bits/…

使用HTTP代理注意的点

“在网络世界中&#xff0c;HTTP代理扮演着桥梁的角色&#xff0c;帮助用户匿名访问网站、加速网页加载、绕过地区限制等。然而&#xff0c;不当或不安全地使用HTTP代理也可能带来一系列问题。以下是在使用HTTP代理时需要注意的几个关键点。” 一、选择可靠的代理服务商 首先&…

鹰眼应急实时三维重建装备,高质量交付中!

在《2024年地方应急管理科技信息化任务书》的指导和应急管理万亿国债支撑下&#xff0c;全国各地正积极推进应急管理现代化建设&#xff0c;全力提升“数据汇聚服务能力、监测预警能力、指挥调度能力、支撑保障能力”四项应急管理能力。 制定标准化流程规范&#xff0c;保障交…

[Leetcode 47][Medium]-全排列 II-回溯(全排列问题)

目录 一、题目描述 二、整体思路 三、代码 一、题目描述 原题地址 二、整体思路 和上一道Leetcode46相比&#xff0c;有变化的地方是要排除重复组合的情况。那么在组合问题中去除重复组合的方法是先对数组进行排序,然后在回溯函数中判断当前元素与上一个元素是否相同,若相同…

系统架构师考试学习笔记第三篇——架构设计高级知识(11)软件可靠性基础知识

本章知识点&#xff1a; 第11课时主要学习软件可靠性基本概念、建模、管理、设计、测试和评价等内容。本课时内容侧重于概念知识,根据以往全国计算机技术与软件专业技术资格(水平)考试的出题规律,考查的知识点多来源于教材,扩展内容较少。根据考试大纲,本课时知识点会涉及单项选…

赞奇科技与华为云共襄828 B2B企业节,激活数字内容“云”创作

8月28日&#xff0c;在2024中国国际大数据产业博览会上&#xff0c;第三届828 B2B企业节正式开幕&#xff0c;旨在融通数智供需&#xff0c;加速企业智改数转&#xff0c;助推中国数智产业实力再升级。 828 B2B企业节是全国首个基于数字化赋能的企业节&#xff0c;由华为联合上…

SprinBoot+Vue学生选课微信小程序的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue3.6 uniapp代码 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平…

C++使用日志库经验总结

1、log4cpp日志源文件路径设置 在 Visual Studio 中&#xff0c;C 项目的日志格式可以通过设置项目的属性来调整。如果你想要使用完整路径来显示诊断消息&#xff0c;可以在项目属性中的“C/C”选项卡下的“高级”属性页中找到“使用完整路径”&#xff08;/FC&#xff09;选项…

探索数字化生态平台的特色功能,开启未来新征程

在数字化浪潮席卷全球的今天&#xff0c;数字化生态平台正以惊人的速度崛起&#xff0c;成为推动经济发展与社会进步的强大引擎。那么&#xff0c;这些平台究竟有哪些独特的特色功能呢&#xff1f;让我们一同深入探索。 首先&#xff0c;我们要明确数字化生态平台的定义。它是利…

ParallelsDesktop19可在任何Mac上运行Windows软件

ParallelsDesktop19是一款Mac虚拟机软件&#xff0c;可在任何Mac上运行Windows&#xff0c;体验不同操作系统之间的无缝集成&#xff0c;并具有创新设计和增强功能&#xff0c;如无密码登录与TouchID、支持macOSSonoma14和增强打印选项。此外&#xff0c;它还支持运行更多Windo…

第二证券:大洗牌!头部券商营收、净利集体下滑

前十券商营收团体下滑&#xff0c;银河证券跌幅最小 新股IPO数量锐减129家至44家&#xff0c;国内证券市场股票基金交易量日均规划 同比下降 6.83%……关于证券公司而言&#xff0c;本年上半年可谓多重要素叠加冲击&#xff0c;成果下滑难以避免。于大多数证券公司而言&#x…

01、echart的基本使用

一 为什么使用echarts 丰富的可视化类型&#xff08;柱状图、散点图、雷达图…&#xff09; 多种数据格式无需转换直接使用 千万数据的前端展现移动端优化 多渲染方案&#xff0c;跨平台 动态数据 绚丽的特效 二echarts快速上手 方式一&#xff1a; 从gi thup中下载ech…

redroid搭建云手机学习笔记(一)

参考链接 通过Redroid搭建自己的云手机 docker安装 docker官网目前打不开了&#xff0c;通过官网安装的方式无法实现&#xff0c;这里需要借助镜像网站来实现docker的安装 参考链接&#xff1a;https://developer.aliyun.com/mirror/docker-ce # step 1: 安装必要的一些系统…

强化学习实操入门随笔

碎碎念&#xff1a;经过思考&#xff0c;打通底层逻辑&#xff0c;我认为未来ai的功能是在沟通领域代替人&#xff0c;未来人-人模式&#xff08;媒介是死的语言&#xff0c;比如看古人留下的文字、聊天的暂时不在&#xff09;会变成人-ai替身-人模式&#xff08;符合本人想法的…

selenium(一)基于java、元素定位

Selenium自动化 Selenium是一个用于Web应用程序的自动化测试工具。它直接运行在浏览器中&#xff0c;可以模拟用户在浏览器上面的行为操作。 chrome下载 https://www.google.com/chrome/ 下载的结果是 “ChromeSetup.exe”&#xff0c;双击该文件&#xff0c;安装程序会自…

1、Java简介+DOS命令+java的编译运行(字节码/机器码、JRE/JVM/JDK/JIT的区别)+一个简单的Java程序

前言&#xff1a;本文属于黑马程序员和javaguide的混合笔记&#xff0c;仅作学习分享使用&#xff0c;建议感兴趣的小伙伴去看黑马原视频或javaguide原文。如有侵权&#xff0c;请联系删除。 Java类型&#xff1a; JavaSE 标准版&#xff1a;以前称为J2SE&#xff0c;主要用来…

网站开发:HTML+CSS - 表格与表单

1. 前言​​​​​​​​​​​​​​ 表格与表单在网页开发中非常重要。表格使得用户可以更简洁清晰的去浏览信息。 表单提供了一种在客户端&#xff08;浏览器&#xff09;和服务器之间进行数据交互的方式。 以下为其主要作用&#xff1a; 用户交互和数据输入&#xff1a;表…