EFI 将启动顺序分成了很多阶段,PEI 和DXE 之间的跨度比较大,PEI 阶段是在RAM-limited 环境运行的,但DXE 阶段是在相对充足的内存空间上运行的。
在内存初始化之前,或者初始化内存的时候,PEI 收集了很多数据供后续的DXE 用,也就是说,有些数据需要从PEI 阶段传到DXE.
由于PEI 的运行受到内存的限制,所以需要一种稳定的机制去传输数据,即, 我们今天要说的HOB(Han Off Blocks).
所有的Hob放在一段连续的内存里面,由一个以定义好的头去标识,这个头(header) 叫 Phase Handoff Information Table(PHIT). 我们把PHIT 和当前所有的hob 合在一起叫Hob list.
PHIT的位置由GetHobList 这个系统服务区获得。
它的函数实现在hob.c :
如果我们想往hob list 里面追加一个HOB 那么是通过CreateHob 完成的。它的函数实现也是在hob.c 里面
85-88: 获取HOB 列表的起始地址
98: 调整HOB 的长度为8字节对齐。
100-101:计算当前可用的HOB数据块的空间。
110-113: 将hob 加到hob 列表最末端。
116: 将结束类型的hob 加到hob list 末尾用以表示HOB 列表结束。
118-112: 更新末端Hob节点的相关信息。