当前位置:首页 > 物联网 > 《物联网技术》杂志
[导读]摘 要:EDKII是目前最流行的一个高度分层和抽象化UEFI BIOS的开发架构,它针对不同平台硬件参数设置引入了新的设计概念PCD。PCD就是在计算机系统初始化过程中建立起来的一个全局平台配置数据库,它为整个平台的驱动,函数库和模块组提供了有效的信息共享和设置机制。研究了数据库建立和使用的流程和方法,同时指出该数据库平台在非源代码发布中的一些设计弊端。

引言

BIOS是一组固化到计算机主板上一个ROM芯片中的程 序,它保存着计算机最重要的基本输入输出的程序、系统设 计信息、开机后自检程序和系统自启动程序。人们经常需要重 新对FLASH芯片进行编程以便升级BIOS,以便获得新的功能。

UEFI BIOS是目前最主流的一个BIOS架构,约占超过 70%的计算机,服务器和嵌入式市场。它是对老的BIOS开 发模式的一种彻底的革新,打破了 BIOS只能用汇编语言开发 和只能应用在计算机和服务器市场的局限性,当前越来越多的 嵌入式设备、平板、手持设备、工控设备、通信设备等都在 它的应用行列。

采用UEFI BIOS开发架构EDKII的架构,可保证同一份 核心代码运行在不同的硬件平台之上,仅仅需要针对平台的特 定性来设置一些特定的参数,这是EDKII架构中最难也是最 核心的一个设计部分,也就是要研究全局配置数据库PCD。

1 UEFI 和 EDKII 简介

2000 年,Intel 向 业界展 示了 BIOS 的 新 一 代 接口程序 EFI(Extensible FirmwareInterface),并将此技术应用于其安腾服务器平台上。EFI 是由Intel 推出的一种在未来的电脑系统中用来替代 BIOS 的升级方案。2005 年,在工业界达成共识的基础上,Intel 将 EFI 规范交给了一个由微软、AMD、惠普等公司共同参与的工业联盟进行管理,并将实现该规范的核心代码开源于网站上。与此同时,EFI 也正式更名为 UEFI(Unified Extensible FirmwareInterface)。UEFI 联盟将负责开发、管理和推广 UEFI 规范。

UEFI 定义了操作系统与系统硬件平台固件之间的开放接口。该规范定义的接口包括平台相关信息、启动服务例程以及操作系统运行时服务例程。操作系统装载器与操作系统可通过接口调用这些服务例程。UEFI 规范是一个公开的纯接口定义,它不依赖于某个特定的 BIOS 制造商或某个特定的 BIOS的实现,它仅仅定义了平台固件必须实现的接口,以及操作系统可能使用的一系列接口与数据结构,其实现的方式与细节均取决于该规范的实现者。UEFI 规范还定义了固件驱动程序模型,使得所有遵循此模型开发的固件驱动程序能够互相协作。

不同于传统的 BIOS 实现,EDKII 基于现代软件体系设计的思想,对 UEFI Framework 采用模块化设计,并根据其执行流程主要划分为 :SEC、PEI、DXE、BDS、TSL、RT 和AL 等 7 个阶段,其运行机理如图 1 所示。

UEFI+BIOS全局配置数据库的设计与实现

SEC(Security)是平台上电后最先执行的步骤。这个阶段的主要目的是对平台固件进行验证,确保选择的平台固件映 像没有被破坏。主要工作是初始化临时内存区并对平台早期初 始化代码进行验证。

PEI (Pre-EFI Initialization)阶段有两个主要任务:确定 重新启动的来源和做尽可能少的工作以便寻找和初始化内存, 为DXE阶段提供少量的固定内存。

DXE (Driver Execution Environment)被设计来处理与外 围设备的通信,它通过加载驱动的方式(轮询检测)来为操作 系统的启动管理构建环境。

BDS (Boot Device Selection)是 UEFI 拥有平台控制权 的最后一个阶段。BDS与DXE阶段一起工作,为启动操作系 统建立控制台。

TSL (Transient System Load)即操作系统启动管理器尝 试引导操作系统的阶段。

RT (Run Time)是操作系统启动运行后,UEFI提供的 一组运行时服务。

AL (After Life)阶段,即最后一个阶段,其提供一种机 制来保证用户在有意或者无意的情况下终止操作系统后,让 UEFI重新获得系统控制权。

2全局配置数据库PCD的设计实现

EDKII中PCD根据其作用的时间,分两大类,一类 是在编译过程中起作用,这类PCD等同于C语言中的全局 静态变量,包含 FeatureFlag PCD,FixedAtBuild PCD 以及 PatchableInModule PCD三种。这类PCD跟全局配置数据库 没有关系,所以本文不做过多介绍。另一类是平台初始化过 程中起作用,包括 DynamicDefault PCD,DynamicHII PCD, 和DynamicVpd PC三种应用在源代码组件发布的PCD,以及 与之对应的 DynamicExDefault PCD,DynamicExHII PCD 和 DynamicExVpd PCD――专门应用在编译好的二进制组件发布 中的三种PCD。

2.1 PCD的分类和区别

从大面上,全局配置数据库中存放的PCD被分为两个大 类Dynamic和DynamicEx,每个大类又各分三个小类Default PCD,HII PCD 和 VPD PCD。

Dynamic和DynamicEx的作用局域完全一样,唯一的区 别就是源代码级别的发布还是编译好的代码发布。如果上层开 发者给二级开发者提供的是所有驱动的源代码,那么二级开 发者可以直接修改源代码来改变某个参数的值,此时只要把 该配置参数设置为Dynamic形式的即可满足要求。否则,必 须用DynamicEx的。DynamicEx的PCD在保护上层开发者 的版权和代码发布权限提供了更多层次的选择空间。

Default PCD :在初始化过程中,可以被PEI,DXE和 RT阶段的几乎所有驱动所使用,一般是前面的驱动修改,后 面的驱动读取。这是不同的驱动,不同的阶段之间有效信息交 互和传递的一种方法。该PCD的作用空间是一次加电过程, 所修改的数值在系统断电后会自动回复到默认初始状态。

HII PCD :作用空间和Default PCD 一样,主要的区别是 HII的PCD可以把修改的数值直接保存到BIOS NOR Flash芯 片的NVRAM区域。这样一旦修改,再计算机下次启动的时候, 访问的就是上次修改的新数值。

VPD PCD :作用空间和上面两种相同,主要区别是VPD PCD是只读的不能修改,但是它也有自己的优势。因为VPD PCD是的初始值是保存在BIOS固件的一段二进制数据空间 上的所以在固件编译完成后,可以在不依赖编译器重新编译 情况下,对该PCD的数值进行直接的重复设置。

2.2设计原理分析

在EDKII源代码编译中,编译工具集的AutoGen会 遍历整个平台所有驱动和顶层结构文件生成AutoGen.h和 AutoGen.c两个关键文件。这两个文件将作为后面C编译器的 自动包换的头文件输入,参与C语言的系统级编译过程,最 终生成这个平台的全局配置数据库。

下面通过一个NT32模拟平台中的例子来进行过程说明。

首先在NT32的顶层平台文件DEC, DSC和INF文件中 依次做如下声明。

MdeModulePkg.dec

[PcdsFixedAtBuild, PcdsDynamic, PcdsDynamicEx]

gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariabl eBase|0x0|UINT32|0x30000001

Nt32Pkg.dsc

[PcdsDynamicExDefault.common.DEFAULT]

gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariabl eBase|0xf000

WinNtFlashMapPei.inf

[Pcd]

gEfiNt32PkgTokenSpaceGuid.PcdWinNtFlashNvStorageVariable

Base

通过该声明,定义了一个DynamicExDefault类型的 PCD,其类型为UINT32,初始默认数值为0xf000,并且驱 动模块WinNtFlashMapPei要使用该配置数据。

接着用EDKII的BaseTools对该源代码架构进行编译, AutoGen工具会在遍历完整个代码之后,在相应的PCD驱动 编译目录下面自动生成AutoGen.h和AutoGen.c两个文件,如下所示:

Aut oGe n.h (Bu ild \ NT32\ DEBUG_MYTOOLS\I A32\

MdeModulePkg\Universal\PCD\Pei\Pcd\DEBUG)

#define PEI_LOCAL_TOKEN_NUMBER_TABLE_SIZE 3

TOC \o "1-5" \h \z

typedef struct {

UINT32PcdFlashNvStorageVariableBase_a1aff049_

fdeb_442a_b320_13ab4cb72bbc[1];

DYNAMICEX_MAPPING ExMapTable[PEI_EXMAPPING_ TABLE_SIZE];

UINT32LocalTokenNumberTable[PEI_LOCAL_

TOKEN_NUMBER_TABLE_SIZE];

GUIDGuidTable[PEI_GUID_TABLE_SIZE];

UINT8StringTable[1] ; /* _ */

SIZE_INFO SizeTable[PEI_SIZE_TABLE_SIZE];

UINT8SkuIdTable[PEI_SKUID_TABLE_SIZE];

SKU_ID SystemSkuId ;

} PEI_PCD_DATABASE_INIT ;

AutoGen.c (Build\NT32\DEBUG_MYTOOLS\IA32\

MdeModulePkg\Universal\PCD\Pei\Pcd\DEBUG)

PEI_PCD_DATABASE_INIT gPEIPcdDbInit = {

{ OxfOOOU ), /* PcdFlashNvStorageVariableBase_a1aff049_ fdeb_442a_b320_13ab4cb72bbc[1] */

/* ExMapTable */ {{ 0x30000001U, 2U, 0U }, },

/* LocalTokenNumberTable */

{

offsetof( PEI_PCD_DATABASE , Uninit. PcdFlashNvStorageFtwSpareBase_a1aff049_fdeb_442a_ b320_13ab4cb72bbc) | PCD_TYPE_DATA | PCD_DATUM_ TYPE_UINT32,

offsetof ( PEI_PCD_DATABASE , Init. PcdFlashNvStorageVariableBase_a1aff049_fdeb_442a_ b320_13ab4cb72bbc) | PCD_TYPE_DATA | PCD_DATUM_ TYPE_UINT32,

},

/* GuidTable */

{{ 0xA1AFF049, OxFDEB, 0x442a, { 0xB3, 0x20, 0x13, 0xAB, 0x4C, 0xB7, 0x2B, 0xBC }}, },

//gEfiMdeModulePkgTokenSpaceGuid

/* StringTable */ /* SizeTable *//* SkuIdTable */

};

AutoGen.h自动生成的是该数据库的结构定义文件,它 定义了各个PCD在该数据库中存放的数据位置、类型、偏移 量等信息。AutoGen.c则配合AutoGen.h详细列出了各个比特 位置存放的具体数值。

当WinNtFlashMapPei驱动模块中想要访问该PCD数值

的时候,只需要在C语言中引用PcdGet32Ex (gEfiMdeModul ePkgTokenSpaceGuid, 0x30000001)。这时就会自动扫描 Init. ExMapTable和Init.GuidTable两张数据库表取得该PCD对应 的 LocalTokenNumber 数值"2U"。

而后根据映射LocalTokenNumber的数值 找 到“ offsetof ( PEI_PCD_DATABASE , Init. PcdFlashNvStorageVariableBase_a1aff049_fdeb_442a_ b320_13ab4cb72bbc) | PCD_TYPE_DATA | PCD_DATUM_ TYPE_UINT32"。

通过在 C 语言中解析 “offsetof (PEI_PCD_DATABASE, Init.PcdFlashNvStorageVariableBase_a1aff049_fdeb_442a_ b320_13ab4cb72bbc) | PCD_TYPE_DATA | PCD_DATUM_ TYPE_UINT32"的定义,就可以得到该PCD在数据库中的 偏移量、PCD类型和数据类型信息。

其过程如图 2 所示 :

3设计局限性和改进方法

在该数据库生成过程中,离不开对MS, ICC或者GCC 编译器的支持,这样DynamicEx所宣称的二进制固件发布模 式受到约束。换言之,想要完全的二进制驱动组件的发布,必 须让EDKII整个平台PCD的生成过程脱离对任何编译器的 依赖性。

针对这个设计要求,提出了新的设计架构,其流程图如图3 所示 :

在新的架构中,主要改变的是AutoGen的组件,EDKII 的编译工具集依然会遍历整个架构的所有驱动和上层配置 文件,但它会直接生成PCD数据库,同时生成一份包含改 数据库结构的AutoGen.h文件和一份空的只包含注释信息AutoGen.c 文件。AutoGen.h 和 AutoGen.c 依然采用 PEI/DXE驱动的源代码编译,只不过 PCD 数据库不在依赖该过程产生,因此稍加改动,就可使 DynamicEx 真正发挥其所宣称的作用。

4 结 语

EDKII 的 PCB 数据库目前在国内没有任何论文研究发表过,本文主要针对这个空白领域,分析和研究了 EDKII 最核心、最关键的全局数据设置数据库 PCD 的设计和实现,并指出了其设计的不足。随着 UEFI BIOS 的广泛应用,越来越多的军用板卡、通信主板、嵌入式设备和服务器也会转移到这个架构上。如果用一个稳定不变的核心代码来支持不同的设备,必然会减少维护成本,提高开发效率,以及提高设备的质量,这就是本文所研究的 PCD 技术的意义所在。

20211223_61c35c0e24e78__UEFI

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭