打印

BIOS系列杂谈-UEFI固件更新-2

[复制链接]
76|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
海洋无限|  楼主 | 2024-11-28 13:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1、操作系统模块调用Capsule Runtime服务EFI_RUNTIME_SERVICES.UpdateCapsule()传递带有reset属性的Capsule image至系统固件,这时系统更需要做一次重启。需要注意的是,此时的重启并非真正的重启,而是走了S3的路径,主要是为了利用S3状态memory不丢失,这样capsule image就可以一直保存在memory中。2.      重启时,平台PEI模块调用PEI_CAPSULE_PPI.CheckCapsuleUpdate()判断是否有Capsule固件待处理。CapsulePei模块读取“CapsuleUpdateDate”Variable检测是否有capsule在memory中,如果条件满足,PEI模块将会把启动模式设置为BOOT_ON_FLASH_UPDATE。
3.      Memory初始化完成后,PEI module调用PEI_CAPSULE_PPI.Coalesce()判断一系列Capsule片段的当前位置,把它们合并成一个连续的内存区域,把合并后的capsule拷贝至PEI memory中并且创建EFI_HOB_UEFI_CAPUSLE.  操作系统为capsule image分配的是连续的虚拟地址空间,而实际上则是一系列不连续的物理地址区域片段。OS会把虚拟地址以及物理地址一并传递到固件。这样固件可以立即处理或者在重启后处理capsule。如下图所示,左边是OS的角度看到的存放capsule的连续虚拟地址空间,中间的图表示capsule在系统内存中实际分布。最右边是传递至固件的Capsule block descriptor scatter gather list。Capsule Coalesce会遍历这个list,把所有capsule片段组合在一起放在连续的系统内存中。
4、进入BDS阶段后,BDS判断当前启动模式如果为BOOT_ON_FLASH_UPDATE,则调用CapsuleLib:ProcessCapsules()处理Capsule image。第一次调用需在EFI_END_OF_DXE_EVENT之前,因为系统flash设备会在EFI_END_OF_DXE_EVENT之后锁住。4.      ProcessCapsules() 通过CAPSULE_HOB获取满足条件的capsule images,如果capsule image是UEFI FMP格式的capsule,则调用ProcessFmpCapsuleImage()。5.      ProcessFmpCapsuleImage()调用FMP协议接口Fmp->GetImageInfo()获取固件信息并且和FMP capsule对比。只有满足了一系列验证条件后,比如签名验证,ProcessFmpCapsuleImage()才会调用Fmp->SetImage()执行固件更新。更新成功后,需设置capsule status variable避免同一个capsule image下次仍然被执行。固件在更新前必须按照NIST(National Institute of Standards and Technology)标准完成一些认证检测,比如签名认证。待更新capsule必须经过签名,更新机制才可以判断待更新内容是否可信。UEFI capsule 使用EFI_FIRMWARE_IMAGE_AUTHENTICATION认证,认证信息为PKCS7签名。固件更新机制从系统固件中提取可信证书,用可信证书验证PKCS7签名。如果capsule没有使用EFI_FIRMWARE_IMAGE_AUTHENTICATION认证或者认证失败,此capsule不会被用来更新固。

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

458

帖子

1

粉丝