专栏首页QB杂货铺swupdate 之 readback handler

swupdate 之 readback handler

背景

使用 swupdate 作为 OTA 方案 ,有项目要求在写入数据到分区之后需要再次读出校验。

初步实现:readout-verify attribute

初步分析有两种方式

  • 方案一

在每一笔数据写入后,立刻读出校验。此时原始数据还在 buffer 中,读出的数据直接跟原始 buffer 做比较即可

  • 方案二

在将分区数据完全写入后,再读出校验。

注意在流式升级的情况下,源数据是分片传输写入的,用完即弃,因此写完整个分区之后已经没有原始数据可以比较了。

此时要么重新从数据源获取(不可取,相当于下载两次 OTA 包),要么需要在 OTA 包中额外配置好校验值,对读出数据计算得到的校验值进行比较。

出于简单考虑,选择了方案一进行实现,为 image 增加了一个 readout-verify 属性,配置后在每笔数据写入后均会读出校验,校验的方式是直接跟源 buffer 比较。

功能很简单,但由于源码中并未考虑这种情况,因此用于校验的 buffer 无法传递,只能反复申请和释放,问题不大只是看着有点别扭。

尝试把 patch 发出来,想听听作者的意见,结果作者回复已经有一个 readback handler 用于支持读出分区数据进行校验了。

社区实现: readback handler

这个 reabback handler 采用 scripts 的形式,在所有 image 写入完成后,再对 image 进行读出校验,sha256 校验值需要在 sw-description 中预先配置好。

举个例子:

scripts: (
{
    device = "/dev/mmcblk2p1";
    type = "readback";
    properties: {
        sha256 = "e7afc9bd98afd4eb7d8325196d21f1ecc0c8864d6342bfc6b6b6c84eac86eb42";
        size = "184728576";
        offset = "0";
    };
}
);

功能顾名思义,就是读出指定 device 的指定范围的数据,算出 sha256 值,验证与配置中的 sha256 值是否一致。

具体的配置描述如下表。

字段

类型

描述

device

string

要校验的分区节点

type

string

标注handler

sha256

string

分区的sha256值

size

string

要校验的数据大小(单位:字节)。如果未设置或设置为0,则会自动获取分区大小

offset

string

要校验的数据偏移(单位:字节)。如果未设置,默认为0

总结

稍微比较下两种实现(以下列出的缺点是相对另一个而言,所以优点就不赘述了)

readback handler 的缺点在于

  1. 实现较为复杂,使用也较为复杂,需要配置sha256 (当然一般是通过脚本自动化生成)
  2. 先完全写入再校验,即出问题时不会立刻报错保留现场,而是在所有 image 均写入完成后,才进行校验
  3. 对某些定制不方便实现,例如要求在出错时重试该笔数据的写入

readout-verify attribute 的缺点在于

  1. 在某些情况下不适用,例如配合ubi handler,配合rdiff handler
  2. 只能保证该笔数据写入正确,无法保证完整数据未被篡改。例如写入 A 数据后读出校验成功,再写入 B 时影响到了 A,则无法被检测到

综上,优先选择社区默认的 readback handler,实在有无法满足的定制化需求时,再考虑自行实现特殊属性和行为。

blog: https://www.cnblogs.com/zqb-all/p/12827506.html 公众号:https://sourl.cn/T4Skam

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • linux下检测可用串口并使用minicom打开

    目前使用minicom作为串口软件。但使用过程中,有一点感觉不方便的地方,就是我需要使用多个串口,当使用的不是串口0时,就要手动修改minicom的配置。

    zqb_all
  • guake 3.4发布,支持切分窗口

    近日发布了3.4版本,在3.4版本中支持了切分窗口功能。如图所示,还是比较实用的一个功能。

    zqb_all
  • 嵌入式linux下如何尽快播放开机音乐

    最开始的启动流程是这样的,bootloader 启动kernel,kernel跑完挂载文件系统,

    zqb_all
  • 使用spring validation完成数据后端校验

    前言 数据的校验是交互式网站一个不可或缺的功能,前端的js校验可以涵盖大部分的校验职责,如用户名唯一性,生日格式,邮箱格式校验等等常用的校验。但是为了避免用户...

    kirito-moe
  • 浏览器原理学习笔记04—浏览器中的页面事件循环系统

    每个渲染进程都有一个非常繁忙的主线程,需要一个系统来统筹调度任务(具体任务后面详解)

    CS逍遥剑仙
  • SLAM后端:非线性优化

     我们要求其最小值,当然是对目标函数进行求导,但通常目标函数是非线性的,因此我们需要通过以下步骤对目标函数进行求解:

    猫叔Rex
  • yum更换国内源,yum下载rpm包和源码包的安装

    叶瑾
  • 9.按键之使用异步通知(详解)

    之前学的应用层都是: 1)查询方式:一直读 2)中断方式.同样一直读,直到中断进程唤醒 3)poll机制:一直在poll函数中睡眠,一定时间读一次 以上3种,我...

    张诺谦
  • Excel数据分析案例:正态分布运用实例

    正态分布,是统计学中最重要的分布之一,它是由两个参数:均值和方差决定的。在excel中可以用NORMDIST和NORMSDIST两个函数来计算给定的均值和标准差...

    沉默的白面书生
  • css基础教程之边框背景

    1.border:<line-width> || <line-style> || <color>

    老雷PHP全栈开发

扫码关注云+社区

领取腾讯云代金券