一、简介

1、概念

OTA:Over-the-Air Technology,即空中下载技术。
OTA 升级:通过 OTA 方式实现固件或软件的升级。
只要是通过无线通信方式实现升级的,都可以叫 OTA 升级,比如网络 / 蓝牙。
通过有线方式进行升级,叫本地升级,比如通过 UART,USB 或者 SPI 通信接口来升级设备固件。

2、优点

  • 通过 OTA 方式,可以对分布在各地的设备进行软件升级,而不必让运维人员各地奔波。
  • 物联网平台支持通过 OTA 方式进行设备固件升级,是智能设备修复系统漏洞、实现系统升级的手段。
  • 在迅速变化和发展的物联网市场,新的产品需求不断涌现,因此对于智能硬件设备的更新需求就变得空前高涨,设备不再像传统设备一样一经出售就不再变更。通过固件升级用户提供更好的服务。

3、实现原理

(1)核心流程

  1. 制作升级包
  2. 下载升级包
  3. 验签升级包
  4. 更新程序

嵌入式OTA主要技术 - 图2

(2)下载方式

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

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

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

(3)新旧固件覆盖模式

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

双区模式:
双区模式中老固件和新固件在 flash 中各占一块 bank(存储区)。假设老固件放在 bank0(运行区)中,新固件放在 bank1(下载区)中,升级的时候,应用程序先把新固件下载到 bank1 中,只有当新固件下载完成并校验成功后,系统才会跳入 BootLoader 程序,然后擦除老固件所在的 bank0 区,并把 bank1 的新固件拷贝到 bank0 中。
嵌入式OTA主要技术 - 图5
注意:后台式下载必须采用双区模式进行升级。
优点:
升级过程中出现问题或者新固件有问题,它还可以选择之前的老固件老系统继续执行而不受其影响。

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

单区模式:
单区模式的非后台式下载只有一个 bank0(运行区),老固件和新固件共享这一个 bank0。升级的时候,进入 bootloader 程序后先擦除老固件,然后直接把新固件下载到同一个 bank 中,下载完成后校验新固件的有效性,新固件有效升级完成,否则要求重来。
嵌入式OTA主要技术 - 图6
优点:
跟双区模式相比,单区模式节省了 Flash 空间的一个 bank,在系统资源比较紧张的时候,单区模式是一个不错的选择。

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

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

二、MCU OTA 升级

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

嵌入式OTA主要技术 - 图7

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

验签:
B 收到消息后, 也会使用和 A 相同的方法计算消息摘要,然后用 A 的公钥解密签名,并与自己计算出来的消息摘要进行比较,如果相同则说明消息是 A 发送给 B 的,同时, A 也无法否认自己发送消息给 B 的事实。
(B 使用 A 的公钥解密签名文件的过程,叫做 “验签”)
嵌入式OTA主要技术 - 图8

密码学基础概念:

  • 什么是消息摘要?
  • 什么是非对称加解密?私钥与公钥?
  • 什么是数字签名?

数字签名的作用:
保证数据完整性,机密性和发送方角色的不可抵赖性。

消息摘要函数:
MD4、MD5、SHA-1、SHA-256、SHA-384、SHA-512

数字签名算法:
RSA、Rabin 方式、ElGamal 方式、DSA

1、制作升级包

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

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

  • Firmware: 固件
  • Header: 头部信息。存放配置信息,如版本号、产品类型等。
  • Signature value: 签名值。对 firmware 和 header 签名后的值。

嵌入式OTA主要技术 - 图9

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

固件签名:
上位机软件先计算整个固件的消息摘要,使用非对称密码的私钥对摘要进行加密,被加密后的消息摘要数据就是签名值。

固件签名的意义:
计算 hash 值可以识别固件是否被篡改和伪装,确保固件的完整性。使用非对称秘钥签名方便后续验证升级包身份的合法性。

2、下载升级包

根据上位机软件和 MCU 设备约定的通信协议,上位机软件将升级包通过 OTA 方式发送给 MCU 设备,MCU 设备收到数据后,根据通信协议解析出升级包的数据,并将升级包的数据保存到存储器中。

通信协议的作用:
通讯双方约定俗成地用于数据交流的格式。

下载的方式:

  • 在应用程序中下载:后台式
  • 在 BootLoader 中下载:非后台式

3、验签升级包

MCU 设备接收完所有的升级包后,先计算升级包中固件的摘要,然后使用非对称秘钥的公钥解密升级包的签名值,如果解密出来的固件摘要与自己计算的摘要相同,则验签成功。

4、更新固件

验签成功保证了固件的完整性和合法性后,MCU 设备从应用程序进入 BootLoader 程序,在 BootLoader 程序中将 flash 中的新固件数据搬运到旧固件的存储区,将其覆盖。然后 BootLoader 程序启动固件运行,此时固件为新固件。

flash 固件数据更新:
擦除 flash,写 flash。

三、Linux OTA 升级

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

三者在 flash 中的分区如下:
应用程序存放于 rootfs。
嵌入式OTA主要技术 - 图10

Linux 系统的启动流程:

嵌入式OTA主要技术 - 图11

1、系统升级

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

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

一般可在 uboot 中下载升级包来升级 uboot、kernel、rootfs ,与 MCU 在 BootLoader 程序中完成升级类似。
嵌入式OTA主要技术 - 图12

2、应用程序升级

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

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

(1)应用程序升级流程

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

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

作为一个整体再进行签名。
嵌入式OTA主要技术 - 图13

升级包下载和验签通过后,将压缩包解压,可以得到应用程序的相关文件。
应用程序的更新,可以通过启动应用程序的程序来更新,如启动脚本、启动程序,类似 MCU 升级的 BootLoader 程序作用。

(2)更新方式

  • 直接覆盖旧程序;
  • 保留旧程序,执行新程序;

直接覆盖旧程序:
嵌入式OTA主要技术 - 图14

保留旧程序,执行新程序:
如 ping\pong 操作
嵌入式OTA主要技术 - 图15

四、总结

OTA 升级的核心:

嵌入式OTA主要技术 - 图16

参考资料