BIOS的几个阶段需要不同阶段的数据传递,下面介绍4个全局变量。
1 固件存储介绍
本规范描述了应该如何在非易失性存储器中存储和访问文件。固件实现必须支持标准的PI固件卷和固件文件系统格式(下文所述),但可能支持其他存储格式。
1.2 固件设备
固件设备是一个包含固件代码和/或数据的持久性物理存储库。它通常是一个闪存组件,但也可能是一些其他类型的持久性存储。单个物理固件设备可以被划分为较小的部分,以形成多个逻辑固件设备。类似地,多个物理固件设备可以聚合成一个更大的逻辑固件设备。
本节将介绍一些典型的物理固件设备的特性。
1.2.1 Flash (闪存)
Flash设备是固件卷中最常见的非易失性存储库。闪存设备通常被划分为可能具有不同大小的扇区(或块),每个扇区都具有不同的运行时特性。Flash设备有几个独特的品质,这反映在固件文件系统的设计中:
- 闪存设备可以按部门进行删除。擦除后,扇区内的所有位都返回到其擦除值,全部0或全部1。
- 如果从擦除值更改为非擦除值,则可以逐位写入闪存设备。例如,如果擦除值为1,则可以将值为1的位更改为0。
- 闪存设备只能通过对整个闪存扇区执行擦除操作,从非擦除值更为擦除值。
- 一些闪存设备可以启用或禁用对整个闪存设备或单个闪存扇区的读取和写入。
- 一些闪存设备可以锁定当前的启用或禁用读写状态,直到下一次重置。
- Flash写和擦除通常比读取更长。
- Flash设备经常对在发生写入或擦除时可以执行的操作进行限制。
1.3 Firmware Volumes
固件卷(FV)是一种逻辑固件设备.在本规范中,数据和/或代码的基本存储存储库是固件卷。每个固件卷都被组织到一个文件系统中。因此,该文件是固件的基本存储单元。
每个固件卷都具有以下属性:
- Name.每个卷都有一个由UEFI全局唯一标识符(GUID)组成的名称。
- Size.每个卷都有一个大小,它描述了所有卷数据的总大小,包括任何标头、文件和可用空间。
- Format.每个卷都有一种格式,它描述了在卷的主体中使用的固件文件系统。
- 内存映射?某些卷可能是通过内存映射进行的,这表明该卷的整个内容会立即出现在处理器的内存地址空间中
- 粘性写? 某些卷可能需要特殊的擦除周期,才能将位从非擦除值更改为擦除值。
- 擦除极性. 如果卷支持“粘写”,则卷内的所有位将在擦除循环后返回到此值(0或1)。
2、HOB设计
HOB生成阶段是创建HOB和HOB列表的预启动阶段,HOB消费阶段是将HOB列表传递并消耗到的预引导阶段。如果PI体系结构实现包含了PEI和DXE,那么HOB生产者阶段是PEI阶段,而HOB消费阶段是DXE阶段。然而,生产者和消费者可以根据实施方式的不同而改变。
下表将本规范中使用的术语与其他PI规范中使用的术语进行了转换。
HOB规范中使用的术语 | 在其他PI规范中使用的术语 |
---|---|
HOB生产阶段 | PEI phase |
HOB consumer phase | DXE phase |
HOB Services: | 创建被称为移交块(HOBs)的数据结构,用于将信息传递到PI体系结构的下一个阶段。 |
在HOB制作阶段中的可执行内容 | Pre-EFI Initialization Module (PEIM) |
移交到HOB消费阶段 | DXE初始程序加载(IPL)PEIM或DXE IPL PEIM-to-PEIM接口(PPI) |
平台启动策略阶段 | BDS phase。 |
2.1 构建HOB列表
HOB列表最初是由HOB生产者阶段构建的。HOB列表是在存在、初始化和测试的内存中创建的。一旦创建了初始的HOB列表,物理内存就不能被后续的软件代理重新映射、交错或以其他方式移动。
HOB生产者阶段在公开HOB列表之前,必须在初始HOB列表中构建以下三个HOB:
- The PHIT HOB
- 内存分配HOB,描述用于永久内存的引导带处理器(BSP)堆栈所在的位置
或 内存分配HOB,描述永久存储的BSP存储位置(仅安腾处理器系列) - 一种资源描述符HOB,它描述了包含HOB生产者阶段内存范围的物理内存范围,其属性设置为当前、初始化和测试。
HOB列表的创建者可能会在最初的HOB列表中构建更多的HOB,例如额外的HOB来描述其他物理内存范围。还可以有其他模块,其中可能包括一个特定于HOB生成器阶段的HOB,用于记录在初始化过程中发现的内存错误。
当HOB生成者阶段完成其列表创建时,它将一个指向PHIT HOB的指针公开到其他模块。
2.2 HOB 构建规则
HOB构建必须遵守以下规则:
- 所有的HOB都必须以一个HOB通用标头开始。这个要求允许用户定位他们感兴趣的hob,同时跳过其他部分。请参见EFI_HOB_GENERIC_HEADER的定义。
- HOB可能包含仅在HOB生产者阶段和消费阶段期间可用的、直到HOB消费阶段终止的引导服务数据。
- HOB可以通过HOB消费阶段重新定位到系统内存中。HOB不能包含指向HOB列表中其他数据的指针,包括其他HOB列表中的指针。该表必须能够被复制,而不需要内部指针调整。
- 所有HOB的长度必须是8个字节的倍数。此要求满足安腾®处理器系列的对齐限制
- PHIT HOB必须始终以8字节的边界开始。由于这个需求和这个列表中的需求#4,所有的hob都将在一个8字节的边界上开始。
- HOBs被添加到HOB列表的末尾。HOB只能在HOB生产者阶段添加到HOB列表中,而不能添加到HOB消费阶段。
- 不能删除HOB。每个HOB的通用HOB标头必须描述HOB的长度,这样才能找到下一个HOB。
3.Report Status Code Routers
本节提供了在报告状态代码路由器中使用的PPI和协议的代码定义。这些接口允许多个平台依赖的驱动程序显示状态代码信息,在彼此不知情的情况下共存。
在每个阶段中都有一个通用的状态代码驱动程序。在每种情况下,驱动程序都会使用报表状态代码协议,并生成 Report Status Code Handler PPI或Protocol。Report Status Code Handler PPI或Protocol的每个消费者都将注册一个回调,以接收来自通用状态代码驱动程序的新状态代码的通知。
3.1 代码定义
3.1.1 Report Status Code Handler Protocol
typedef struct {
EFI_RSC_HANDLER_REGISTER Register;
EFI_RSC_HANDLER_UNREGISTER Unregister;
} EFI_RSC_HANDLER_PROTOCOL;
Register: 注册有关状态代码消息的通知的回调。
Unregister: 取消注册回调。
描述:一旦注册,状态代码消息将被转发到回调。该回调在被释放之前必须未注册。
回调函数:
typedef
EFI_STATUS
(EFIAPI *EFI_RSC_HANDLER_CALLBACK) (
IN EFI_STATUS_CODE_TYPE CodeType,
IN EFI_STATUS_CODE_VALUE Value,
IN UINT32 Instance,
IN EFI_GUID * CallerId,
IN EFI_STATUS_CODE_DATA * Data
);
描述:提供一个软件模块可以调用来报告状态代码的接口。
参数:
Type:指示正在报告的状态代码的类型
Value:描述一个硬件或软件实体的当前状态,他包含了关于用于分类实体以及操作的类和子类的信息。
Instance:对系统内的硬件或软件实体的枚举,系统可能包含多个匹配类/子类配对的多个实体。这个实例区分了它们。
CallerId:此可选参数可用于标识调用者。此参数允许状态代码驱动程序对不同的调用者应用不同的规则
Data:此可选参数可用于传递其他数据
包括驱动程序在内的各种软件模块都可以调用这个函数来报告一个状态代码,不保证如何处置状态码。ReportStatusCode()函数可以选择记录状态代码,但不需要执行此操作。
4. PCD
一种包含驱动程序或应用程序可以访问的各种当前平台设置或指令的平台数据库。
typedef struct _EFI_PCD_PROTOCOL {
EFI_PCD_PROTOCOL_SET_SKU SetSku;
EFI_PCD_PROTOCOL_GET_8 Get8;
EFI_PCD_PROTOCOL_GET_16 Get16;
EFI_PCD_PROTOCOL_GET_32 Get32;
EFI_PCD_PROTOCOL_GET_64 Get64;
EFI_PCD_PROTOCOL_GET_POINTER GetPtr;
EFI_PCD_PROTOCOL_GET_BOOLEAN GetBool;
EFI_PCD_PROTOCOL_GET_SIZE GetSize;
EFI_PCD_PROTOCOL_SET_8 Set8;
EFI_PCD_PROTOCOL_SET_16 Set16;
EFI_PCD_PROTOCOL_SET_32 Set32;
EFI_PCD_PROTOCOL_SET_64 Set64;
EFI_PCD_PROTOCOL_SET_POINTER SetPtr;
EFI_PCD_PROTOCOL_SET_BOOLEAN SetBool;
EFI_PCD_PROTOCOL_CALLBACK_ON_SET CallbackOnSet;
EFI_PCD_PROTOCOL_CANCEL_CALLBACK CancelCallback;
EFI_PCD_PROTOCOL_GET_NEXT_TOKEN GetNextToken;
EFI_PCD_PROTOCOL_GET_NEXT_TOKEN_SPACE GetNextTokenSpace;
} EFI_PCD_PROTOCOL;
对此协议的调用者必须处于TPL_APPLICATION任务优先级级别。
这是一个基本的PCD服务API,它为访问平台中的配置内容提供了一个抽象。它是一种提取信息的无缝机制,而不管信息存储在哪里(如只读数据,或EFI变量)。
该协议允许通过大小粒度的api访问数据,并为固件组件提供了一种机制来监控特定的设置,并在设置被更改时发出警报。