• UEFI PCD分析


    背景

    在实际开发中我们通常对于代码是否优秀有一个代码可配置性有要求,在kernel中我们使用 dts 来配置,在android中有property,那么对于 UEFI ,它的可配置性体现在PCD上面,加入我们同一套UEFI代码应用于PC和Mobile,他们的memory layout是不同的,那么我们通过在不同项目的 dsc 中对memory base, memorysize, Peripheral address base, peripheral address size 作动态配置,这样同一套代码也是可以应用不同平台的。

    PCD 变量定义

    PCD 的全称是 Platform Configuration Database, 也就是全局可配置数据库。

    通常一个 PCD 的定义如下:

    TokenSpaceGuidCName.PcdCName

    其中:

    TokenSpaceGuidCName: 是GUID,通常定义在 dec 文件中

    PcdCName: 是 PcdName, 通常定义在 dsc/dsc.inc 中

    NOTE:PCD 变量在 Sec, Dxe 的早期因为环境没有准备好,可能是无法使用的,需要注意使用周期问题。

    PCD 变量类型

    PCD 变量有几种类型:

    类型

    描述

    PcdsFeatureFlag

    条件判断的Pcd,通常用于宏控或者状态判断

    PcdsPatchableInModule

    在编译阶段赋值,但是可以在编译生成的二进制文件中更改对应变量

    PcdsFixedAtBuild

    在编译过程中赋值,在整个UEFI运行周期内不可改变

    PcdsDynamicDefault

    动态的 Pcd 信息,可以在运行过程中通过 PcdGetXXX, PcdSetXXX 来更改

    PcdsDynamicExDefault

    跟Dynamic PCD类似,算是加强版,使用宏PcdGetExXXX/PcdSetExXXX来访问变量;

    PCD变量使用

    典型定义

    Pcds 的赋值方式

    1. # 将 DefaultValue 赋值给 PcdCName
    2. TokenSpaceGuidCName.PcdCName | DefaultValue
    3. #各个段意义: PcdName, 默认值, 数据类型,pcd 全局唯一的 token
    4. TokenSpaceGuidCname.PcdCname|DefaultValue|DatumType|Token
    5. 对于PCD 的定义,一定需要先在 dec 文件中定义,之后使用
    1. PcdsFeatureFlag
    1. #
    2. # edk2/MdeModulePkg/MdeModulePkg.dsc
    3. #
    4. [PcdsFeatureFlag]
    5. gEfiMdePkgTokenSpaceGuid.PcdDriverDiagnostics2Disable|TRUE
    6. gEfiMdePkgTokenSpaceGuid.PcdComponentName2Disable|TRUE
    1. PcdsFixedAtBuild
    1. [PcdsFixedAtBuild]
    2. gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x0f
    3. gEfiMdePkgTokenSpaceGuid.PcdReportStatusCodePropertyMask|0x06
    4. gEfiMdeModulePkgTokenSpaceGuid.PcdMaxSizeNonPopulateCapsule|0x0
    1. PcdsPatchableInModule
    1. #
    2. # Core.dsc.inc
    3. #
    4. [PcdsPatchableInModule]
    5. # This PCD should be set to 0 then video resolution could be at highest resolution.
    6. gEfiMdeModulePkgTokenSpaceGuid.PcdVideoHorizontalResolution|0 gEfiMdeModulePkgTokenSpaceGuid.PcdVideoVerticalResolution|0
    1. PcdsDynamic/PcdsDynamicExt
    1. #
    2. # MdeModulePkg.dec
    3. #
    4. [PcdsDynamic, PcdsDynamicEx]
    5. gEfiMdeModulePkgTokenSpaceGuid.PcdS3BootScriptTablePrivateDataPtr|0x0|UINT64|0x00030000

  • 相关阅读:
    第2-4-5章 规则引擎Drools高级语法-业务规则管理系统-组件化-中台
    学习MySQL-第五章
    echarts优秀使用案例
    理德外汇:中东局势很少导致全球投资者重新考虑其策略,避险交易不会持续太久
    wireguard windows版本的配置
    一款超好用的开源密码管理器?
    aliexpress API 接入说明
    Redis学习笔记——缓存更新策略
    Linux 连接工具
    Aspose.PDF企业案例:BoardPro 使用 Aspose.PDF for .NET 为 PDF 连接、页眉和页脚标记、注释和书签创建了一个解决方案
  • 原文地址:https://blog.csdn.net/kakaBack/article/details/127854504