MCUboot 中的 BOOT_SWAP_TYPE_PERM 功能介绍
目录
概述
1 Image 数据结构
1.1 Image介绍
1.2 Swap info
2 BOOT_SWAP_TYPE_PERM 功能
2.1 功能定义
2.2 典型工作流程
3 BOOT_SWAP_TYPE_xx的其他功能
3.1 BOOT_SWAP_TYPE_REVERT
3.2 三中模式的比较
4 使用机制
4.1 实现细节
4.2 使用场景
4.3 开发者注意事项
概述
BOOT_SWAP_TYPE_PERM 是 MCUboot 引导加载程序中用于表示永久性固件交换的状态标志,是固件升级流程中的关键机制之一。本文主要介绍该参数以及与之相关参数的功能和使用方法。
1 Image 数据结构
1.1 Image介绍
为了使引导加载程序能够确定当前状态以及在当前引导操作期间应该采取什么操作,它使用存储在映像闪存区域中的元数据。在交换时,其中一些元数据被临时复制到scratch区或从scratch区复制出来。这个元数据位于Inage区域的末尾,称为Image trailer。其具体结构如下:
 0                   1                   2                   30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+~                                                               ~~    Swap status (BOOT_MAX_IMG_SECTORS * min-write-size * 3)    ~~                                                               ~+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|                 Encryption key 0 (16 octets) [*]              ||                                                               |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|                    0xff padding as needed                     ||  (BOOT_MAX_ALIGN minus 16 octets from Encryption key 0) [*]   |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|                 Encryption key 1 (16 octets) [*]              ||                                                               |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|                    0xff padding as needed                     ||  (BOOT_MAX_ALIGN minus 16 octets from Encryption key 1) [*]   |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|                      Swap size (4 octets)                     |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|                    0xff padding as needed                     ||        (BOOT_MAX_ALIGN minus 4 octets from Swap size)         |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|   Swap info   |  0xff padding (BOOT_MAX_ALIGN minus 1 octet)  |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|   Copy done   |  0xff padding (BOOT_MAX_ALIGN minus 1 octet)  |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|   Image OK    |  0xff padding (BOOT_MAX_ALIGN minus 1 octet)  |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|                    0xff padding as needed                     ||         (BOOT_MAX_ALIGN minus 16 octets from MAGIC)           |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|                       MAGIC (16 octets)                       ||                                                               |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+1.2 Swap info
交换信息:单个字节,编码以下信息:
交换类型:0 ~ 3位存储。指示正在进行的交换操作的类型。当MCUboot恢复被中断的交换时,它使用这个字段来确定要执行的操作类型。该字段包含下表中下列值之一。
图像号:存储在4-7位。它在单映像引导时总是0值。在多映像引导的情况下,它指示中断发生时交换了哪个映像。在所有图像交换操作期间使用相同的划痕区域。因此使用该字段
| Name | Value | 
|---|---|
| BOOT_SWAP_TYPE_TEST | 2 | 
| BOOT_SWAP_TYPE_PERM | 3 | 
| BOOT_SWAP_TYPE_REVERT | 4 | 
2 BOOT_SWAP_TYPE_PERM 功能
 
2.1 功能定义
BOOT_SWAP_TYPE_PERM 表示固件镜像已经完成永久性交换,具有以下特点:
永久性确认:新固件已通过测试验证并被确认为稳定版本
不可逆操作:一旦设置为 PERM 状态,通常无法简单回退
启动确定性:系统将始终从新固件启动
2.2 典型工作流程
初始状态:系统从原固件启动
测试阶段:
BOOT_SWAP_TYPE_TEST状态测试新固件
确认升级:测试通过后设置为
BOOT_SWAP_TYPE_PERM
永久生效:后续启动都使用新固件
3 BOOT_SWAP_TYPE_xx的其他功能
 
3.1  BOOT_SWAP_TYPE_REVERT 
 
BOOT_SWAP_TYPE_REVERT 是 MCUboot 引导加载程序中的一种交换类型状态,表示系统需要回退到之前的固件版本。这是固件升级安全机制的重要组成部分。
1)基本定义
BOOT_SWAP_TYPE_REVERT表示:
新固件测试失败或不符合运行要求
系统需要自动回退到之前的稳定版本
是一种保护机制,防止设备因不良固件而"变砖"
2) 典型触发场景
测试固件失败:在
BOOT_SWAP_TYPE_TEST状态下,新固件运行异常
确认失败:固件自检或看门狗超时等机制检测到问题
手动请求:通过特定命令请求回退操作
安全验证失败:镜像签名或完整性检查未通过
3) 工作流程
系统从测试固件(
TEST状态)启动
检测到需要回退的条件(如启动失败、运行异常等)
将交换类型标记为
REVERT
下次启动时,bootloader 执行回退操作
恢复使用之前的稳定固件
3.2 三中模式的比较
| 特性 | REVERT | TEST | PERM | 
|---|---|---|---|
| 目的 | 回退到旧固件 | 测试新固件 | 永久使用新固件 | 
| 持久性 | 临时操作 | 临时状态 | 永久状态 | 
| 触发条件 | 测试失败/系统异常 | 新固件写入 | 测试成功确认 | 
| 后续启动 | 使用原固件 | 可能转为PERM或REVERT | 始终使用新固件 | 
4 使用机制
4.1 实现细节
在 MCUboot 中,BOOT_SWAP_TYPE_PERM 的实现涉及:
镜像槽管理:通常用于 A/B 双分区系统
状态标志:存储在 flash 的固定区域
升级确认:通过特定命令或条件触发
安全验证:升级前会验证镜像签名和完整性
4.2 使用场景
正式固件发布后的永久升级
通过测试验证后的固件固化
需要确保设备始终使用新固件的场景
4.3 开发者注意事项
设置 PERM 状态前必须确保固件稳定
通常需要先经过 TEST 状态的验证
某些实现可能提供紧急恢复机制
需要考虑电源故障等异常情况
