HOB数据结构及分析

目录

HOB设计

HOB条款的解释

HOB概述

示例HOB产生阶段内存映射和用法

 HOB列表

构建HOB列表

构造初始HOB列表

HOB构建规则

HOB数据结构

HOB介绍

HOB通用头部

PHIT HOB

内存分配HOB

内存分配HOB

引导栈处理器(BSP)堆栈存储器分配HOB

引导栈处理器(BSP)BSPSTORE内存分配HOB

内存分配模块HOB

资源描述符HOB

GUID扩展HOB

固件卷HOB

CPU HOB

内存池HOB

UEFI封装HOB

未使用的HOB

HOB列表结束HOB


HOB设计

HOB条款的解释

因为HOB是用于在早期预引导阶段切换系统信息的关键架构机制,并且因为并非所有PI架构实现都将使用Pre-EFI初始化(PEI)和驱动程序执行环境(DXE)阶段,因此避免使用其他PI规范中使用的PEI和DXE命名法。

相反,本规范使用以下术语来指代处理HOB的阶段:

  • HOB产生阶段
  • HOB使用阶段

HOB产生阶段是预引导阶段,其中创建了HOB和HOB列表。HOB使用阶段是HOB列表传递然后使用的预启动阶段。如果PI Architecture实施包含PEI和DXE,则HOB产生阶段是PEI阶段,HOB使用阶段是DXE阶段。但是,生产者和使用者可以根据实施情况进行更改。

HOB概述

HOB产生阶段提供了一种在阶段执行期间为数据存储分配内存的简单机制。数据存储在架构上由HOB定义和描述。当从HOB产生阶段调用它时,该数据存储也被传递到HOB产生阶段。数据存储的基本容器称为Hand-Off Block或HOB。HOB在内存中顺序分配,可用于HOB产生阶段中的可执行内容。有一系列服务可以促进HOB操作。内存中HOB的顺序列表将被称为HOB列表。

示例HOB产生阶段内存映射和用法

该地图是细分该地区的可能方式。

 HOB列表

HOB列表中的第一个HOB必须是Phase Handoff Information Table(PHIT)HOB。HOB列表中的最后一个HOB必须是HOB列表HOB的结尾。

只允许HOB产生阶段组件对HOB进行添加或更改。将HOB列表传递到HOB使用阶段后,它实际上是只读的。只读HOB列表的分支是必须以独特的方式处理诸如引导模式之类的切换信息。 例如,如果HOB使用阶段产生恢复条件,则它不会更新引导模式,而是使用特殊类型的重置调用来实现该操作。 HOB列表包含HOB使用者到HOB生产者切换时的系统状态数据,并且不代表HOB使用阶段期间的当前系统状态。

构建HOB列表

构造初始HOB列表

HOB列表最初由HOB产生阶段构建。HOB列表在存在,初始化和测试的内存中创建。一旦创建了初始HOB列表,就不能由后续软件代理重新映射,交错或以其他方式移动物理存储器。

在将列表公开给其他模块之前,HOB产生阶段必须在初始HOB列表中构建以下三个HOB:

  • PHIT HOB
  • 内存分配HOB,描述永久内存的引导处理器(BSP)堆栈所在的位置或描述永久内存的BSP存储位置(仅限Itanium®处理器系列)
  • 描述物理内存范围的资源描述符HOB,其中包含HOB产生阶段内存范围,其属性设置为存在,初始化和测试

HOB列表创建者可以在初始HOB列表中构建更多HOB,例如用于描述其他物理内存范围的附加HOB。还可以有其他模块,其中可能包括HOB产生阶段特定的HOB,以记录在初始化期间发现的内存错误。当HOB产生阶段完成其列表创建时,它将指向PHIT HOB的指针暴露给其他模块。

HOB构建规则

HOB构建必须遵守以下规则:

  1. 所有HOB必须以HOB通用标头开头。 此要求允许用户在跳过其余的HOB时找到他们感兴趣的HOB。
  2. HOB可能包含在HOB产生和使用阶段期间可用的引导服务数据,直到HOB使用阶段终止。
  3. HOB可以由HOB使用阶段重新定位在系统存储器中。HOB不得包含指向HOB列表中其他数据的指针,包括其他HOB中的数据。必须能够复制该表而无需调整内部指针。
  4. 所有HOB的长度必须是8个字节的倍数。此要求符合Itanium®处理器系列的对齐限制。
  5. PHIT HOB必须始终以8字节边界开始。 由于此要求和此列表中的要求#4,所有HOB将以8字节边界开始。
  6. HOB被添加到HOB列表的末尾。HOB只能在HOB产生阶段添加到HOB列表,而不是HOB使用阶段。
  7. HOB无法删除。每个HOB的通用HOB头必须描述HOB的长度,以便可以找到下一个HOB。私有GUIDed HOB可以提供一种机制来标记某些或其整个内容无效。

HOB数据结构

HOB介绍

本节包含各种HOB的基本定义。所有HOB都包含一个通用头文件EFI_HOB_GENERIC_HEADER,它指定了HOB的类型和长度。根据HOB类型,每个HOB都具有超出通用头的附加数据。本节定义了以下数据类型和结构:

  • EFI_HOB_GENERIC_HEADER
  • EFI_HOB_HANDOFF_INFO_TABLE
  • EFI_HOB_MEMORY_ALLOCATION
  • EFI_HOB_MEMORY_ALLOCATION_STACK
  • EFI_HOB_MEMORY_ALLOCATION_BSP_STORE
  • EFI_HOB_MEMORY_ALLOCATION_MODULE
  • EFI_HOB_RESOURCE_DESCRIPTOR
  • EFI_HOB_GUID_TYPE
  • EFI_HOB_FIRMWARE_VOLUME
  • EFI_HOB_FIRMWARE_VOLUME2
  • EFI_HOB_CPU
  • EFI_HOB_MEMORY_POOL
  • EFI_HOB_UEFI_CAPSULE
  • EFI_HOB_TYPE_UNUSED
  • EFI_HOB_TYPE_END_OF_HOB_LIST

本节还包含从属于调用它们的结构的其他数据类型和结构的定义。可以在父数据结构定义的“相关定义”中找到以下类型或结构:

  • EFI_HOB_MEMORY_ALLOCATION_HEADER
  • EFI_RESOURCE_TYPE
  • EFI_RESOURCE_ATTRIBUTE_TYPE

HOB通用头部

EFI_HOB_GENERIC_HEADER

摘要

描述HOB内部数据的格式和大小。所有HOB都必须包含此通用HOB标头。

原型

参数

HobType

标识HOB数据结构类型。

HobLength

HOB的字节长度。

Reserved

对于此版本的规范,此字段必须始终设置为零。

描述

所有HOB都有一个用于以下内容的公共标头:

  1. 遍历下一个HOB
  2. 描述HOB内部数据的格式和大小

PHIT HOB

EFI_HOB_HANDOFF_INFO_TABLE (PHIT HOB)

摘要

包含HOB生产者阶段使用的一般状态信息。此HOB必须是HOB列表中的第一个。

原型

参数

Header

HOB通用标头。Header.HobType = EFI_HOB_TYPE_HANDOFF。

Version

与PHIT HOB定义有关的版本号。 该值的长度为4个字节,以便在与4字节BootMode组合时提供8字节对齐的条目。

BootMode

在HOB产生阶段确定的系统引导模式。类型EFI_BOOT_MODE是UINT32;如果符合PI Architecture的实现包含PEI阶段,则可能的位值在平台初始化Pre-EFI初始化核心接口规范(PEI CIS)中定义。

EfiMemoryTop

分配给HOB产生阶段使用的内存的最高地址位置。该地址必须是4-KiB对齐以满足UEFI的页面限制。类型EFI_PHYSICAL_ADDRESS在UEFI 2.0规范中的AllocatePages()中定义。

EfiMemoryBottom

分配给HOB产生阶段使用的内存的最低地址位置。

EfiFreeMemoryTop

当前可供HOB产生阶段使用的可用内存的最高地址位置。该地址必须是4-KiB对齐以满足UEFI的页面限制。

EfiFreeMemoryBottom

可用于HOB生成器阶段的可用内存的最低地址位置。

EfiEndOfHobList

HOB列表的结尾。

描述

相位切换信息表(PHIT)HOB必须是HOB列表中的第一个。通过某些服务,HOB产生阶段组件可以使用指向此HOB的指针。该规范通常将此HOB称为PHIT HOB,或者有时称为切换HOB。HOB使用阶段在其初始化期间读取PHIT HOB。

内存分配HOB

内存分配HOB

EFI_HOB_MEMORY_ALLOCATION

摘要

描述在HOB列表之外存在的HOB产生阶段期间使用的所有内存范围。 此HOB类型描述了如何使用内存,而不是内存的物理属性。

原型

参数

Header

HOB通用标。Header.HobType =

EFI_HOB_TYPE_MEMORY_ALLOCATION。

AllocDescriptor

EFI_HOB_MEMORY_ALLOCATION_HEADER的一个实例,它描述逻辑内存分配的各种属性。类型字段将用于随后包含在UEFI存储器映射中。

描述

内存分配HOB用于描述HOB列表之外的内存使用情况。 HOB使用阶段不对由内存分配HOB分配的内存内容做出假设,并且除非它具有主题分配HOB名称(EFI_GUID)的明确知识,否则它不会移动数据。可以在HOB生成阶段存储区域或当前和初始化系统存储器的其他区域中分配存储器。

HOB使用阶段读取所有内存分配HOB,并根据每个内存分配HOB的EFI_HOB_MEMORY_ALLOCATION_HEADER的以下字段将内存分配到系统内存映射中:

  • MemoryBaseAddress
  • MemoryLength
  • MemoryType

除了由本规范定义的一组特定的内存分配HOB之外,HOB使用阶段不解析由每个内存分配HOB的Name字段标识的GUID特定数据。对应于特定Name GUIDed内存分配HOB的HOB使用阶段驱动程序可以解析HOB列表以找到特定命名的内存分配HOB,然后操纵由该GUID的使用模型定义的内存空间。

该规范定义了一组内存分配HOB,这些HOB在架构上用于分配HOB产生和使用阶段使用的内存。此外,以下内存分配HOB专门定义为由HOB产生阶段的最后阶段使用,以描述在切换到HOB使用阶段之前的处理器状态:

  • BSP stack memory allocation HOB
  • BSP store memory allocation HOB
  • Memory allocation module HOB

引导栈处理器(BSP)堆栈存储器分配HOB

EFI_HOB_MEMORY_ALLOCATION_STACK

摘要

描述由HOB产生阶段生成的内存堆栈,并且HOB产生阶段中所有内存后安装的可执行内容正在执行。

GUID

原型

参数

Header

HOB通用标头。 Header.HobType =

EFI_HOB_TYPE_MEMORY_ALLOCATION。

AllocDescriptor

EFI_HOB_MEMORY_ALLOCATION_HEADER的一个实例,它描述逻辑内存分配的各种属性。类型字段将用于随后包含在UEFI存储器映射中。 EFI_HOB_MEMORY_ALLOCATION_HEADER类型在EFI_HOB_MEMORY_ALLOCATION中定义。

描述

该HOB描述了由HOB产生阶段产生的存储器堆栈,并且HOB产生阶段中所有后存储器安装的可执行内容正在其上执行。切换到HOB使用阶段需要知道这些信息,以便它可以适当地将该堆栈映射到它自己的执行环境中,并在任何后续的存储器映射中描述它。

HOB使用阶段在初始化期间读取此HOB。 HOB使用阶段可以选择移动或重新定位BSP的堆栈,以满足HOB使用阶段实施所定义的大小和位置要求。 因此,其他HOB使用阶段组件不能依赖BSP堆栈存储器分配HOB来描述在执行HOB使用阶段期间BSP堆栈所处的位置。

没有任何附加限定的BSP堆栈内存分配HOB描述了以下任一项:

  • BSP当前使用的堆栈。
  • 当前正在执行HOB产生阶段及其可执行内容的处理器。
  • PI体系结构和HOB产生器阶段的模型是单线程执行环境的模型,因此它是这个单独的,区分控制的控制线程,其环境由此HOB描述。Itanium®处理器系列还需要描述BSPSTORE(AR18)(“后备存储指针存储”)寄存器的值,该寄存器保存内存中的连续位置,其中安腾处理器系列寄存器堆栈引擎(RSE)将 溢出它的值。

引导栈处理器(BSPBSPSTORE内存分配HOB

EFI_HOB_MEMORY_ALLOCATION_BSP_STORE

摘要

定义启动带处理器(BSP)BSPStore(“Backing Store Pointer Store”)寄存器溢出存储的位置。

GUID

原型

参数

Header

HOB通用标头。 Header.HobType =

EFI_HOB_TYPE_MEMORY_ALLOCATION。

AllocDescriptor

EFI_HOB_MEMORY_ALLOCATION_HEADER的一个实例,它描述逻辑内存分配的各种属性。 类型字段将用于随后包含在UEFI存储器映射中。 类型EFI_HOB_MEMORY_ALLOCATION_HEADER在HOB类型EFI_HOB_MEMORY_ALLOCATION中定义。

描述

HOB使用阶段在初始化期间读取此HOB。 HOB使用阶段可以选择移动或重新定位BSP的寄存器存储,以满足由HOB使用阶段的实现定义的大小和位置要求。因此,其他HOB使用阶段组件不能依赖BSP存储器分配HOB来描述在执行HOB使用阶段期间BSP存储器所处的位置。

此HOB仅适用于Itanium处理器系列。

内存分配模块HOB

EFI_HOB_MEMORY_ALLOCATION_MODULE

摘要

定义HOB使用阶段的位置和入口点。

GUID

原型

参数

Header

HOB通用标头。Header.HobType =

EFI_HOB_TYPE_MEMORY_ALLOCATION。

MemoryAllocationHeader

EFI_HOB_MEMORY_ALLOCATION_HEADER的一个实例,它描述逻辑内存分配的各种属性。类型字段将用于随后包含在UEFI存储器映射中。类型EFI_HOB_MEMORY_ALLOCATION_HEADER在HOB类型EFI_HOB_MEMORY_ALLOCATION中定义。

ModuleName

GUID指定包含HOB使用阶段组件的固件文件系统名称的值。类型EFI_GUID在UEFI 2.0规范的InstallProtocolInterface()中定义。

EntryPoint

包含HOB使用阶段固件文件的内存映射固件卷的地址。类型EFI_PHYSICAL_ADDRESS在UEFI 2.0规范中的AllocatePages()中定义。

描述

HOB使用阶段在其初始化期间读取存储器分配模块HOB。该HOB描述了HOB使用阶段的存储位置。HOB使用阶段应使用该信息为HOB使用阶段创建图像句柄。

资源描述符HOB

EFI_HOB_RESOURCE_DESCRIPTOR

摘要

描述在HOB产生阶段期间在处理器主机总线上找到的所有固定的,不可重定位的资源范围的资源属性。

原型

参数

Header

HOB通用标头。 Header.HobType =

EFI_HOB_TYPE_RESOURCE_DESCRIPTOR。

Owner

表示资源所有者的GUID。HOB使用阶段组件使用此GUID来关联资源的设备所有权。

ResourceType

由EFI_RESOURCE_TYPE定义的资源类型枚举。

ResourceAttribute

由EFI_RESOURCE_ATTRIBUTE_TYPE定义的资源属性。

PhysicalStart

资源区域的物理起始地址。类型EFI_PHYSICAL_ADDRESS在UEFI 2.0规范中的AllocatePages()中定义。

ResourceLength

资源区域的字节数。

描述

资源描述符HOB描述在HOB产生阶段期间在处理器主机总线上找到的所有固定的,不可重定位的资源范围的资源属性。此HOB类型不描述如何使用内存,而是描述存在的物理内存的属性。

HOB使用阶段在建立初始全局一致性域(GCD)映射时读取所有资源描述符HOB。HOB产生阶段的最低要求是HOB产生阶段中的可执行内容报告以下之一:

  • 启动HOB使用阶段所需的资源。
  • 在由平台引导策略阶段执行的动态系统配置之前启动的HOB使用阶段驱动程序组件未捕获的固定资源。

例如,HOB产生器阶段中的可执行内容应报告在HOB产生器阶段期间找到的任何物理内存。另一个示例是报告包含固件卷的引导固件卷(BFV)。 HOB产生阶段中的可执行内容不需要报告固定的系统资源,例如I / O端口70h / 71h(实时时钟),因为这些固定资源可以通过特定于平台的芯片组驱动程序从GCD分配。例如,在平台引导策略阶段之前的HOB使用阶段。

目前的想法是GCD不跟踪HOB的所有者GUID,因此承担设备资源所有权的HOB使用阶段组件必须在尝试将设备资源分配给自身之前在HOB使用阶段从HCD中释放由HOB产生器阶段初始化的资源。

GUID扩展HOB

EFI_HOB_GUID_TYPE

摘要

允许HOB产生阶段中的可执行内容的编写者维护和管理其类型未包含在本规范中的HOB。 具体而言,HOB产生阶段中的可执行内容的编写者可以使用此模块特定值生成GUID并命名他们自己的HOB条目。

原型

参数

Header

HOB通用标头。Header.HobType =

EFI_HOB_TYPE_GUID_EXTENSION。

Name

定义此HOB内容的GUID。类型EFI_GUID在UEFI 2.0规范中的InstallProtocolInterface()中定义。

描述

GUID扩展HOB允许HOB产生阶段中的可执行内容的编写者使用GUID创建他们自己的HOB定义。HOB产生阶段中的所有可执行内容都应使用此HOB类型来定义非体系结构的特定于实现的数据区域。该HOB类型还可以将特定于实现的数据从HOB产生器阶段中的可执行内容传递到HOB使用阶段中的驱动器。

HOB使用阶段组件(如HOB使用阶段驱动程序)将在HOB使用阶段读取GUID扩展名HOB。 HOB使用阶段组件必须固有地知道它正在扫描HOB列表的GUID扩展HOB的GUID。 该知识建立了关于HOB在HOB产生阶段中的可执行内容与HOB使用者阶段驱动程序之间的定义和使用的合同。

固件卷HOB

EFI_HOB_FIRMWARE_VOLUME

摘要

详细说明包含固件文件的固件卷的位置。

原型

参数

Header

HOB通用标头。Header.HobType = EFI_HOB_TYPE_FV。

BaseAddress

固件卷的物理内存映射基址。类型EFI_PHYSICAL_ADDRESS在UEFI 2.0规范中的AllocatePages()中定义。

Length

固件卷的长度(以字节为单位)。

描述

固件卷HOB详细说明了包含固件文件的固件卷的位置。 它包括一个基地址和长度。特别是,HOB使用阶段将使用这些HOB来发现要执行的驱动程序,并且切换到HOB使用阶段将使用该HOB来发现HOB使用阶段固件文件的位置。

固件卷HOB通过以下方式生成:

  • 通过引导固件卷(BFV)中的HOB生成器阶段中的可执行内容,其理解平台中存在的固件卷的大小和布局。
  • 通过将固件卷从某些介质加载到内存中的模块。 固件卷HOB详细说明了此内存位置。

固件卷HOB描述的固件卷必须具有本规范中描述的固件卷头。

HOB使用阶段使用由HOB产生阶段呈现的所有固件卷HOB,以供其对PI固件映像格式的只读支持使用。HOB产生阶段需要描述可能包含发现其他固件卷所需的HOB使用阶段或平台驱动程序的任何固件卷。

EFI_HOB_FIRMWARE_VOLUME2

摘要

详细说明从另一个固件卷中的文件中提取的固件卷的位置。

原型

参数

Header

HOB通用标头。Header.HobType = EFI_HOB_TYPE_FV2。

BaseAddress

固件卷的物理内存映射基址。类型EFI_PHYSICAL_ADDRESS在统一可扩展固件接口规范2.0版中的AllocatePages()中定义。

Length

固件卷的长度(以字节为单位)。

FvName

固件卷的名称。

FileName

包含此固件卷的固件文件的名称。

描述

固件卷HOB详细说明了在HOB使用阶段之前从固件卷内的文件中提取的固件卷的位置。通过记录卷和文件名,HOB使用阶段可以避免再次处理同一文件。

此HOB由一个模块创建,该模块已将另一个文件中的固件卷加载到内存中。 此HOB详细说明了基本地址,长度,文件名和卷名。

HOB使用阶段使用由HOB产生阶段呈现的所有固件卷HOB,以供其对PI固件映像格式的只读支持使用。

CPU HOB

EFI_HOB_CPU

摘要

描述处理器信息,例如地址空间和I / O空间功能。

原型

参数

Header

HOB通用标头。Header.HobType = EFI_HOB_TYPE_CPU。

SizeOfMemorySpace

标识处理器的最大物理内存可寻址能力。

SizeOfIoSpace

标识处理器的最大物理I / O可寻址性。

Reserved

对于此版本的规范,此字段将始终设置为零。

描述

CPU HOB由HOB产生阶段中的处理器可执行内容产生。它描述了处理器信息,例如地址空间和I / O空间功能。HOB使用阶段使用此信息来描述GCD功能的范围。

内存池HOB

EFI_HOB_MEMORY_POOL

摘要

描述池内存分配。

原型

参数

Header

HOB通用标头。 Header.HobType =

EFI_HOB_TYPE_MEMORY_POOL。

描述

内存池HOB由HOB产生阶段生成,并描述池内存分配。HOB使用阶段应该能够忽略这些HOB。此HOB的目的是允许HOB产生阶段在HOB列表中具有简单的内存分配机制。内存分配的大小由EFI_HOB_GENERIC_HEADER中的HobLength字段规定。

UEFI封装HOB

EFI_HOB_UEFI_ CAPSULE

摘要

详细说明合并每个UEFI封装内存页面的位置。

原型

参数

Header

HOB通用头,其中Header.HobType =

EFI_HOB_TYPE_UEFI_CAPSULE。

BaseAddress

UEFI封装的物理内存映射基址。该值被设置为指向UEFI封壳的连续存储器的基础。

Length

连续内存的长度(以字节为单位)。

描述

每个UEFI封装HOB详细说明UEFI封包的位置。它包括一个基址和长度,它基于具有EFI_CAPSULE_HEADER的内存块和相关的基于CapsuleImageSize的有效负载。在使用EFI_CAPSULE_HEADER中设置的CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE标志进行UEFI UpdateCapsule服务调用之后的某个时间,PEI PI固件将创建这些HOB。

未使用的HOB

EFI_HOB_TYPE_UNUSED

摘要

表示可以忽略HOB的内容。

原型

描述

该HOB类型意味着可以忽略HOB的内容。此类型对于支持没有删除服务的简单,仅分配的HOB体系结构是必需的。HOB列表的使用者应忽略具有此类型字段的HOB条目。

希望使HOB条目可忽略的代理应将其类型设置为上面定义的原型。

HOB列表结束HOB

EFI_HOB_TYPE_END_OF_HOB_LIST

摘要

表示HOB列表的结尾。 此HOB必须是HOB列表中的最后一个。

原型

描述

此HOB类型表示HOB列表的结尾。此HOB类型必须是HOB列表中的最后一个HOB类型,并终止HOB列表。 如果HOB列表没有EFI_HOB_TYPE_END_OF_HOB_LIST类型的最终HOB,则应将其视为格式错误。

猜你喜欢

转载自blog.csdn.net/z190814412/article/details/85330324