ATF源码篇(九):docs文件夹-Components组件(8)固件升级

news2024/10/7 12:25:19

固件更新(FWU)

本文档描述了TF-A中可用的各种固件更新(FWU)机制的设计。

  • 1、PSA固件更新(PSA FWU)-平台安全架构
  • 2、TBBR固件更新(TBBR FWU)-可信板引导要求

PSA固件更新实施了同名规范(Arm文档IHI 0093),该规范定义了用于安装固件更新的标准固件接口。

另一方面,TBBR固件更新仅涵盖固件恢复。可以说,其名称有些误导,但TBBR规范和术语早于PSA FWU。这两种机制是互补的,因为PSA FWU假设设备在更新失败时具有备份或恢复能力,这可以通过TBBR FWU实现来实现。

1、PSA固件更新(PSA FWU)

介绍

PSA固件更新规范定义了固件更新客户端和固件更新代理的概念。客户端将新固件镜像提供给更新代理,以将其存储在非易失性存储中。

通用系统设计将更新代理置于安全世界,而客户端在正常世界中执行。PSA固件更新规范提供了用于普通世界实体(也称为客户端)将固件映像传输到更新代理的ABIs(就是一种接口)。

范围

客户端和更新代理的设计不在本文档的范围内。本文档主要介绍平台引导详细信息,即客户端和更新代理完成FWU后第二阶段引导加载程序的角色

概述

在非易失性存储器中有活动库和更新库,分别由active_index和update_index标识。活动库存储正在运行的固件,而更新库包含固件更新。

在非易失性存储器的更新库中更新固件后,update Agent将更新库标记为活动库,并将更新的FWU元数据写入非易失存储器。(有点像AB分区)在随后重新启动时,第二阶段Bootloader(BL2)执行以下操作:

  • 读取内存中的FWU元数据
  • 借助FWU元数据检索非易失性存储中更新镜像的镜像规格(偏移量和长度)
  • 使用FWU平台函数plat_FWU_Set_images_source()和plat_FWU_Set_metadata_image_source`
  • 使用这些I/O策略将镜像从此地址读取到内存中

默认情况下,平台使用活动的非易失性存储库以试用状态引导镜像。如果镜像通过了身份验证检查,并且系统成功启动了正常世界镜像,则更新代理在正常世界进行进一步消毒检查后将此更新标记为已接受。

第二阶段Bootloader(BL2)避免升级平台NV计数器,直到确认接受给定更新。

以下序列图显示了平台引导流程:

在这里插入图片描述

如果平台由于任何原因(如身份验证失败或正常世界软件的非功能性)而无法从活动库启动,则看门狗将重置,以便平台有机会解决问题。此引导失败和重置序列可能会重复,直到达到试用状态时间。之后,平台可以决定从先前的_active_index库启动。

如果映像仍然无法从先前的激活索引库成功启动(例如,由于非易失性存储的老化影响),则平台可以选择固件恢复机制:ref:TBBR firmware Update以恢复系统。

2、TBBR固件更新(TBBR FWU)

介绍

该技术使经过认证的固件能够将固件映像从外部接口(如USB、UART、SD eMMC、NAND、NOR或以太网)更新到SoC非易失性存储器(如NAND闪存、LPDDR2-NVM或平台确定的任何存储器)。

即使系统中的当前固件损坏或丢失,此功能也能正常工作;因此可以将其用作恢复模式。它还可以由其他更高级别的固件更新软件补充。

FWU实现了可信板引导要求(TBBR)规范Arm DEN0006C-1的特定部分。它应与:ref:Trusted Board Boot设计文档一起使用,该文档描述了可信固件-a(TF-a)TBBR实现的映像验证部分。

当作为:ref:PSA firmware Update过程的一部分执行的所有固件更新失败时,它可以作为最后的手段。

范围

本文档描述了安全世界FWU的设计。描述正常世界FWU镜像应该如何操作超出了其范围。要实现正常的FWU映像,请参阅TBBR中的“非可信固件更新程序”要求。(后面再来看看这个文档)

概述

FWU引导流主要由BL1介导。由于BL1在ROM中执行,并且通常希望最小化ROM代码量,因此该设计允许FWU的某些部分在其他安全和正常世界映像中实现。平台代码可以选择在哪些镜像中实现哪些部分,但一般期望是:

  • BL1 handles:

    • FWU引导流的检测和启动。
    • 将图像从非安全存储器复制到安全存储器
    • FWU图像认证
    • FWU过程中正常和安全世界之间的上下文切换。
  • 其他安全世界FWU映像处理FWU进程所需的平台初始化。

  • 普通世界FWU映像处理从外部接口到非安全内存的固件映像加载。

FWU功能的主要要求是:

  • 导出BL1 SMC接口以与在其他异常级别执行的其他FWU映像进行互操作。

  • 导出一个平台接口,为FWU公共代码提供所需的信息,并启用特定于平台的FWU功能。有关此接口的详细信息,请参阅:ref:Porting Guide

TF-A与其他TF-A图像一样,对FWU图像使用缩写图像术语。有关这些术语的解释,请参阅:ref:Image Terminology文档。
下图显示了Arm开发平台的FWU引导流程。像朱诺这样的Arm CSS平台有一个系统控制处理器(SCP),它们使用所有定义的FWU图像。其他平台可能使用其中的一个子集。

在这里插入图片描述

镜像识别

每个FWU图像和证书由平台定义的唯一ID标识,BL1使用该ID通过调用BL1_plat_get_image_desc()获取图像描述符(image_desc_t)。同样的ID也用于准备信任链(有关详细信息,请参阅:ref:`Authentication Framework&Chain of Trust’文档)。

  • 图像描述符包括以下信息:

    • 可执行或不可执行图像。这指示是否允许正常世界请求执行安全世界FWU图像(在认证之后)。安全世界证书和非AP映像是不可执行映像的示例。
    • 安全或非安全图像。这指示图像是在安全存储器还是非安全存储器中验证/执行的。
    • 图像基地址和大小。
    • 图像入口点配置(entry_point_info_t)。
    • FWU图像状态。
  • BL1使用FWU图像描述符:

    • 验证FWU SMC的参数
    • 管理FWU进程的状态
    • 初始化下一个FWU映像的执行状态。

FWU状态机

BL1在FWU执行期间保持每个FWU图像的状态。处于较低异常级别的FWU图像使SMC调用BL1中的FWU功能,这导致BL1更新其FWU图像状态。BL1图像状态和有效状态转换如下图所示。请注意,与非安全映像相比,安全映像具有更复杂的状态机。

在这里插入图片描述
以下是支持状态的简要描述:

  • 重置:这是FWU开始时每个图像的初始状态。身份验证失败也会导致此状态。如果安全映像已完成执行,则它可能会屈服于此状态。也可以使用FWU_SMC_IMAGE_RESET进行访问。
  • 复制:这是当BL1将其从非安全内存复制到安全内存时,安全映像的状态。
  • 复制:这是BL1完成将安全映像复制到安全内存时的安全映像状态。
  • 认证:这是BL1成功认证图像时的图像状态。
  • EXECUTED(已执行):这是BL1将执行控制传递给安全可执行映像时的状态。
  • 中断:这是安全的可执行映像在请求BL1恢复正常世界执行后的状态。

BL1 SMC接口

BL1_SMC_CALL_COUNT

Arguments:
    uint32_t function ID : 0x0

Return:
    uint32_t

此SMC返回BL1支持的SMC数量。

BL1_SMC_UID

Arguments:
    uint32_t function ID : 0x1

Return:
    UUID : 32 bits in each of w0-w3 (or r0-r3 for AArch32 callers)

此SMC返回BL1 SMC服务的128位通用唯一标识符。

BL1_SMC_VERSION

Argument:
    uint32_t function ID : 0x3

Return:
    uint32_t : Bits [31:16] Major Version
               Bits [15:0] Minor Version

此SMC返回BL1 SMC服务的当前版本。

BL1_SMC_RUN_IMAGE

Arguments:
    uint32_t           function ID : 0x4
    entry_point_info_t *ep_info

Return:
    void

Pre-conditions:
    if (normal world caller) synchronous exception
    if (ep_info not EL3) synchronous exception

该SMC将执行控制传递给由提供的entry_point_info_t结构描述的EL3图像。在正常的TF-A引导流中,BL2调用此SMC以使BL1将执行控制传递给BL31。

FWU_SMC_IMAGE_COPY

Arguments:
    uint32_t     function ID : 0x10
    unsigned int image_id
    uintptr_t    image_addr
    unsigned int block_size
    unsigned int image_size

Return:
    int : 0 (Success)
        : -ENOMEM
        : -EPERM

Pre-conditions:
    if (image_id is invalid) return -EPERM
    if (image_id is non-secure image) return -EPERM
    if (image_id state is not (RESET or COPYING)) return -EPERM
    if (secure world caller) return -EPERM
    if (image_addr + block_size overflows) return -ENOMEM
    if (image destination address + image_size overflows) return -ENOMEM
    if (source block is in secure memory) return -ENOMEM
    if (source block is not mapped into BL1) return -ENOMEM
    if (image_size > free secure memory) return -ENOMEM
    if (image overlaps another image) return -EPERM

该SMC将由image_id指示的安全图像从非安全存储器复制到安全存储器,以用于稍后的认证。可以在单个块或多个块中复制图像。在任何一种情况下,当第一次为每个图像调用此SMC时,必须以image_size提供图像的总大小;在对同一图像的后续调用(如果有的话)中忽略它。

image_addr和block_size指定要从中复制的源内存块。目标地址由平台代码提供。

如果block_size大于此图像要复制的剩余字节数,则前者将被截断为后者。然后,复制操作被视为完成,FWU状态机转换到“COPIED”状态。如果还有更多要复制,FWU状态机将保持或转换到COPYING状态(取决于先前的状态)。
当使用多个块时,源块不一定需要在连续内存中。

一旦SMC被处理,BL1就会从异常返回到正常世界调用者。

FWU_SMC_IMAGE_AUTH

Arguments:
    uint32_t     function ID : 0x11
    unsigned int image_id
    uintptr_t    image_addr
    unsigned int image_size

Return:
    int : 0 (Success)
        : -ENOMEM
        : -EPERM
        : -EAUTH

Pre-conditions:
    if (image_id is invalid) return -EPERM
    if (secure world caller)
        if (image_id state is not RESET) return -EPERM
        if (image_addr/image_size is not mapped into BL1) return -ENOMEM
    else // normal world caller
        if (image_id is secure image)
            if (image_id state is not COPIED) return -EPERM
        else // image_id is non-secure image
            if (image_id state is not RESET) return -EPERM
            if (image_addr/image_size is in secure memory) return -ENOMEM
            if (image_addr/image_size not mapped into BL1) return -ENOMEM

此SMC验证image_id指定的图像。如果图像处于RESET状态,BL1将使用提供的image_addr和image_size在适当位置验证图像。如果图像是处于COPIED状态的安全图像,则BL1从BL1先前将图像复制到的安全存储器中认证图像。

BL1从异常返回给调用者。如果认证成功,则BL1将图像状态设置为AUTHENTICATED。如果验证失败,则BL1返回-EAUTH错误并将图像状态设置回RESET。

FWU_SMC_IMAGE_EXECUTE

Arguments:
    uint32_t     function ID : 0x12
    unsigned int image_id

Return:
    int : 0 (Success)
        : -EPERM

Pre-conditions:
    if (image_id is invalid) return -EPERM
    if (secure world caller) return -EPERM
    if (image_id is non-secure image) return -EPERM
    if (image_id is non-executable image) return -EPERM
    if (image_id state is not AUTHENTICATED) return -EPERM

该SMC在另一个安全世界中向调用方启动由image_id指定的先前认证的图像的执行。当前实现仅支持普通世界调用方启动安全世界映像的执行。

BL1保存普通世界调用者的上下文,将安全映像状态设置为EXECUTED,并从异常返回到安全映像。

FWU_SMC_IMAGE_RESUME

Arguments:
    uint32_t   function ID : 0x13
    register_t image_param

Return:
    register_t : image_param (Success)
               : -EPERM

Pre-conditions:
    if (normal world caller and no INTERRUPTED secure image) return -EPERM

当安全映像处于EXECUTED/INTERRUPTED状态时,此SMC在其他安全世界中恢复执行。

对于普通世界调用方,BL1将先前中断的安全映像状态设置为EXECUTED。对于安全世界调用方,BL1将先前执行的安全映像状态设置为INTERRUPTED。无论哪种情况,BL1都会保存调用世界的上下文,恢复恢复世界的上下文并从异常返回到恢复世界。如果调用成功,则将调用者提供的image_param返回到恢复的世界,否则将向调用者返回错误代码。

FWU_SMC_SEC_IMAGE_DONE

Arguments:
    uint32_t function ID : 0x14

Return:
    int : 0 (Success)
        : -EPERM

Pre-conditions:
    if (normal world caller) return -EPERM

该SMC指示先前执行的安全映像的完成。
BL1将先前执行的安全映像状态设置为RESET状态,恢复正常世界上下文并从异常返回到正常世界。

FWU_SMC_UPDATE_DONE

Arguments:
    uint32_t   function ID : 0x15
    register_t client_cookie

Return:
    N/A

此SMC完成固件更新过程。BL1调用特定于平台的函数BL1_plat_fwu_done,将可选参数client_cookie作为void*传递。SMC不返回。

FWU_SMC_IMAGE_RESET

Arguments:
    uint32_t     function ID : 0x16
    unsigned int image_id

Return:
    int : 0 (Success)
        : -EPERM

Pre-conditions:
    if (secure world caller) return -EPERM
    if (image in EXECUTED) return -EPERM

此SMC将图像的状态设置为RESET,并将其使用的内存归零。

这仅在未执行图像时才允许。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/13881.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]java毕业设计课程作业管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

vtk拾取器-vtkAbstractPicker/vtkCellPicker

创建了VTK社区,欢迎大家加入雪易社区-CSDN社区云 简介:此文主要介绍vtk中的拾取器的用法,若能为各位小伙伴解决一些困扰就更好了。非常欢迎各位小伙伴指正并补充。 1. vtkAbstractPicker vtkAbstractPicker是vtk拾取器的基类,为…

2022下半年《软考-系统架构设计师》备考经验分享

前言 我参加了2022年11月份的《软考-系统架构设计师》考试,在一个多月的备考之中我总结了一些学习经验和答题技巧,现毫无保留的分享给大家,希望对报考的同学们有所帮助。彩蛋:关注我的公众号【劼哥舍】,回复“软考”即…

dubbo:docker安装dubbo-admin

0.引言 我们在搭建dubbo框架时,需要安装一个dubbo-admin来管理服务已经配置文件,今天我们来看看如何通过docker快速搭建一个dobbo-admin 1. 安装 1、首先到dockerhub上搜索dubbo-admin的镜像源 2、可以看到两个引用较高的镜像源,第一个是a…

SpringCloud和SpringBoot在调Feign传文件时的异常汇总及解决办法

主要记录SpringCloud在调Feign传文件时的问题: 1.(按注意点2改正即可) Current request is not a multipart request(按注意点2改正即可) 2.(按注意点3处理即可) The field files exceeds it…

Pytorch框架基础

目录 1-02张量的简介与创建 pytorch中的Tensor 张量的创建 1-03张量的操作 1. 拼接 2.张量的拼接与切分 3.张量索引 4.张量变换 1-02张量的简介与创建 张量是一个 ,它是标量,向量,矩阵的高维拓展 pytorch中的Tensor 在pytorch中的属…

【C++】C++基础知识(七)---指针

C基础知识(七)1. 指针的定义与使用2. 指针的内存3. 空指针和野指针4. const修饰指针5. 指针与数组6. 指针与函数7. 指针用于数组和函数的案例1. 指针的定义与使用 指针的作用: ------通过指针可以直接的访问变量的内存,内存编号一…

企业在线培训场景下讲师+ppt课件直播应用效果

阿酷TONY / 原创 / 2022-11-17 / 长沙 企业在线培训场景下讲师ppt课件直播应用效果 : 图 / 直播示意图 设备需求: 1. 现场布摄像头,用于采集讲师摄像头视频和音频数据; 2. PC电脑或笔记本电脑一台( 安装直播客户端&…

学会Python开发的第一步:写一个桌面小程序

前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 又到了学Python时刻~ 当使用桌面应用程序的时候,有没有那么一瞬间, 想学习一下桌面应用程序开发? 建议此次课程大家稍作了解不要浪费太多时间, 因为没有哪家公司会招聘…

科普系列:AUTOSAR与OSEK网络管理比较(下)

在上篇中我们分别在状态机和报文格式方面对OSEK和AUTOSAR网络管理进行了简单介绍,感兴趣的小伙伴请移步至文章《科普系列:AUTOSAR与OSEK网络管理比较(上)》。 三、OSEK与AUTOSAR网络管理特点对比 本篇就是本文的重点了&#xff…

华为机试 - 区间交集

目录 题目描述 输入描述 输出描述 用例 题目解析 算法源码 题目描述 给定一组闭区间,其中部分区间存在交集。 任意两个给定区间的交集,称为公共区间(如:[1,2],[2,3]的公共区间为[2,2],[3,5],[3,6]的公共区间为[3,5])。 公共区间之间…

Springboot普通类获取运行时环境,获取运行时容器,获取Bean,等等获取运行时一切参数总结大全

文章目录获取ApplicationContextApplicationContext有什么用获取ApplicationContext使用ApplicationContext获取EnvironmentEnvironment有什么用获取Environment使用Environment获取ApplicationContext ApplicationContext有什么用 ApplicationContext为应用程序提供配置的中…

供应点击化学PEG试剂Azide-PEG-Rhodamine B,叠氮聚乙二醇罗丹明

点击化学PEG试剂——叠氮-聚乙二醇-罗丹明,化学试剂其英文名为Azide-PEG-Rhodamine B,N3-PEG-RB,它所属分类为Azide PEG Fluorescent PEG。 peg试剂的分子量均可定制,有:5000、2000、1000、3400、10000、20000 。该试…

java计算机毕业设计ssm气象百事通系统-天气预报系统

项目介绍 本气象百事通系统是针对目前仓库的实际需求,从实际工作出发,对过去的天气系统存在的问题进行分析,完善用户的使用体会。采用计算机系统来管理信息,取代人工管理模式,查询便利,信息准确率高,节省了开支,提高了工作的效率。 本系统结合计算机系统的结构、概念、模型、原…

Matlab:设置日期和时间显示格式

Matlab:设置日期和时间显示格式单个日期和持续时间数组的格式datetime 显示格式duration 显示格式calendarDuration 显示格式默认 格式datetime单个日期和持续时间数组的格式 datetime、duration 和 calendarDuration 数组有一个 Format 属性,可控制每个…

【java篇】你真的了解“基本数据类型”吗?

目录 基本介绍: 整数类型 浮点类型 布尔类型和char类型 自动类型转换 数据类型转换必须满足如下规则: 基本介绍: Java是一门强类型语言,这就意味着必须为每一个变量声明一种类型。Java为我们提供了八种基本类…

基于Qlearning强化学习的机器人路线规划仿真

目录 1.算法概述 2.仿真效果预览 3.核心MATLAB代码预览 4.完整MATLAB程序 1.算法概述 假设我们的行为准则已经学习好了, 现在我们处于状态s1, 我在写作业, 我有两个行为 a1, a2, 分别是看电视和写作业, 根据我的经验, 在这种 s1 状态下, a2 写作业 带来的潜在奖励要比 a1 看…

C++ Reference: Standard C++ Library reference: Containers: deque: deque: assign

C官网参考链接&#xff1a;https://cplusplus.com/reference/deque/deque/assign/ 公有成员函数 <deque> std::deque::assign C98 范围 (1) template <class InputIterator> void assign (InputIterator first, InputIterator last); 填充 (2) void ass…

用户体验成为继MAU后,手机银行竞争分化的下一分水岭,易观千帆重磅发布手机银行APP用户体验GX评测

作为银行金融服务线上场景渗透的有效抓手&#xff0c;当前手机银行APP已经成为其触达用户的重要渠道。随着银行发力场景服务平台成为发展趋势&#xff0c;5G技术问世对金融服务场景端提出新要求&#xff0c;用户体验反馈成为银行线上场景化运营的重要一环。 手机银行APP作为银…

自定义node版本,实现node多版本控制

这是我在安装依赖时报的两个错&#xff0c;一个是关于Cant find Python的问题&#xff0c;一个是node版本过高的问题。我一开始解决这边的Python的问题&#xff0c;网上找了好几个方法&#xff0c;安装了Python&#xff0c;环境配置也配置了&#xff0c;但是还是在报这个错&…