OTA升级的实现原理

2023-05-16

一、简介

1.1  概念

OTA:Over-the-Air Technology,即空中下载技术。

OTA升级:通过OTA方式实现固件或软件的升级。

只要是通过无线通信方式实现升级的,都可以叫OTA升级,比如网络/蓝牙。

通过有线方式进行升级,叫本地升级,比如通过UART,USB或者SPI通信接口来升级设备固件。

1.2  优点

1.通过OTA方式,可以对分布在各地的设备进行软件升级,而不必让运维人员各地奔波。

2.物联网平台支持通过OTA方式进行设备固件升级,是智能设备修复系统漏洞、实现系统升级的手段。

3.在迅速变化和发展的物联网市场,新的产品需求不断涌现,因此对于智能硬件设备的更新需求就变得空前高涨,设备不再像传统设备一样一经出售就不再变更。通过固件升级用户提供更好的服务。

1.3  实现原理

核心流程:

1.制作升级包

2.下载升级包

3.验签升级包

4.更新程序

下载方式:

不管采用OTA方式还是有线通信方式升级,下载升级包的方式包括后台式下载和非后台式下载两种模式。

后台式下载:

在升级的时候,新固件在后台悄悄下载,即新固件下载属于应用程序功能的一部分,在新固件下载过程中,应用可以正常使用,也就是说整个下载过程对用户来说是无感的,下载完成后,系统再跳到BootLoader程序,由BootLoader完成新固件覆盖老固件的操作。比如智能手机升级Android或者iOS系统都是采用后台式方式,新系统下载过程中,手机可以正常使用。

非后台式下载:

在升级的时候,系统需要先从应用程序跳入到BootLoader程序,由BootLoader进行新固件下载工作,下载完成后BootLoader继续完成新固件覆盖老固件的操作,至此升级结束。早先的功能机就是采用非后台来升级操作系统的,即用户需要先长按某些按键进入bootloader模式,然后再进行升级,整个升级过程中手机正常功能都无法使用。

新旧固件覆盖模式:

新固件替换老固件覆盖的两种方式:双区模式和单区模式。

双区模式:

双区模式中老固件和新固件在flash中各占一块bank(存储区)。假设老固件放在bank0(运行区)中,新固件放在bank1(下载区)中,升级的时候,应用程序先把新固件下载到bank1中,只有当新固件下载完成并校验成功后,系统才会跳入BootLoader程序,然后擦除老固件所在的bank0区,并把bank1的新固件拷贝到bank0中。

后台式下载必须采用双区模式进行升级。

优点:升级过程中出现问题或者新固件有问题,它还可以选择之前的老固件老系统继续执行而不受其影响。

缺点:多占用flash空间的一个存储区,在系统资源比较紧张的时候较为困难。

单区模式:

单区模式的非后台式下载只有一个bank0(运行区),老固件和新固件共享这一个bank0。升级的时候,进入bootloader程序后先擦除老固件,然后直接把新固件下载到同一个bank中,下载完成后校验新固件的有效性,新固件有效升级完成,否则要求重来。

优点:

跟双区模式相比,单区模式节省了Flash空间的一个bank,在系统资源比较紧张的时候,单区模式是一个不错的选择。

缺点:

如果升级过程中出现问题或者新固件有问题,单区模式碰到这种情况就只能一直待在bootloader中,然后等待再次升级尝试,此时设备的正常功能已无法使用,从用户使用这个角度来说,可以说此时设备已经“变砖”了。

相比较,双区模式虽然牺牲了很多存储空间,但是换来了更好的升级体验。

二、MCU OTA升级

以MCU(微控制器)固件升级为例,讲解嵌入式裸机程序的OTA升级。由于裸机固件是固化在设备的存储器(如flash)中,即存储器中保存的是机器码,对MCU进行OTA固件升级,也就是要实现通过OTA方式将存储器中旧固件的机器码替换为新固件的机器码。

数字签名

签名:

A给B发送消息,A先计算出消息的消息摘要,然后使用自己的私钥加密消息摘要,被加密的消息摘要就是签名。

验签:

B收到消息后,也会使用和A相同的方法计算消息摘要,然后用A的公钥解密签名,并与自己计算出来的消息

摘要进行比较,如果相同则说明消息是A发送给B的,同时,A也无法否认自己发送消息给B的事实。

(B使用A的公钥解密签名文件的过程,叫做"验签")

密码学基础概念:

1.什么是消息摘要?

2.什么是非对称加解密?私钥与公钥?

3.什么是数字签名?

数字签名的作用:

保证数据完整性,机密性和发送方角色的不可抵赖性。

消息摘要函数:

MD4、MD5、SHA-1、SHA-256、SHA-384、SHA-512

数字签名算法:

RSA、Rabin方式、ElGamal方式、DSA

2.1  制作升级包

通过签名工具使用签名算法对固件进行数字签名,签名后的文件即为升级包。

升级包的内容一般包括firmware、header和signature value。

Firmware:固件

Header:头部信息。存放配置信息,如版本号、产品类型等。

Signature value:签名值。对firmware和header签名后的值。

签名工具:

上位机软件,能计算固件的签名值,并将固件打包为升级包的格式。

固件签名:

上位机软件先计算整个固件的消息摘要,使用非对称密码的私钥对摘要进行加密,

被加密后的消息摘要数据就是签名值。

固件签名的意义:

计算hash值可以识别固件是否被篡改和伪装,确保固件的完整性。

使用非对称秘钥签名方便后续验证升级包身份的合法性。

2.2  下载升级包

根据上位机软件和MCU设备约定的通信协议,上位机软件将升级包通过OTA方式发送给MCU设备,

MCU设备收到数据后,根据通信协议解析出升级包的数据,并将升级包的数据保存到存储器中。

通信协议的作用:

通讯双方约定俗成地用于数据交流的格式。

下载的方式:

1.在应用程序中下载:后台式

2.在BootLoader中下载:非后台式

2.3  验签升级包

MCU设备接收完所有的升级包后,先计算升级包中固件的摘要,然后使用非对称秘钥的

公钥解密升级包的签名值,如果解密出来的固件摘要与自己计算的摘要相同,则验签成功。

2.4  更新固件

验签成功保证了固件的完整性和合法性后,MCU设备从应用程序进入BootLoader程序,

在BootLoader程序中将flash中的新固件数据搬运到旧固件的存储区,将其覆盖。

然后BootLoader程序启动固件运行,此时固件为新固件。

flash固件数据更新:

擦除flash,写flash。

三、Linux OTA升级

Linux系统的组成:

主要由三大部分组成,包括uboot(引导启动程序)、kernel(内核)和rootfs(根文件系统)。

三者在flash中的分区如下:

应用程序存放于rootfs。

Linux系统的启动流程:

3.1  系统升级

Linux系统由uboot\kernel\rootfs三大部分组成,对Linux系统进行升级,也就是对flash中这三个分区的数据进行更新替换。

由于uboot\kernel\rootfs在flash分区中是以二进制数据存储的,与MCU固件在flash中存的是二进制数据一样,包括uboot\kernel\rootfs的升级文件也是以二进制数方式直接写入到对应的Flash分区。其升级方式与MCU固件的升级原理基本是一致的。

一般可在uboot中下载升级包来升级uboot\kernel\rootfs ,与MCU在BootLoader程序中完成升级类似。

3.2  应用程序升级

在Linux系统中,应用程序是存放在文件系统中,并以可执行程序文件的方式存在,其在系统中就是文件,这与MCU固件存放在flash分区的方式不同。

应用程序的升级流程与MCU固件、Linux系统升级基本一致。应用程序的升级除了可以升级可执行文件外,还可以升级配置文件等。

应用程序升级流程:

制作升级包(打包签名工具)、下载升级包(下载工具)、升级包验签、程序更新

与MCU OTA升级区别:

制作升级包:将应用程序相关的文件(可执行程序、库文件、配置文件等)打包为压缩包

作为一个整体再进行签名。

升级包下载和验签通过后,将压缩包解压,可以得到应用程序的相关文件。

应用程序的更新,可以通过启动应用程序的程序来更新,如启动脚本、启动程序,类似MCU升级的BootLoader程序作用。

更新方式:

1.直接覆盖旧程序;

2.保留旧程序,执行新程序;

直接覆盖旧程序:

保留旧程序,执行新程序:

如ping\pong操作

四、总结

OTA升级的核心:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OTA升级的实现原理 的相关文章

  • QNX BSP分析

    QNX相关历史文章 xff1a QNX简介QNX Neutrino微内核QNX IPC机制QNX进程管理器QNX资源管理器QNX字符I OQNX之编写资源管理器 xff08 一 xff09 QNX之编写资源管理器 xff08 二 xff09
  • SOA面向服务的分布式架构详解

    导语 xff1a SOA作为一种面向服务的架构 xff0c 是一种软件架构设计的模型和方法论 从业务角度来看 xff0c 一切以最大化 服务 的价值为 出发点 xff0c SOA利用企业现有的各种软件体系 xff0c 重新整合并构建起一套新
  • 自动驾驶软件架构之:中间件与SOA(一)

    本文是将中间件作为一个专题 xff0c 专门展开进行详细的分析和讨论 中间件相关技术在计算机分布式系统中发展了很多年 xff0c 尤其在互联网服务 大型商业系统中得到广泛使用 随着智能网联汽车的发展 xff0c 现代汽车也逐步增加了以太网支
  • 嵌入式系统BSP基础知识

    嵌入式系统BSP基础知识 板级支持包 BSP 是定义如何支持特定硬件设备 设备组或硬件平台的信息集合 BSP 包括有关设备上存在的硬件功能的信息和内核配置信息以及所需的任何其他硬件驱动程序 除了用于基本和可选平台功能的通用 Linux 软件
  • constexpr

    constexpr 标志返回值或者其他表达式是常量 xff0c 在编译时就会被计算出来 这个关键字常被用来 C 43 43 const 和 constexpr 的区别 xff1f 知乎 include lt iostream gt usin
  • inline namespace

    include lt iostream gt using namespace std namespace ALL namespace V2014 void fun int num cout lt lt 34 int 34 lt lt 34
  • 进程与线程

    对于操作系统来说 xff0c 一个任务就是一个进程 xff08 Process xff09 xff0c 比如打开一个浏览器就是启动一个浏览器进程 xff0c 打开一个记事本就启动了一个记事本进程 xff0c 打开两个记事本就启动了两个记事本
  • 详解SOME/IP协议文档

    以下内容来源于AutoSar官网的AUTOSAR PRS SOMEIPProtocol文档 详解SOME IP协议文档 2 知乎 以下内容来源于AutoSar官网的AUTOSAR PRS SOMEIPProtocol文档 SOME IP P
  • AP AUTOSAR——Update and Configuration Management UCM

    15 Update and Configuration Management 15 1 What is Update and Configuration Management 更新和配置管理是Adaptive Platform Servic
  • 基于Docker安装Jenkins并实现CI/CD实战部署

    本实践介绍了利用Jenkins和docker技术 xff0c 如何实现CI CD的各环节的步骤 xff0c 包括环境准备 xff0c 代码提交 xff0c 编译程序 xff0c 构建镜像 xff0c 部署一套完整的安装部署流程 工具介绍 x
  • 左值引用与右值引用

    include lt iostream gt using namespace std void change int amp rnum 引用就是变量名的别名 rnum 61 111 c 43 43 中能用引用的地方 xff0c 就不要使用指
  • C++ 11的移动语义

    目录 可拷贝和可移动的概念 移动构造函数和移动赋值函数 小结移动构造和移动赋值std move 使用 std move 实现一个高效的 swap 函数Move and swap 技巧参考 可拷贝和可移动的概念 在面向对象中 xff0c 有的
  • UDS-统一诊断服务

    什么是诊断服务 xff1f 在还没有诊断服务的时候 xff0c 如果车辆故障 xff0c 需要有经验的师傅长时间的摸排查找 xff0c 费时费力 而车辆的ECU节点有了诊断模块后 xff0c 就具有了诊断功能 xff0c 这样车辆如果有了故
  • AP AUTOSAR——Network Management

    16 Network Management 16 1 What is Network Management 网络管理是Adaptive Platform Services中的一个功能集群 作为AP AUTOSAR平台的服务 xff0c 网络
  • AP AUTOSAR——Security Management

    11 Security Management 11 1 What is Security Management 安全管理是自适应平台体系结构中的一个功能集群 作为一个功能集群 xff0c 安全管理由多个模块组成 xff0c 这些模块向在Ad
  • 如何制作S32V234的Linux5.x版本BSP

    脚本是编译S32v Linux5 x版本bsp文件的流程 官方也有这个指导说明文档 xff0c 主要是第2 3章内容 xff0c 可以参考着执行 1 下面描述的所有步骤都已在Ubuntu 20 04LTS上 xff08 本机或通过虚拟机 x
  • C++经典面试题100例及答案

    1 面向对象的程序设计思想是什么 答 xff1a 把数据结构和对数据结构进行操作的方法封装形成一个个的对象 2 什么是类 答 xff1a 把一些具有共性的对象归类后形成一个集合 xff0c 也就是所谓的类 3 对象都具有的两方面特征是什么
  • C++面试100题,1——40

    C与c 43 43 有什么不同 xff1f 在c 43 43 中能使用引用就不要使用指针 xff0c 要改变一个一级指针就要用一个二级指针 要改变一个二级指针就要用一个三级指针 xff0c 会变得越来越复杂 A类中的func1是虚函数 xf
  • (TDA4 BSP )Texas Instruments Jacinto 7 J721E (DRA829/TDA4xM) BSP 如何制作?

    1 1 1 Download and Install the SDK Processor SDK Linux for J721e Documentation https software dl ti com jacinto7 esd pro
  • 解决Linux 环境 GLIBCXX_3.4.15‘ not found问题

    升级Centos系统之后 xff0c 运行filezilla时 xff0c 出现如下错误的提示信息 xff1a filezilla usr lib libstdc 43 43 so 6 version 96 GLIBCXX 3 4 15 3

随机推荐

  • 两台Linux服务器之间传输文件的四种方法(转载)

    在日常服务器租用中 xff0c 有时需要将文件从一台服务器传到另一台服务器 xff0c 下面给大家介绍四种linux服务器之间传输文件方式 scp 优点 简单方便 xff0c 安全可靠 xff1b 支持限速参数 缺点 不支持排除目录 用法
  • 任务间通信 | 邮箱、消息队列

    本文分享自中移OneOS公众号 任务间通信 上篇讲解了任务间同步 xff0c 在本篇中主要讲解任务间通信机制 xff0c 并对邮箱及消息队列进行详细介绍 通过对其概念 详细设计 接口设计等的讲解帮助开发者更好的理解其在操作系统中的应用 任务
  • c++ 条件变量的使用,实战

    include lt iostream gt include lt thread gt include lt mutex gt include lt condition variable gt using namespace std 线程通
  • SOA架构和微服务架构的区别

    1 SOA架构和微服务架构的区别 首先SOA和微服务架构一个层面的东西 xff0c 而对于ESB和微服务网关是一个层面的东西 xff0c 一个谈到是架构风格和方法 xff0c 一个谈的是实现工具或组件 1 SOA xff08 Service
  • 浅谈AP autosar 之 runtime 基础

    AP Autosar Architecture overview AP autosar在SOC 中的位置 xff0c 起到的作用 下面图可以看出 xff0c AP autosar封装了操作系统的接口 xff0c 封装了功能安全 xff0c
  • 「冰羚」— 撑起自动驾驶未来的“中间件”

    每当谈到自动驾驶的软件开发 xff0c 人们首先想到的 xff0c 是深不可测的人工智能算法 xff0c 是各种感知融合 xff0c 是各类路径规划 但是 xff0c 就算是再智能再高深的算法 xff0c 如果没有底层操作系统的支持 xff
  • 多核处理器的关键技术

    英特尔的cpu是从前代gt atom一路供货到第7代 xff0c 想必日常使用不会有太大区别 xff0c 而在系统之外可能存在一些散热方面的问题 而上市越早的处理器 xff0c 硬件供货越好 xff0c 可能在某些特殊时间段会出现不足 xf
  • LD_PRELOAD作用

    一 LD PRELOAD是什么 LD PRELOAD 是Linux系统的一个环境变量 xff0c 它可以影响程序的运行时的链接 xff08 Runtime linker xff09 xff0c 它允许你定义在程序运行前优先加载的动态链接库
  • C++ 之父的多线程编程建议——现代 C++ 对多线程/并发的支持(下)

    本文承接前文 现代 C 43 43 对多线程 并发的支持 xff08 上 xff09 xff0c 翻译自 C 43 43 之父 Bjarne Stroustrup 的 C 43 43 之旅 xff08 A Tour of C 43 43 x
  • C++关键字之Future promise and async()

    主线程将x传递给子线程 xff0c 子线程将结果x再传递给主线程 include lt iostream gt include lt future gt include lt thread gt using namespace std vo
  • C++ thread::hardware_concurrency 获取硬件支持并发数

    一 功能 获取硬件支持的并发线程数 二 返回值 正常返回支持的并发线程数 xff0c 若值非良定义或不可计算 xff0c 则返回 0 四 示例 include lt iostream gt include lt thread gt int
  • C++并发编程 unique_lock and condition_variable

    在t1线程中插入值 xff0c 在t2线程中取出值 include lt iostream gt include lt thread gt include lt vector gt include lt string gt include
  • ubuntu18.04+安装ros-melodic+安装realsense-ros包

    自己在安装的时候参考了很多博客 xff0c 但许多的方法很杂乱最后还失败了 xff0c 这里综合下自己尝试成功且比较方便的方法 xff0c 参考链接会在下文列出 安装ros melodic 参考 xff1a https www guyueh
  • [C++11 并发编程] 动态选择并发线程的数量

    C 43 43 标准模板库提供了一个辅助函数 std thread hardware concurrency xff0c 通过这个函数 xff0c 我们可以获取应用程序可以真正并发执行的线程数量 下面这个例子 xff0c 实现了一个并发版本
  • [C++11 并发编程] 17 超时等待 - clock和duration

    之前我们看到的所有等待机制都是不会超时的 xff0c 也就是说 xff0c 等待某个同步事件的线程会一直挂起 有些情况下 xff0c 我们希望设置一个最长等待时间 xff0c 使得程序可以继续与用户进行交互 xff0c 使得用户可以取消这个
  • 激光雷达和相机感知融合简介

    本文介绍激光雷达和相机融合的两种方法 xff1a 前融合 xff1a 融合原始数据 xff08 点云和像素 目标框 xff09 后融合 xff1a 融合目标框 前融合 前融合一般指融合原始数据 xff0c 最容易 最普遍的方式是将点云投影到
  • 聚焦芯片:GPU,CPU,SOC,DSP,FPGA,ASIC,MCU,MPU,GPP,ECU等都是什么?

    先上部分概念 xff1a CPU xff1a 中央处理器 xff08 Central Processing Unit xff09 是一块超大规模的集成电路 xff0c 是一台计算机的运算核心 xff08 Core xff09 和控制核心 x
  • 怎么样实现车辆信息安全

    1 车载IDS 正成为持续网络安全保护的核心要素 持续的网络信息安全风险管理正成为VTA的要求 通过IDS车载入侵检测可以为整个车队提供信息安全保护 但是 xff0c 分布式IDS的指导原则是什么 xff1f 为了满足UNECE WP29法
  • SOA通信架构和SOME/IP-SD的主要功能

    1 SOA面向服务的通信交互 如上图所示 xff0c 女神去热水澡堂洗澡 xff0c 想搓背 xff08 find服务 xff09 xff0c 于是她付要付搓背钱给澡堂老板 xff0c 这时澡堂老板知道通过小王和小明的毛遂自荐 xff08
  • OTA升级的实现原理

    一 简介 1 1 概念 OTA xff1a Over the Air Technology xff0c 即空中下载技术 OTA升级 xff1a 通过OTA方式实现固件或软件的升级 只要是通过无线通信方式实现升级的 xff0c 都可以叫OTA