镜像的验证

在执行设备固件更新之前,应验证新映像。 在传输实际固件(预验证)之前,可以检查某些信息(例如,兼容性)。 其他信息,例如图像的散列,应在传输(验证后)后进行验证。

Init packet

执行DFU时,必须提供包含固件映像的包(zip格式),init数据包和指示包格式的清单文件。 init数据包包含有关用于验证映像的固件映像的信息,必须对其进行签名以确保更新来自受信任的源。

init数据包的所需内容在协议缓冲文件dfu-cc.proto中定义。 在验证init数据包期间,将检查init数据包的以下字段:

验证
验证映像包括检查以验证映像是否来自可信来源,以及它是否与设备以及当前固件和硬件兼容。 如果在init数据包中设置了标志is_debug,则示例的调试版本会跳过版本验证。

这些检查在验证模块中实现。 验证按以下顺序进行:

  1. 签名,签名。
  2. 为了能够验证签名,验证代码需要与用于签署init数据包的私钥对应的公钥。
  3. 该密钥位于文件dfu_public_key.c中。
  4. 固件类型,fw_type。 可以使用NRF_DFU_APP_DOWNGRADE_PREVENTION配置启用/禁用版本检查。
  5. 硬件版本,hw_version。
  6. SoftDevice版本,sd_req。
  7. 固件版本,fw_version。
  8. 固件大小以查看更新是否合适。 双库和单库更新显示安全DFU引导加载程序的内存布局,指示将接受哪些大小。

版本号
版本号有三种类型:

  • 硬件版本:硬件版本由设备决定。 在示例实现中,设备的硬件由sdk_config文件中的NRF_DFU_HW_VERSION宏指定。 对于nRF52系列,默认版本号定义为52.但是,您不应在产品中使用此默认版本号,而是使用您自己的版本编号方案。
  • SoftDevice固件ID:SoftDevice固件ID存储在SoftDevice HEX文件中,并通过宏SD_FWID_GET检索。
  • 固件版本:固件版本是指引导加载程序版本或应用程序版本,具体取决于传输的映像。 当前版本号存储在引导加载程序设置页面中。 可以从全局变量s_dfu_settings中检索应用程序版本(nrf_dfu_settings_t :: app_version)和引导加载程序版本(nrf_dfu_settings_t :: bootloader_version)。

note:请注意,编程引导加载程序映像时,版本号将被擦除并进行零初始化。 因此,在首次对引导加载程序进行编程之后,必须使用当前版本号生成引导加载程序设置页面。 有关详细信息,请参阅“Bootloader设置”页面和nrfutil文档。

版本的验收规则:

除非跳过版本验证,否则dfu_handle_prevalidate()函数将应用以下接受规则来确定是否接受图像:

  • 硬件版本:如果init数据包中指定的硬件版本与设备的硬件匹配,则接受该映像。
  • SoftDevice固件ID:如果其中一个指定的固件ID与当前SoftDevice的ID匹配,则接受该图像。 sd_req列表中的固件ID为0x00表示“更新不依赖于SoftDevice”。有关此问题的含义,请参见没有软件设备的更新部分。
  • 固件版本:如果映像包含引导加载程序,则如果新固件版本大于(>)现有版本的引导加载程序,则接受映像。如果图像包含应用程序,则如果新固件版本大于或等于(> =)现有版本的应用程序,则接受该图像。如果映像包含SoftDevice并且不存在SoftDevice,则会根据现有应用程序的版本检查fw_version,以确定更新是否可以覆盖它。

Dual-bank and single-bank updates

为了安全地执行设备固件更新,新的固件映像不会被复制到内存中的最终位置,直到它被验证为止。 这可确保仅激活完整且有效的图像。 如果在传输过程中发生错误,则不会更新固件并且旧固件仍可用。

将接收到的固件存储在空闲存储器中然后在激活期间将其复制到预期存储位置的过程称为双库更新。 双库更新是更新固件的首选方法,因为在验证和激活新固件之前,将保留当前应用程序。

只有当前应用程序的末尾与应用程序数据的开头之间有足够的可用空间才能存储新的固件映像时,才能进行双库更新。 如果新固件映像大于可用空间,则必须在单个库更新中传输。 在此过程中,固件映像将覆盖现有应用程序。 如果在单库更新期间发生错误,则设备上不会保留有效的应用程序。 在这种情况下,设备在引导加载程序中保持DFU模式,并且可以重试固件更新过程。

如果设置了NRF_DFU_SINGLE_BANK_APP_UPDATES,则首选单库更新。 否则,所有固件更新都将作为双库更新执行。 但是,如果新映像(SoftDevice,SoftDevice和引导加载程序或应用程序)大于可用空间,则删除应用程序以为固件映像腾出空间,并执行单组更新。

出于安全原因,您可以在DFU配置中禁用单组更新(请参阅NRF_DFU_FORCE_DUAL_BANK_APP_UPDATES)。 但是,禁用单个存储区更新将限制可以更新到应用程序和保留的应用程序数据之间的空闲页面的大小。 此可用空间可能不足以组合更新SoftDevice和引导加载程序。

Dual-bank updates

在双库更新期间,将保留现有应用程序,直到激活新固件映像。 如果固件更新过程失败,您仍可以重新启动设备以启动现有应用程序。

SoftDevice末尾和应用程序数据开头之间的内存区域分为两个库。 Bank 0保存现有应用程序,bank 1用于存储接收到的图像。


SoftDevice和bootloader

下图显示了Bootloader和SoftDevice的组合映像的DFU过程。 如果传输的映像仅包含SoftDevice或仅包含引导加载程序,则一般过程相同,但仅替换SoftDevice或引导加载程序。

传输的图像存储在空闲存储区中。 可保留现有的申请数据; 有关更多信息,请参阅保留应用程序数据 验证后,将复制新的SoftDevice和新的引导加载程序以替换现有固件。 在此过程中会保留应用程序,但由于SoftDevice中的API更改,或者因为新的SoftDevice具有与现有软件不同的大小,因此它可能无效。

应用
在双库更新中更新应用程序时,将保留现有应用程序。

原始应用程序位于存储库0中。传送的图像存储在存储库1中。在接收到新的应用程序图像之后,旧的和新的应用程序都存在。 这可确保在无法激活新应用程序时可以回退到旧应用程序。 如果可以激活新应用程序,则将其从库1复制到库0.可以保留现有应用程序数据; 有关更多信息,请参阅保留应用程序数据

nRF5 SDK Bootloader and DFU moudles(2)的更多相关文章

  1. nRF5 SDK Bootloader and DFU moudles(1)

    在嵌入式操作系统中,BootLoader是在操作系统内核运行之前运行.可以初始化硬件设备.建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态,以便为最终调用操作系统内核准备好正确的环境. 在嵌 ...

  2. nRF5 SDK Bootloader and DFU moudles(3)

    DFU控制点特性用于控制DFU过程的状态. 通过写入该特征来请求所有DFU程序. 标记过程结束的响应将作为通知收到. BLE传输 Transfer of an init packet DFU控制器首先 ...

  3. nRF5 SDK for Mesh(三) Installing the mesh toolchain 安装编译工具链

    Installing the mesh toolchain To build the example applications, a toolchain based on either CMake o ...

  4. nRF5 SDK for Mesh(二) Getting started 快速开始

    Getting started To get started, take a look at the Light switch demo. It shows how a simple applicat ...

  5. nRF5 SDK软件架构及softdevice工作原理

    本文将介绍Nordic nRF5 SDK软件架构以及softdevice工作原理,以加深大家对Nordic产品开发的理解,这样开发过程中碰到问题时,大家也知道如何去调试. 如果你刚开始接触nRF5 S ...

  6. Nordic nRF5 SDK和softdevice介绍

    SDK和Softdevice的区别是什么?怎么选择SDK和softdevice版本?芯片,SDK和softdevice有没有版本兼容问题?怎么理解SDK目录结构?SDK帮助文档在哪里?Softdevi ...

  7. nRF5 SDK for Mesh(四) 源码编译

    官方文档教程编译源码: http://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.sdk%2Fdita%2Fs ...

  8. nRF5 SDK for Mesh(一) 介绍和下载源码

    一: 官网介绍地址:http://www.nordicsemi.com/Products/Bluetooth-low-energy/nRF5-SDK-for-Mesh Nordic offers a ...

  9. 如何调试nRF5 SDK

    本文将讲述Nordic nRF5 SDK的主要调试手段,以帮助大家快速定位问题,并解决问题.一般来说,你可以通过打log方式,IDE的debug模式,SDK自带的app_error_check函数,以 ...

随机推荐

  1. Unrecognized SSL message, plaintext connection? 将https 换为http 即可

    请求链接:https://59********* 升级后的项目地址有https换为了http  ,出现这个错误,改为http请求即可

  2. HDU 6059 - Kanade's trio | 2017 Multi-University Training Contest 3

    思路来自题解(看着题解和标程瞎吉尔比划了半天) /* HDU 6059 - Kanade's trio [ 字典树 ]  |  2017 Multi-University Training Conte ...

  3. Javascritp 数据结构和二叉树算法

    1,所有圆圈都是一个节点,里面的数字就是节点的值.8上面没有父节点,那么8就是根节点,而4,7,13没有子节点了,称之为叶子结点.其他的称之为:中间结点. 2,8节点是3和10的父节点,3是8的左孩子 ...

  4. Spring Security 自定义 登陆 权限验证

    转载于:https://www.jianshu.com/p/6b8fb59b614b 项目简介 基于Spring Cloud 的项目,Spring Cloud是在Spring Boot上搭建的所以按照 ...

  5. python计算余弦复杂度

    import numpy as np from sklearn.metrics.pairwise import cosine_similarity a = np.array([1, 2, 3, 4]) ...

  6. IntelliJ IDEA 运行项目的时候提示 Command line is too long 错误

    在 IntelliJ IDEA 项目运行的时候收到了下面的错误提示: Error running 'Application': Command line is too long. Shorten co ...

  7. 小米oj 找小"3"(数位dp)

     找小"3" 序号:#40难度:困难时间限制:1000ms内存限制:10M 描述 给定一个奇数n,可得到一个由从1到n的所有奇数所组成的数列,求这一数列中数字3所出现的总次数.例如 ...

  8. 下载eclipse 配置eclipse 新建Java项目 写一个小程序 运行

    为了更好的学习java,我打算下载个eclipse 地址:https://www.eclipse.org/downloads/packages/ 我们需要下载的版本是Eclipse IDE for J ...

  9. Windows下安装Elasticsearch6.4.1和Head,IK分词器

    所需运行环境 1.安装jdk1.8(步骤略) 2.安装git(步骤略)3.安装nodejs(步骤略) 一.ElasticSearch的安装 下载elasticsearch6.4.1,将下载后的es解压 ...

  10. Netfilter 之 五个钩子点

    概述 在协议栈的三层IPv4(IPv6还没看,不清楚)数据包的处理过程中,可能经过Netfilter的五个钩子点,分别为NF_INET_PRE_ROUTING.NF_INET_LOCAL_IN.NF_ ...