HOB:Hand-off Block

在PEI的执行过程中,PEI Phase提供了一种简单的机制来为数据存储分配内存,这个数据存储区被称为HOBs。

这个数据存储区的基本内容为Hand-off Block,即HOB。

在内存中,连续存在的HOBs对PEI Phase的可执行内容来说都是可见的。有一些Services用来帮助HOB管理。这些在内存中的HOBs的连续的表被称为HOB List。

PEI Phase Memory Map and Usage:

在HOB List中的第一个HOB必须是PHIT HOB(Phase Handoff Information Table),最后一个HOB必须是End of HOB List HOB。

只有PEI Phase才允许增加或改动这些HOBs,当HOB List被传送给DXE Phase之后,他们就是只读的(Read Only)。一个只读的HOB List的延伸就是Handoff 信息,比如Boot Mode,必须以别的方式来处理。比如,DXE Phase想要产生一个Recovery条件,它不能update Boot Mode,而是通过使用特殊方式的reset call来实现。

在HOB中包含的系统状态数据(System State Data)是指在PEI to DXE Handoff的时候的系统状态,而不是代表DXE当前的系统状态。

HOB在PEI到DXE传送信息的过程遵循one Producer to one Consumer的模式,即在PEI阶段,一个PEIM创建一个HOB,在DXE阶段,一个DXE Driver使用那个HOB并且把HOB相关的信息传送给其他的需要这些信息的DXE组件。

HOB list是在PEI Phase被建立的,它存在于已经present,initialized,tested的Memory中。一旦最初的HOB List被创建,物理内存就不能被remapped, interleaved, 或者被后来的程序moved。

PEI Phase必须在最初的HOB List中建立以下三种HOBs,然后才能暴露这个HOB List给其他的Module(一个指针指向PHIT HOB):

1. PHIT HOB

2. 一个描述了固定存储器所在的BSP堆栈位置的Memory allocation HOB

3. 一个描述了物理内存范围的Resource descriptor HOB

构造HOB必须遵循以下的规则:

1. 每个HOB必须以一个HOB generic header开头(EFI_HOB_GENERIC_HEADER)。

2. HOBs可以包含boot services data,在DXE Phase结束之前,PEI和DXE都可以调用。

3. HOBs可以被DXE重新安置在系统内存上,每个HOB都不能包含指向HOB List中其他数据的指针,也不能指向其他的HOB,这个Table必须可以被Copied而不需要任何内部指针的调整。

4. 所有的HOB在长度上必须是8 bytes的倍数,是alignment的要求。

5. PHIT HOB必须总是在8 byte处开始。

6. 增加的HOB总是被加到HOB List的最后,而且只能在PEI Phase(HOB Producer Phase)增加,DXE Phase(HOB Consumer Phase)不能。

7. HOBs不能被删除。每个HOB的generic header中都会描述这个HOB的长度,这样下一个HOB就很容易被找到。

如何增加一个新的HOB到HOB List中?

PEI Phase(HOB Producer Phase)肯定包含一个指向PHIT HOB(这是HOB List的开始)的指针,然后遵循以下的步骤:

1. 确定NewHobSize,即确定要创建的HOB的大小(以Byte为单位)。

2. 确定是否有足够的空闲内存分配给新的HOB(NewHobSize <= (PHIT->EfiFreeMemoryTop - PHIT->EfiFreeMemoryBottom))。

3. 在(PHIT->EfiFreeMemoryBottom)处构建HOB。

4. 设置PHIT->EfiFreeMemoryBottom = PHIT->EfiFreeMemoryBottom + NewHobSize 。

 

 

Refer to:

VOLUME 3: Platform Initialization Shared Architectural Elelments, Version 1.2