当前位置: 首页 > news >正文

UEFI学习笔记(五):EDK II PCD的概念、类型、使用

UEFI学习笔记(五):EDK II PCD

  • 一、基本概念
    • 目的
  • 二、PCD类型
    • 1、FixedAtBuild
    • 2、FeatureFlag
    • 3、PatchableInModule
    • 4、Dynamic
    • 5、DynamicEx
    • 6、DynamicHii
    • 7、DynamicVpd
  • 三、PCD的使用
    • 1、在.DEC中声明
    • 2、在.INF中引用
    • 3、在.DSC中配置
    • 4、在.c中使用
  • 四、特殊的PCD
  • 参考文章

一、基本概念

在 UEFI中,PCD(Platform Configuration Database)是一种用于管理平台配置数据的机制。PCD 允许固件和操作系统在运行时读取和修改配置数据,以支持系统的定制和优化。

目的

为了把代码中可配置的信息抽象出来成PCD,使得Module和Platform容易做定制化,不用修改源码,容易维护,便于改动。三个方面:
1)不仅可以在Build-time中可以通过编译选项配置,
2)在Run-time(boot过程)中也可以配置,
3)在Binary中也可以进行配置

二、PCD类型

(对应的数据类型都是基本数据类型)

1、FixedAtBuild

作用域在一个模块中(模块级的)。用于控制Feature,在build之后不能修改(相当于一个宏)。不同模块可以配置不同的值。只支持静态设置。

2、FeatureFlag

和FixedAtBuild是一样的作用,但是是Boolean类型。(同1的作用)

3、PatchableInModule

作用域在一个模块中(模块级的),可以在Binary Level进行修改。

4、Dynamic

作用域在整个系统中(系统级的)。动态的(在整个启动过程中可以set、get)。PCD的值存在memory里面,下次启动时,上次更改的值丢失了,每次启动都是从default值开始。

5、DynamicEx

与DynamicEx类似。区别是:
如果platform是从源码build出来的,没有binary在里面的时候,PCD用的都是Dynamic这种类型;
如果在BIOS里面有一些模块是binary方式集成进来的而这些binary又需要用到PCD(用于Binary Release),那么这些Binary集成的要用到的PCD就必须要设置为DynamicEx类型。

6、DynamicHii

作用域在整个系统中(系统级的)。动态的(在整个启动过程中可以set、get)。PCD的值和EFI Variable关联在一起(可能是non-volatile的,下次作启动还起效)

7、DynamicVpd

作用域在整个系统中(系统级的)。动态的(在整个启动过程中可以set、get)。是存在VPD空间的(在FLASH上,只读),一般是出厂配置。

三、PCD的使用

1、在.DEC中声明

[PcdsFixedAtBuild]gEmulatorPkgTokenSpaceGuid.PcdEmuFlashNvStorageVariableBase|0x0|UINT64|0x00001014

PCD的唯一性是通过GuidName和TokenNum(0x00001014)决定。GuidName、TokenNum不能修改了,Value可以修改。

2、在.INF中引用

在Pcd section中列出来,示例如下:

[Pcd]gEfiMdeModulePkgTokenSpaceGuid.PcdConOutRow                          ## PRODUCESgEfiMdeModulePkgTokenSpaceGuid.PcdConOutColumn                       ## PRODUCESgEfiMdeModulePkgTokenSpaceGuid.PcdVideoHorizontalResolution          ## PRODUCES

3、在.DSC中配置

设置PCD的值,示例如下:

[PcdsFixedAtBuild]gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x0fgEfiMdePkgTokenSpaceGuid.PcdReportStatusCodePropertyMask|0x06gEfiMdeModulePkgTokenSpaceGuid.PcdMaxSizeNonPopulateCapsule|0x0

4、在.c中使用

通过PCB Library进行操作,最常用的是:PCDGetXX()PCDSetXX()
(其中:XX = 8/16/32/Size/Ptr/Boolean),示例如下:

PcdStatus = PcdSet16S(PcdPlatformBootTimeOut, GetFrontPageTimeoutFromQemu);
Timeout = PcdGet16(PcdPlatformBootTimeOut);

四、特殊的PCD

参考文章

UEFI——PCD介绍


http://www.mrgr.cn/news/24455.html

相关文章:

  • JAVA实现压缩包解压兼容Windows系统和MacOs
  • 年薪30W的项目经理,都在用这个方法做项目!
  • 声音之旅:2024四大必备音乐剪辑软件盘点!
  • 怎么调整图片亮度?关于调整图片亮度的几种方法推荐
  • 机器学习 第12章 计算学习理论
  • ‌移动管家手机智能控制汽车系统
  • 说说精益生产管理咨询公司排名的那些事
  • 【C++】——string
  • 实验十一 Java的网络应用
  • 【HarmonyOS】多媒体技术
  • 【Go】Go语言中的基本数据类型与类型转换
  • ES6标准---【四】【学习ES6标准看这一篇就够了!!!】
  • 线性规划优化:单纯形法
  • 四款音频剪辑软件免费使用,你更pick哪一个?
  • 会话好友区设计与开发(一)
  • docker镜像下载代理
  • linux ubuntu编译 openjdk11
  • 揭秘谷歌七年AI机器人研发之路
  • 小程序——生命周期
  • 哪些旋转机械会用到本特利振动传感器