创作固件更新包
每个固件更新包都包含一个二进制文件,其中包含整个固件有效负载(例如,firmware.bin)和 Windows 用于验证 firmware.bin 的安全目录。 有关安全目录和驱动程序的详细信息,请参阅目录文件和数字签名以及为 PnP 驱动程序包创建目录文件。
固件更新包必须能够更新以下一种或多种类型的固件:
UEFI 系统固件。
系统中单个设备的固件。
建议每个固件更新包面向单个固件资源(UEFI 系统固件或单个设备);但在某些情况下,有一个更新系统固件和一个或多个设备的单个固件更新包可能很有利。
一个设备不能被多个固件更新包作为目标。 如果一个设备被包含系统固件的固件更新包作为目标,那么它就不能被只针对该设备的第二个固件更新包作为目标。
为了允许固件更新包将固件更新定位到适当的系统硬件,Windows 为 ESRT 中的每个条目提供了一个设备实例,其中这样的设备实例公开了一个硬件 ID,该 ID 将其标识为属于 ESRT 条目。
安装固件更新包后,Windows 会将其作为驱动程序包进行处理。 Windows 将每个更新包的固件负载复制到系统目录下的安全位置,准备系统执行固件更新,并触发系统重新启动。
Windows 不支持驱动程序包之间的依赖关系。 因此,在创作新的固件更新包时,必须遵守以下要求:
固件更新包必须能够自行成功安装,并且不依赖于其他设备固件、系统固件或其他固件更新包。
建议每个更新包都针对系统上的单个设备或 UEFI 系统固件(在 ESRT 中定义)。
每个更新包必须包含单个固件更新二进制文件(例如,firmware.bin)。
每个更新包中的固件更新有效负载需要包含在单个二进制文件中。 系统重新启动后,OS 加载程序会将每个固件更新包的每个固件更新二进制文件加载到物理内存中,并生成指向为安装预配的每个有效负载文件的指针数组(UEFI 2.3.1 规范将此数组称为 CapsuleHeaderArray)。
此数组在对 EFI UpdateCapsule() 函数的调用中传递。 UpdateCapsule() 用作邮箱,将每个驱动程序包的固件更新有效负载传递到平台固件。
每个封装(固件更新有效载荷)由固件资源的 ESRT 条目指定的固件 ID 标识。
收到每个固件更新有效负载后,会处理固件更新请求,并在适用时应用。
CapsuleHeaderArray 中的每个条目都是单个连续的数据块,其中包含系统中单个设备的固件驱动程序包中的固件更新有效负载。 对于每个目标固件资源,固件更新有效负载必须包含固件映像和平台进行验证所需的所有信息。
所有固件更新驱动程序包的固件有效负载通过 UEFI UpdateCapsule 服务传递到平台固件。 由于集成设备将源自各种不同的 IHV,因此系统 OEM(可能还有 SoC 制造商)需要直接使用这些 IHV,以确保为给定系统适当地创作设备固件更新。 此外,系统 OEM 需要确保 ESRT 条目允许 UpdateCapsule 包以适当的系统为目标。
例如,多个 OEM 可能为其系统选择同一型号的移动宽带 (MBB) 设备。 尽管 MBB 设备在每个系统中完全相同,但每个 OEM 都必须与 MBB IHV 协作,为其系统创作自定义固件更新包。 需要这种自定义级别的设备固件更新才能解决 OEM 系统中的变量。
根据 OEM 选择的 SoC 以及设备与 SoC 的连接方式,对设备进行寻址可能有所不同。
系统 OEM 可将系统出售给多个移动网络运营商 (MNO),以便转售给消费者。 MBB 设备必须具有 MNO 感知性,要求对固件进行自定义和认证以满足特定 MNO 的要求。
该系统可能在全球多个市场销售,每个市场都有不同的 RF 法规和无线电频率分配。 MBB 设备固件可能需要自定义以满足这些市场要求。
每个 OEM 都必须仔细考虑这些特定于设备的要求,并采取必要的措施,确保设备固件适当定位和更新。 这需要仔细管理 ESRT 条目,以确保正确部署设备固件。
创作更新包后,需要将其提交到 Microsoft 进行认证和签名。