Recovery 就是BIOS挂掉的时候(不是完全挂掉,PEI 部分还是完整的)去重新构建里面的内容,
有很多种情况可能导致BIOS 挂掉,FV(firmware volume)是以block 为单位存储在非挥发性(nonvolatile)
的存储介质上,当更新某个block的时候,突然掉电,那么这个固件就变为非法(invalid)的。另一方面,
一个恶意的程序或者硬件上面也可能导致存储介质损坏,作为系统的设计者必须有这个概念,就是要考虑到
这些情况的发生生,以及发生后的后果。
当然也可能出于下列原因而不去做这个功能:
存储FV的介质在功能上就相当于只读设备一样,就是里面的内容只能写一次。
因为实现这个机制需要更多的 FV 空间,这样会导致成本的上升。
系统足够强壮,不需要考虑这方面的问题。
什么时候需要recovery?
可以专门由一个PEIM 做这个事情,比如去检测 “(强制recovery jumper") , 或者 PEI Foundation.
PEI Foundation 可以检查到某个 PEIM 坏掉了,或者整个固件挂掉了。
Recovery模块的一般结构
首先要有一个概念,BIOS 完全挂掉,是不能做到recovery的,BIOS 必须跑到某一点,就是说,还能
做这些事情:
从外围设备(比如u盘)中读取一段数据。
用读到的数据去重构Firmware volume.
如果 PEI Dispatcher 发现某个PEIM 挂掉了,比如说,检测到一个错误的hash 值,这时候,就得把boot mode
切到reovery . 一旦设置为recover 模式,其他的PEIM 就不能去更改为其他模式了。
找到以及将Recovery DXE image 加载进去
PEI Dispatcher 会去调用DXE IPL(Initial Program Load) PEIM, 如果 DXE IPL 检测到需要recovery,
就会调用一个特殊的PPI, 叫Recovery Module PPI, EFI_PEI_RECOVERY_MODULE_PPI, 做这些事情:
把包含有DXE recovery image 载入内存。
更新 DXE 固件的Hand-Off Block.
Status = DeviceRecoveryModule->LoadRecoveryCapsule (PeiServices,DeviceRecoveryModule,0,Buffer);