当前位置: 首页 > ai >正文

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值。在多映像引导的情况下,它指示中断发生时交换了哪个映像。在所有图像交换操作期间使用相同的划痕区域。因此使用该字段

NameValue
BOOT_SWAP_TYPE_TEST2
BOOT_SWAP_TYPE_PERM3
BOOT_SWAP_TYPE_REVERT4

BOOT_SWAP_TYPE_PERM 功能

2.1 功能定义

BOOT_SWAP_TYPE_PERM 表示固件镜像已经完成永久性交换,具有以下特点:

  • 永久性确认:新固件已通过测试验证并被确认为稳定版本

  • 不可逆操作:一旦设置为 PERM 状态,通常无法简单回退

  • 启动确定性:系统将始终从新固件启动

2.2 典型工作流程

  1. 初始状态:系统从原固件启动

  2. 测试阶段:BOOT_SWAP_TYPE_TEST 状态测试新固件

  3. 确认升级:测试通过后设置为 BOOT_SWAP_TYPE_PERM

  4. 永久生效:后续启动都使用新固件

BOOT_SWAP_TYPE_xx的其他功能

3.1  BOOT_SWAP_TYPE_REVERT 

BOOT_SWAP_TYPE_REVERT 是 MCUboot 引导加载程序中的一种交换类型状态,表示系统需要回退到之前的固件版本。这是固件升级安全机制的重要组成部分。

1)基本定义

BOOT_SWAP_TYPE_REVERT 表示:

  • 新固件测试失败或不符合运行要求

  • 系统需要自动回退到之前的稳定版本

  • 是一种保护机制,防止设备因不良固件而"变砖"

2) 典型触发场景

  1. 测试固件失败:在 BOOT_SWAP_TYPE_TEST 状态下,新固件运行异常

  2. 确认失败:固件自检或看门狗超时等机制检测到问题

  3. 手动请求:通过特定命令请求回退操作

  4. 安全验证失败:镜像签名或完整性检查未通过

3) 工作流程

  1. 系统从测试固件(TEST状态)启动

  2. 检测到需要回退的条件(如启动失败、运行异常等)

  3. 将交换类型标记为 REVERT

  4. 下次启动时,bootloader 执行回退操作

  5. 恢复使用之前的稳定固件

3.2 三中模式的比较

特性REVERTTESTPERM
目的回退到旧固件测试新固件永久使用新固件
持久性临时操作临时状态永久状态
触发条件测试失败/系统异常新固件写入测试成功确认
后续启动使用原固件可能转为PERM或REVERT始终使用新固件

4 使用机制

4.1 实现细节

在 MCUboot 中,BOOT_SWAP_TYPE_PERM 的实现涉及:

  1. 镜像槽管理:通常用于 A/B 双分区系统

  2. 状态标志:存储在 flash 的固定区域

  3. 升级确认:通过特定命令或条件触发

  4. 安全验证:升级前会验证镜像签名和完整性 

4.2 使用场景

  1. 正式固件发布后的永久升级

  2. 通过测试验证后的固件固化

  3. 需要确保设备始终使用新固件的场景

4.3 开发者注意事项

  1. 设置 PERM 状态前必须确保固件稳定

  2. 通常需要先经过 TEST 状态的验证

  3. 某些实现可能提供紧急恢复机制

  4. 需要考虑电源故障等异常情况

 

http://www.xdnf.cn/news/3947.html

相关文章:

  • (undone) MIT6.S081 2023 学习笔记 (Day11: LAB10 mmap)
  • Redis数据结构ZipList,QuickList,SkipList
  • 《数字图像处理(面向新工科的电工电子信息基础课程系列教材)》封面颜色空间一图的选图历程
  • 电磁气动 V 型球阀:颗粒状矿浆与煤黑水介质处理的革命性解决方案-耀圣
  • GAF-CNN-SSA-LSSVM故障诊断/分类预测,附带模型研究报告(Matlab)
  • 学习海康VisionMaster之亮度测量
  • 图像批量处理工具 界面直观易懂
  • TCP 与 UDP报文
  • Doo全自动手机壳定制系统
  • 【AI大模型学习路线】第一阶段之大模型开发基础——第四章(提示工程技术-1)Zero-shot与Few-shot。
  • 基于 jQuery 实现灵活可配置的输入框验证功能
  • 模型 - Xiaomi MiMo
  • Sui 上线两周年,掀起增长「海啸」
  • 【PostgreSQL数据分析实战:从数据清洗到可视化全流程】5.3 相关性分析(PEARSON/SPEARMAN相关系数)
  • MongoDB入门详解
  • 永磁同步电机控制算法--基于PI和前馈的位置伺服控制
  • C 语言 第五章 指针(7)
  • LLM提示词设计及多轮对话优化策略在心理健康咨询场景中的应用研究
  • 从零开始学习RAG
  • Jetpack Compose 响应式布局实战:BoxWithConstraints 完全指南
  • 从0到1快速了解Redis数据库
  • 数字化转型:激活存量,引爆增量的三大核心逻辑
  • Spring-使用Java的方式配置Spring
  • 基于Python+MongoDB猫眼电影 Top100 数据爬取与存储
  • 常用CPU、GPU、NPU、DSP、ASIC等芯片区别介绍
  • RGB三原色
  • MATLAB仿真定点数转浮点数(对比VIVADO定点转浮点)
  • 【AI论文】像素修补师(PixelHacker):具有结构和语义一致性的图像修复(Image Inpainting)
  • 【PostgreSQL数据分析实战:从数据清洗到可视化全流程】5.2 数据分组与透视(CUBE/ROLLUP/GROUPING SETS)
  • 三十二、命名实体识别概述