镜像的验证

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

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. HDU 6046 - hash | 2017 Multi-University Training Contest 2

    思路来自题解和一些博客 最麻烦的是样例没啥用- - /* HDU 6046 - hash [ hash,鸽巢 ] | 2017 Multi-University Training Contest 2 ...

  2. 简单了解学习PHP(针对前端开发)

    1.服务器(服务器系统) 通常是指较强的计算能力能够同时服务多人的计算机 常见的服务器操作系统: 1.各个版本的Linux操作系统 2.乌班图.centos 3.mac  os(苹果) 4.windo ...

  3. PHP mysqli_ping() 函数

    定义和用法 mysqli_ping() 函数进行一个服务器连接,如果连接已断开则尝试重新连接. <?php // 假定数据库用户名:root,密码:123456,数据库:RUNOOB $con= ...

  4. 一 、Linux基础命令及使用帮助

    linux的哲学思想: 一切皆文件: 把几乎所有资源,包括硬件设备都组织为文件系统 由众多单一目的小程序组成:一个程序只实现一个功能,而且要做好 组合小程序完成复杂任务 尽量避免跟用户交互 目的:实现 ...

  5. FutureTask用法及解析

    1 FutureTask概念 FutureTask一个可取消的异步计算,FutureTask 实现了Future的基本方法,提空 start cancel 操作,可以查询计算是否已经完成,并且可以获取 ...

  6. 提交本地文件至gitlab已有的项目中(更新gitlab)

    gitlab代码更新 gitlab官网 1.安装git git官网 官网下载安装,安装过程一直next即可(路径自己选) 2.clone至本机 格式:git clone url(可转到指定目录克隆) ...

  7. QList和QVector等容器的区别

    QList和QVector等容器的区别. 1.大多数情况下可以用QList.像prepend()和insert()这种操作,通常QList比QVector快的多.这是因为QList是基于index标签 ...

  8. springboot多个数据源

    1.启动两个mysql,可以按照如下操作使用docker来部署mysql容器,比较简单 https://www.cnblogs.com/qq931399960/p/11527222.html 2.如果 ...

  9. java 日志文件打印

    java中的日志打印   java中的日志打印: 日志工具类:   log4j.properties解释: 1 1.输出级别的种类 2 ERROR.WARN.INFO.DEBUG 3 ERROR 为严 ...

  10. 使用Python爬取mobi格式电纸书

    最近做了个微信推送kindle电子书的公众号:kindle免费书库 不过目前电子书不算非常多,所以需要使用爬虫来获取足够书籍. 于是,写了以下这个爬虫,来爬取kindle114的电子书. 值得注意的地 ...