实现软件在线更新的装置、系统和方法转让专利

申请号 : CN201610094580.4

文献号 : CN105786563B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 章鑫杰毛虎锋

申请人 : 联州(上海)信息科技有限公司

摘要 :

本发明提出了实现软件在线更新的装置、系统和方法,包括用于软件在线更新的差分包生成装置和差分包生成方法,用于实现软件在线更新的更新装置和更新方法,以及用于软件在线更新的系统。本发明通过“最大限度的重复利用source可用部分”的原则,有效减少差分包中匹配数据块被碎片化的情况,优化最终差分包的数据量大小,改善差分包的压缩率,并且ROM中开辟预定数据块大小的备份空间,实现断电保护的备份机制,一方面节约了ROM备份空间,另一方面保证了升级过程的系统安全性。

权利要求 :

1.一种用于软件在线更新的差分包生成装置,其特征在于,包括:

目标数据划分模块,将软件更新的目标数据划分为若干个数据块单元,每个数据块单元的大小均小于或者等于指定数据块大小;

源数据划分模块,针对目标数据的任一个所述数据块单元,确定对应于该数据块单元的源数据最大可用部分;所述源数据最大可用部分是未被与目标数据的当前数据块单元相比处于低位地址或高位地址的目标数据数据块单元替代的源数据数据块;

差分运算模块,用于针对目标数据的任一个所述数据块单元与对应该数据块单元的源数据最大可用部分,查找二者的匹配数据块;并通过对匹配数据块进行差分运算,获得对应该数据块单元的差分包元素;

差分包生成模块,利用全部的差分包元素组成用于更新目标数据的差分包。

2.根据权利要求1所述的差分包生成装置,其特征在于,目标数据划分为m个数据块单元,将目标数据的任一个数据块单元表示为chunk(n),对应该数据块单元chunk(n)的源数据最大可用部分为源数据中未被目标数据的低位地址的数据块单元chunk(1)至chunk(n-

1)替代的数据块。

3.根据权利要求2所述的差分包生成装置,其特征在于,对应该数据块单元chunk(n)的源数据最大可用部分为源数据的起始地址为chunk_size(1)+chunk_size(2)…+chunk_size(n-1)且大小为source_size-(chunk_size(1)+chunk_size(2)…+chunk_size(n-1))的数据块;其中chunk_size(i)为目标数据的数据块单元chunk(i)的大小(1≤i≤n-1),source_size为源数据整体的大小。

4.根据权利要求1所述的差分包生成装置,其特征在于,目标数据划分为m个数据块单元,将目标数据的任一个数据块单元表示为chunk(n),对应该数据块单元chunk(n)的源数据最大可用部分为源数据中未被目标数据的高位地址的数据块单元chunk(n+1)至chunk(m)替代的数据块。

5.根据权利要求4所述的差分包生成装置,其特征在于,对应该数据块单元chunk(n)的源数据最大可用部分为源数据的起始地址为0、大小为source_size-(chunk_size(n+1)+…+chunk_size(m-1)+chunk_size(m))的数据块;其中chunk_size(i)为目标数据的数据块单元chunk(i)的大小(n+1≤i≤m),source_size为源数据整体的大小。

6.根据权利要求1所述的差分包生成装置,其特征在于,所述指定数据块大小是在终端设备的ROM中开辟的备份空间的大小。

7.根据权利要求1所述的差分包生成装置,其特征在于,差分运算模块对目标数据的任一个所述数据块单元与对应该数据块单元的源数据最大可用部分二者中的匹配数据块进行差分运算生成差分数据块DB;将该目标数据的数据块单元中不属于所述匹配数据块的部分作为额外数据块EB,并相应生成控制数据块CB;将所述DB、EB与CB作为实际数据,生成对应该数据块单元的差分包元素。

8.根据权利要求1所述的差分包生成装置,其特征在于,差分包生成装置还包括:差分包元素头部信息生成模块,用于每一个差分包元素生成对应的头部信息。

9.根据权利要求8所述的差分包生成装置,其特征在于,计算每个差分包元素所对应的源数据最大可用部分的hash值,以及每个差分包元素所对应的目标数据的数据块单元的hash值,存入差分包元素对应的所述头部信息。

10.根据权利要求8所述的差分包生成装置,其特征在于,所述差分包元素对应的所述头部信息包括以下信息的至少一项:源数据最大可用部分的起始位置信息、源数据最大可用部分大小的信息、目标数据数据块单元的写入位置信息、目标数据数据块单元大小的信息、本差分包元素大小的信息、本差分包元素在差分包中的偏移位置信息。

11.根据权利要求1所述的差分包生成装置,其特征在于,差分包生成模块用于生成一个差分包的总体头部信息,并且在该总体头部信息中记录差分包当中差分包元素的数量。

12.根据权利要求11所述的差分包生成装置,其特征在于,所述总体头部信息包括整个源数据的hash签名以及整个目标数据的hash签名。

13.一种用于软件在线更新的差分包生成方法,其特征在于,包括:

目标数据划分步骤,将软件更新的目标数据划分为若干个数据块单元,每个数据块单元的大小均小于或者等于指定数据块大小;

源数据划分步骤,针对目标数据的任一个所述数据块单元,确定对应于该数据块单元的源数据最大可用部分;所述源数据最大可用部分是未被与目标数据的当前数据块单元相比处于低位地址或高位地址的目标数据数据块单元替代的源数据数据块;

差分运算步骤,用于针对目标数据的任一个所述数据块单元与对应该数据块单元的源数据最大可用部分,查找二者的匹配数据块;并通过对匹配数据块进行差分运算,获得对应该数据块单元的差分包元素;

差分包生成步骤,利用全部的差分包元素组成用于更新目标数据的差分包。

14.根据权利要求13所述的差分包生成方法,其特征在于,目标数据划分为m个数据块单元,将目标数据的任一个数据块单元表示为chunk(n),对应该数据块单元chunk(n)的源数据最大可用部分为源数据中未被目标数据的低位地址的数据块单元chunk(1)至chunk(n-1)替代的数据块。

15.根据权利要求14所述的差分包生成方法,其特征在于,对应该数据块单元chunk(n)的源数据最大可用部分为源数据的起始地址为chunk_size(1)+chunk_size(2)…+chunk_size(n-1)且大小为source_size-(chunk_size(1)+chunk_size(2)…+chunk_size(n-1))的数据块;其中chunk_size(i)为目标数据的数据块单元chunk(i)的大小(1≤i≤n-1),source_size为源数据整体的大小。

16.根据权利要求13所述的差分包生成方法,其特征在于,目标数据划分为m个数据块单元,将目标数据的任一个数据块单元表示为chunk(n),对应该数据块单元chunk(n)的源数据最大可用部分为源数据中未被目标数据的高位地址的数据块单元chunk(n+1)至chunk(m)替代的数据块。

17.根据权利要求16所述的差分包生成方法,其特征在于,对应该数据块单元chunk(n)的源数据最大可用部分为源数据的起始地址为0、大小为source_size-(chunk_size(n+1)+…+chunk_size(m-1)+chunk_size(m))的数据块;其中chunk_size(i)为目标数据的数据块单元chunk(i)的大小(n+1≤i≤m),source_size为源数据整体的大小。

18.根据权利要求13所述的差分包生成方法,其特征在于,所述指定数据块大小是在终端设备的ROM中开辟的备份空间的大小。

19.根据权利要求13所述的差分包生成方法,其特征在于,差分运算步骤中,对目标数据的任一个所述数据块单元与对应该数据块单元的源数据最大可用部分二者中的匹配数据块进行差分运算生成差分数据块DB;将该目标数据的数据块单元中不属于所述匹配数据块的部分作为额外数据块EB,并相应生成控制数据块CB;将所述DB、EB与CB作为实际数据,生成对应该数据块单元的差分包元素。

20.根据权利要求13所述的差分包生成方法,其特征在于,差分包生成方法还包括:差分包元素头部信息生成步骤,用于每一个差分包元素生成对应的头部信息。

21.根据权利要求20所述的差分包生成方法,其特征在于,计算每个差分包元素所对应的源数据最大可用部分的hash值,以及每个差分包元素所对应的目标数据的数据块单元的hash值,存入差分包元素对应的所述头部信息。

22.根据权利要求20所述的差分包生成方法,其特征在于,所述差分包元素对应的所述头部信息包括以下信息的至少一项:源数据最大可用部分的起始位置信息、源数据最大可用部分大小的信息、目标数据数据块单元的写入位置信息、目标数据数据块单元大小的信息、本差分包元素大小的信息、本差分包元素在差分包中的偏移位置信息。

23.根据权利要求13所述的差分包生成方法,其特征在于,差分包生成步骤用于生成一个差分包的总体头部信息,并且在该总体头部信息中记录差分包当中差分包元素的数量。

24.根据权利要求23所述的差分包生成方法,其特征在于,所述总体头部信息包括整个源数据的hash签名以及整个目标数据的hash签名。

25.一种实现软件在线更新的更新装置,其特征在于,包括:

差分包获得模块,用于在线下载获得差分包;

源数据可用部分确定模块,从所述差分包中提取任一个差分包元素,确定对应于该差分包元素的源数据最大可用部分,所述源数据最大可用部分是ROM中未被目标数据的数据块单元替代的源数据数据块;

目标数据生成模块,用于将任一个所述差分包元素与ROM中存储的源数据最大可用部分结合,获得与该差分包元素对应的目标数据的数据块单元;

备份模块,将该目标数据的数据块单元刷写至ROM的备份空间;

源数据更新模块,用于将该目标数据的数据块单元刷写至ROM的对应位置,替代源数据中对应的数据块;最终为差分包中的每个差分包元素生成对应的目标数据的数据块单元并将其刷写至ROM替代源数据。

26.根据权利要求25所述的更新装置,其特征在于,所述差分包包括m个差分包元素,其中任一个差分包元素delta(n)对应的目标数据的数据块单元表示为chunk(n);源数据可用部分确定模块从所述差分包中提取任一个差分包元素delta(n),对应该差分包元素delta(n)的源数据最大可用部分是源数据中未被目标数据的低位地址的数据块单元chunk(1)至chunk(n-1)替代的数据块。

27.根据权利要求26所述的更新装置,其特征在于,源数据最大可用部分是源数据中起始地址为chunk_size(1)+chunk_size(2)…+chunk_size(n-1)、大小为source_size-(chunk_size(1)+chunk_size(2)…+chunk_size(n-1))的数据块,其中chunk_size(i)为目标数据的数据块单元chunk(i)的大小(1≤i≤n-1),source_size为源数据整体的大小。

28.根据权利要求25所述的更新装置,其特征在于,所述差分包包括m个差分包元素,其中任一个差分包元素delta(n)对应的目标数据的数据块单元表示为chunk(n);源数据可用部分确定模块从所述差分包中提取任一个差分包元素delta(n),对应该差分包元素delta(n)的源数据最大可用部分是源数据中未被目标数据的高位地址的数据块单元chunk(n+1)至chunk(m)替代的数据块。

29.根据权利要求28所述的更新装置,其特征在于,源数据最大可用部分是源数据中起始地址为0、大小为source_size-(chunk_size(n+1)+…+chunk_size(m-1)+chunk_size(m))的数据块,其中chunk_size(i)为目标数据的数据块单元chunk(i)的大小(n+1≤i≤m),source_size为源数据整体的大小。

30.根据权利要求25所述的更新装置,其特征在于,所述差分包包括m个差分包元素,其中任一个差分包元素delta(n)对应的目标数据的数据块单元表示为chunk(n),源数据更新模块以该目标数据的数据块单元chunk(n)刷写替代源数据中起始地址为chunk_size(1)+chunk_size(2)+…+chunk_size(n-1)且大小等于chunk_size(n)的数据块,其中chunk_size(i)为目标数据的数据块单元chunk(i)的大小(1≤i≤n)。

31.根据权利要求25所述的更新装置,其特征在于,所述差分包包括m个差分包元素,其中任一个差分包元素delta(n)对应的目标数据的数据块单元表示为chunk(n),源数据更新模块以该目标数据的数据块单元chunk(n)刷写替代起始地址为source_size-(chunk_size(n)+…+chunk_size(m-1)+chunk_size(m))且大小等于chunk_size(n)的数据块,其中chunk_size(i)为目标数据的数据块单元chunk(i)的大小(n≤i≤m),source_size为源数据整体的大小。

32.根据权利要求25所述的更新装置,其特征在于,更新装置还进一步包括:差分包匹配验证模块,用于HASH验证下载的差分包与ROM中源数据source是否匹配;如果匹配则启动针对source的软件更新。

33.根据权利要求25所述的更新装置,其特征在于,更新装置还进一步包括:目标数据验证模块,用于在根据差分包元素生成了对应的目标数据的数据块单元后,根据该差分包元素的头部信息,HASH校验该目标数据的数据块单元。

34.根据权利要求25所述的更新装置,其特征在于,所述源数据可用部分确定模块确定了对应于差分包元素的源数据最大可用部分后,HASH验证该源数据最大可用部分是否与该差分包元素的头部信息相匹配,匹配的情况下启动应用该差分包元素实现的更新过程。

35.一种实现软件在线更新的更新方法,其特征在于,包括:

差分包获得步骤,用于在线下载获得差分包;

源数据可用部分确定步骤,从所述差分包中提取任一个差分包元素,确定对应于该差分包元素的源数据最大可用部分;所述源数据最大可用部分是ROM中未被目标数据的数据块单元替代的源数据数据块;

目标数据生成步骤,用于将任一个所述差分包元素与ROM中存储的源数据最大可用部分结合,获得与该差分包元素对应的目标数据的数据块单元;

备份步骤,将该目标数据的数据块单元刷写至ROM的备份空间;

源数据更新步骤,用于将该目标数据的数据块单元刷写至ROM的对应位置,替代源数据中对应的数据块;最终为差分包中的每个差分包元素生成对应的目标数据的数据块单元并将其刷写至ROM替代源数据。

36.根据权利要求35所述的更新方法,其特征在于,所述差分包包括m个差分包元素,其中任一个差分包元素delta(n)对应的目标数据的数据块单元表示为chunk(n);在源数据可用部分确定步骤中,从所述差分包中提取任一个差分包元素delta(n),对应该差分包元素delta(n)的源数据最大可用部分是源数据中未被目标数据的低位地址的数据块单元chunk(1)至chunk(n-1)替代的数据块。

37.根据权利要求36所述的更新方法,其特征在于,源数据最大可用部分是源数据中起始地址为chunk_size(1)+chunk_size(2)…+chunk_size(n-1)、大小为source_size-(chunk_size(1)+chunk_size(2)…+chunk_size(n-1))的数据块,其中chunk_size(i)为目标数据的数据块单元chunk(i)的大小(1≤i≤n-1),source_size为源数据整体的大小。

38.根据权利要求35所述的更新方法,其特征在于,所述差分包包括m个差分包元素,其中任一个差分包元素delta(n)对应的目标数据的数据块单元表示为chunk(n);在源数据可用部分确定步骤中,从所述差分包中提取任一个差分包元素delta(n),对应该差分包元素delta(n)的源数据最大可用部分是源数据中未被目标数据的高位地址的数据块单元chunk(n+1)至chunk(m)替代的数据块。

39.根据权利要求38所述的更新方法,其特征在于,源数据最大可用部分是源数据中起始地址为0、大小为source_size-(chunk_size(n+1)+…+chunk_size(m-1)+chunk_size(m))的数据块,其中chunk_size(i)为目标数据的数据块单元chunk(i)的大小(n+1≤i≤m),source_size为源数据整体的大小。

40.根据权利要求35所述的更新方法,其特征在于,所述差分包包括m个差分包元素,其中任一个差分包元素delta(n)对应的目标数据的数据块单元表示为chunk(n),源数据更新步骤中,以该目标数据的数据块单元chunk(n)刷写替代源数据中起始地址为chunk_size(1)+chunk_size(2)+…+chunk_size(n-1)且大小等于chunk_size(n)的数据块,其中chunk_size(i)为目标数据的数据块单元chunk(i)的大小(1≤i≤n)。

41.根据权利要求35所述的更新方法,其特征在于,所述差分包包括m个差分包元素,其中任一个差分包元素delta(n)对应的目标数据的数据块单元表示为chunk(n),源数据更新步骤中,以该目标数据的数据块单元chunk(n)刷写替代起始地址为source_size- (chunk_size(n)+…+chunk_size(m-1)+chunk_size(m))且大小等于chunk_size(n)的数据块,其中chunk_size(i)为目标数据的数据块单元chunk(i)的大小(n≤i≤m),source_size为源数据整体的大小。

42.根据权利要求35所述的更新方法,其特征在于,更新方法还进一步包括:差分包匹配验证步骤,用于HASH验证下载的差分包与ROM中源数据source是否匹配;如果匹配则启动针对source的软件更新。

43.根据权利要求35所述的更新方法,其特征在于,更新方法还进一步包括:目标数据验证步骤,用于在根据差分包元素生成了对应的目标数据的数据块单元后,根据该差分包元素的头部信息,HASH校验该目标数据的数据块单元。

44.根据权利要求35所述的更新方法,其特征在于,所述源数据可用部分确定步骤确定了对应于差分包元素的源数据最大可用部分后,HASH验证该源数据最大可用部分是否与该差分包元素的头部信息相匹配,匹配的情况下启动应用该差分包元素实现的更新过程。

45.一种实现软件在线更新的系统,包括上述权利要求1-12中任意一项所述的差分包生成装置以及权利要求25-34中任意一项所述的更新装置。

说明书 :

实现软件在线更新的装置、系统和方法

技术领域

[0001] 本发明涉及信息技术领域,尤其涉及实现软件在线更新的装置、系统和方法,包括用于软件在线更新的差分包生成装置和差分包生成方法,用于实现软件在线更新的更新装置和更新方法,以及用于软件在线更新的系统。

背景技术

[0002] 随着信息技术进步,特别是随着物联网产品源源不断被开发出来,自身加载操作系统和/或应用软件并且具有网络接入能力的终端设备得到了普及化发展,影响了很多领域,其中包括但不局限于智能家居,智能穿戴以及智能车载设备等。这些终端设备具有传统电子产品的特性,更重要的是,其自身具有更新机制,可以在不断的更新迭代中实现功能和性能的自我完善。所述更新机制包括硬件更新和软件更新两个方面,这里主要涉及软件方面的更新。
[0003] 终端设备的软件更新一般出于以下几种目的:(1)新功能的引入,对现有产品进行扩展;(2)性能的优化,提高运行效率;(3)Bug修复,修正软件缺陷;(4)产品业务调整,应对需求变更。
[0004] 终端设备的软件更新可以分为现场人工更新和在线更新两种方式。现场人工更新通常会需要借助终端设备以外的电脑以及电脑端软件等第三方工具,通过某种电缆线将电脑与该终端设备进行连接,然后执行软件更新操作,利用电脑端下载更新软件所需要的数据,将新版软件从电脑端经由电缆线传输到该终端设备,刷新终端设备的软件存储区域。这个过程可以抽象地看做两个逻辑步骤:一是下载软件更新相关数据;二是刷写软件。
[0005] 在线更新从逻辑上看仍然通过上述两个步骤实现,但是,在下载软件更新相关数据的步骤中,在线更新不借助电脑等任何第三方工具,由终端设备利用自身的网络通信能力实现数据的下载;因而,刷写软件的步骤也完全由终端设备自身内部完成,这样就可以实现自动更新,不需要人工操作介入。由于物联网等体系中,终端设备种类繁多,分布广泛,现场人工更新软件的成本极大。相比而言,在线软件更新可以极大的减少成本,更新过程也非常方便快捷。
[0006] 如上面所述,终端设备软件的在线更新由对应的两个过程组成:第一个过程中下载软件更新相关数据,本申请中将该过程称为Download Agent,简称DA。第二个过程是处理下载的软件更新相关数据,称为Update Agent,简称UA;整个过程最终实现对原有软件的刷写。
[0007] 由于没有第三方工具设备介入,在线软件更新不能像人工操作那样做到下载与刷写两个过程并行进行,所以必须先执行下载操作,然后再执行对下载数据的处理与刷写操作。这样就涉及到必须对被下载的软件更新相关数据在终端设备内部进行存储的问题。
[0008] 如果我们先将新版软件整个下载,然后刷写替代原有软件的话,则终端设备需要预留一半左右的存储空间,例如SD卡的存储空间等,用于存储下载的新版软件数据。显然,这样不但在下载时加大网络负担,还会浪费设备存储空间。
[0009] 因此,可以使用二进制差分技术,形成差分包作为软件更新相关数据。这一技术可以把最终需要下载的差分包压缩到整个新版软件数据量的15%甚至更少。
[0010] 通过二进制差分技术制作的差分包可以被表示为delta,它是通过一套算法从原有软件数据和更新后的新版软件数据中提取差异部分组合而成。我们把原有软件数据叫做源数据source,将新版软件数据称为目标数据target。那么差分包的生成和更新过程包括:(1)生成差分包:根据source与target抽取delta;(2)下载差分包delta到终端设备并进行存储;(3)终端更新过程:在终端设备原有的source上合并delta生成target。由于下载和临时存储的都是差分包delta,而delta的数据量与target相比又明显比较小,可以减少网络负载和节约存储空间。
[0011] 下面介绍差分包delta的生成过程。参见图1,其中以一维数组的形式示意性地表示出了source和target分别包括的数据。通过模糊查找最大匹配的算法,在source与target之间找出若干大小相同且内容几乎相同(二者不同的数据位在允许的阈值以下)的匹配数据块,如图1中的虚线框所示,两个匹配数据块中仅倒数第5、6位的数据不同,source为I,I而target为K,K。然后将source与target的匹配数据块做一个减法运算,这样生成了一个大部分主要由0组成的数据块,这里叫做Diff-Block,简称DB,如图1所示,经过减法得出DB数据块的值为0000000000000000220000(这里假设K-I=2)。这时得出的DB的位数(下称size)完全等于source和target的匹配数据块的原size,但是因为DB数值的冗余性很高(大部分数值为0),在经过LZMA无损压缩算法处理后就会得到一个数据量远远小于DB的数据块加入至delta。
[0012] 除了经压缩的DB外,差分包中还保存了target中不属于匹配数据块的部分,例如图1中target在虚线框前、后的X,X。这些部分被称作为Extra-Block,简称EB。EB也会经过压缩后存入delta中,但是这部分压缩比率远不如DB高,也是delta中占据数据量的比例最大一部分。通常EB部分越大,source与target的差异程度越大。另外delta中还有一部分记录了DB与EB的位置关系,这部分被称为Control-Block,简称CB;每个CB记录具有相同的大小,而CB记录的总数量由source与target的”破碎程度”决定。delta中还包括包头信息,称之为header。
[0013] 在下载并存储了差分包delta之后,终端设备在UA过程中按如下方式处理delta:首先,终端设备读取delta的header信息,确定target的大小以及CB在delta中的位置;然后在RAM开辟与target相同size的内存空间,逐个解析CB记录,确定下一个被处理的数据块是DB还是EB,以及该块对应的起始位置和长度;如果是EB就直接写入该内存空间;如果是DB就会按照source+delta的算法生成target的数据块,再写入内存空间。最终在内存空间中生成一个target镜像后进行shal的签名验证,如果验证无误就将target镜像从内存刷写到终端设备的持久性存储设备ROM上替代source,完成更新。
[0014] 由上面得知,下载了差分包delta之后的更新过程分为两个阶段:(1)根据delta与source生成target到内存RAM的阶段;(2)刷写target到持久性存储设备ROM的阶段。在这一更新方式中,由于所下载的软件更新相关数据是差分包delta,因此必须与终端设备的ROM中原有的source结合在一起才能获得更新后的target。
[0015] 为了在终端设备软件更新过程中保证安全性,对其各个阶段可能出现的异常状况都需要相应的保护措施,避免因软件更新失败而造成终端设备无法使用。其中,断电保护机制的引入,是为了防止在更新过程中掉电而造成设备系统破坏而无法启动的情况。
[0016] 在上述下载了差分包delta之后的两个更新阶段中,不难分析,如果在生成target到内存RAM的阶段中掉电,由于ROM中的source没有受到破坏,终端设备的系统是可以恢复的,并应用已下载的delta重新开始更新。然而,如果在向ROM刷写target替代source时断电,就会造成系统被破坏情况。例如,如果在数据刷写过程进行到一半时断电,这时终端设备的ROM存储的数据将会是这种情况:前半部分是target数据而后半部分还是source数据,这样终端设备既不能开机运行,也不能在该ROM中数据的基础上再通过delta来计算生成target。
[0017] 要解决这个问题,最直观的方法是生成的target不直接覆盖source,而是先保存在ROM中开辟的一个安全区域做备份分区,然后再刷写替代source。这样即使在覆盖source时断电,还可以从备份区域恢复出target并继续或者重新刷写。这时更新过程演化为:(1)根据delta与source生成target到内存RAM的阶段;(2)备份保存target到ROM的backup分区的阶段;(3)刷写target到ROM保存source的分区替代source的阶段。但是,类似的问题是,如果在ROM中拿出足够容纳整个target的空间来做备份分区,又会出现对ROM空间浪费的情况。
[0018] 根据flash IO机制,向ROM刷入数据的一次IO操作的最小数据量是一个预定数据块block的大小。因此,我们可以把ROM中预留的备份空间(即backup分区)缩小到一个预定数据块block。这样,在具有预定数据块block大小的ROM备份空间作为断电保护的安全机制下,差分包生成可以按照如图2所示的方式加以进行。其中,将source与target拆分为多个等于或小于备份空间大小的对应数据块单元,这种数据块单元称之为chunk,如图2中source的chunk1,chunk2,chunk3,……chunk(m)分别对应于target的chunk1,chunk2,chunk3,……chunk(m)。然后再对source与target中对应的chunk做模糊查找最大匹配基础上的差分计算,即,针对source的chunk1与target的chunk1,模糊查找这两个chunk1当中存在的匹配数据块,对匹配数据块执行差分运算生成DB,以及相应于DB产生EB以及CB等,从而获得对应chunk1的delta1,以source的chunk2与target的chunk2再进行模糊查找最大匹配基础上的差分计算得出delta2,依次类推。最终得到的差分包delta是各个delta1,delta2,delta3,……delta(m)的集合体。
[0019] 终端设备下载并存储了上述delta差分包之后,软件更新过程:(1)根据delta中的delta1与source的chunk1,生成target的chunk1到RAM;(2)HASH验证RAM中保存的新生成数据target的chunk1;(3)刷写target的chunk1到ROM中backup分区;(4)刷写target的chunk1到ROM中保存source的分区,替代source的chunk1;(5)根据delta中的delta2与source的chunk2,生成target的chunk2到RAM;(6)HASH验证RAM中保存的新生成数据target的chunk2;(7)刷写target的chunk2到ROM中backup分区;(8)刷写target的chunk2到ROM中保存source的分区,替代source的chunk2……依次类推,直至source的全部chunk均被刷写从而完成更新。
[0020] 这样一来,在软件更新的任何阶段发生掉电,系统都是可以恢复的。例如,在上述第(4)阶段向source的分区刷写target的chunk1时掉电,在通电之后可以从backup分区恢复target的chunk1,以该target的chunk1继续或重新刷写替代ROM中source的chunk1;然后,以ROM中留存的source的chunk2为基础,结合delta中的delta2继续进行上述第(5)阶段的更新过程。
[0021] 然而,实践表明,按照上述差分包生成和软件更新的安全机制下,产生了一个新的弊端:那就是按照图2所示的方式,将source和target拆分为对应chunk之后所做出的差分包delta的数据量大小将会是按照图1所示的方法(即不拆分chunk而是在整个source和target上进行模糊查找最大匹配基础上的差分计算)所做出的delta的二倍甚至三倍。这种现象的原因是:由于图2所示的方法中人为拆分chunk,因而对模糊查找最大匹配的范围加入了物理界限,导致source与target中很多可以取得高压缩率DB的匹配数据块被人为切断并拆分到不同的chunk当中,这样一来CB与EB就会增加很多。因此,随着被拆分出来的chunk的数量越多,生成delta的size增长就越快。
[0022] 综上所述,在基于差分包delta实现终端设备软件在线更新的机制中,需要在ROM中引入备份以实现断电保护;其中,按照target的size大小开辟备份空间会造成ROM存储空间的浪费;而将source与target拆分为chunk的基础上生成差分包delta,然后逐个chunk进行备份和刷写的方式又会导致所生成的delta数据量增大,压缩效率不高。现有技术中缺少既能够确保更新不受中途掉电(特别是刷写ROM中的source时发生掉电)的影响而发生异常,又可以节约ROM的备份空间,同时还保证delta差分包具有高压缩率的更新方案。

发明内容

[0023] 鉴于上述现有技术中存在的以上需要,本发明提出一种实现软件在线更新的装置、系统和方法。针对现有技术中按照target的size大小开辟备份空间会造成ROM存储空间的浪费,而现有技术将source与target拆分为固定的对应chunk的差分机制又会导致source和target中可产生高压缩率DB的匹配数据块被拆分到多个chunk中,因而在delta中该匹配数据块不必要地产生出多个DB+EB+CB的碎片的问题,本发明通过“最大限度的重复利用source可用部分”的原则,有效减少这种碎片化的情况,优化最终delta的数据量大小,改善delta的压缩率,并且ROM中开辟预定数据块大小的备份空间,实现断电保护的备份机制,一方面节约了ROM备份空间,另一方面保证了升级过程的系统安全性。
[0024] 本发明提供了一种用于软件在线更新的差分包生成装置,其特征在于,包括:
[0025] 目标数据划分模块,将软件更新的目标数据划分为若干个数据块单元,每个数据块单元的大小均小于或者等于指定数据块大小;
[0026] 源数据划分模块,针对目标数据的任一个所述数据块单元,确定对应于该数据块单元的源数据最大可用部分;
[0027] 差分运算模块,用于针对目标数据的任一个所述数据块单元与对应该数据块单元的源数据最大可用部分,查找二者的匹配数据块;并通过对匹配数据块进行差分运算,获得对应该数据块单元的差分包元素;
[0028] 差分包生成模块,利用全部的差分包元素组成用于更新目标数据的差分包。
[0029] 优选的是,所述源数据最大可用部分是未被与目标数据的当前数据块单元相比处于低位地址或高位地址的目标数据数据块单元替代的源数据数据块。
[0030] 进一步优选的是,目标数据划分为m个数据块单元,将目标数据的任一个数据块单元表示为chunk(n),对应该数据块单元chunk(n)的源数据最大可用部分为源数据中未被目标数据的低位地址的数据块单元chunk(1)至chunk(n-1)替代的数据块;即,对应该数据块单元chunk(n)的源数据最大可用部分为源数据的起始地址为chunk_size(1)+chunk_size(2)…+chunk_size(n-1)且大小为source_size-(chunk_size(1)+chunk_size(2)…+chunk_size(n-1))的数据块;其中chunk_size(i)为目标数据的数据块单元chunk(i)的大小(1≤i≤n-1),source_size为源数据整体的大小。
[0031] 或者,进一步优选的是,目标数据划分为m个数据块单元,将目标数据的任一个数据块单元表示为chunk(n),对应该数据块单元chunk(n)的源数据最大可用部分为源数据中未被目标数据的高位地址的数据块单元chunk(n+1)至chunk(m)替代的数据块。即,对应该数据块单元chunk(n)的源数据最大可用部分为源数据的起始地址为0、大小为source_size-(chunk_size(n+1)+…+chunk_size(m-1)+chunk_size(m))的数据块;其中chunk_size(i)为目标数据的数据块单元chunk(i)的大小(n+1≤i≤m),source_size为源数据整体的大小。
[0032] 优选的是,所述指定数据块大小是在终端设备的ROM中开辟的备份空间的大小。
[0033] 优选的是,差分运算模块对目标数据的任一个所述数据块单元与对应该数据块单元的源数据最大可用部分二者中的匹配数据块进行差分运算生成差分数据块DB;将该目标数据的数据块单元中不属于所述匹配数据块的部分作为额外数据块EB,并相应生成控制数据块CB;将所述DB、EB与CB作为实际数据,生成对应该数据块单元的差分包元素。
[0034] 优选的是,差分包生成装置还包括:差分包元素头部信息生成模块,用于每一个差分包元素生成对应的头部信息。进一步优选的是,计算每个差分包元素所对应的源数据可用部分的hash值,以及每个差分包元素所对应的目标数据的数据块单元的hash值,存入差分包元素对应的所述头部信息。进一步优选的是,所述差分包元素对应的所述头部信息包括以下信息的至少一项:源数据可用部分的起始位置信息、源数据可用部分大小的信息、目标数据数据块单元的写入位置信息、目标数据数据块单元大小的信息、本差分包元素大小的信息、本差分包元素在差分包中的偏移位置信息。
[0035] 优选的是,差分包生成模块用于生成一个差分包的总体头部信息,并且在该总体头部信息中记录差分包当中差分包元素的数量。进一步优选的是,所述总体头部信息包括整个源数据的hash签名以及整个目标数据的hash签名。
[0036] 本发明提供了一种用于软件在线更新的差分包生成方法,其特征在于,包括:
[0037] 目标数据划分步骤,将软件更新的目标数据划分为若干个数据块单元,每个数据块单元的大小均小于或者等于指定数据块大小;
[0038] 源数据划分步骤,针对目标数据的任一个所述数据块单元,确定对应于该数据块单元的源数据最大可用部分;
[0039] 差分运算步骤,用于针对目标数据的任一个所述数据块单元与对应该数据块单元的源数据最大可用部分,查找二者的匹配数据块;并通过对匹配数据块进行差分运算,获得对应该数据块单元的差分包元素;
[0040] 差分包生成步骤,利用全部的差分包元素组成用于更新目标数据的差分包。
[0041] 优选的是,所述源数据最大可用部分是未被与目标数据的当前数据块单元相比处于低位地址或高位地址的目标数据数据块单元替代的源数据数据块。
[0042] 进一步优选的是,目标数据划分为m个数据块单元,将目标数据的任一个数据块单元表示为chunk(n),对应该数据块单元chunk(n)的源数据最大可用部分为源数据中未被目标数据的低位地址的数据块单元chunk(1)至chunk(n-1)替代的数据块;即,对应该数据块单元chunk(n)的源数据最大可用部分为源数据的起始地址为chunk_size(1)+chunk_size(2)…+chunk_size(n-1)且大小为source_size-(chunk_size(1)+chunk_size(2)…+chunk_size(n-1))的数据块;其中chunk_size(i)为目标数据的数据块单元chunk(i)的大小(1≤i≤n-1),source_size为源数据整体的大小。
[0043] 或者,进一步优选的是,目标数据划分为m个数据块单元,将目标数据的任一个数据块单元表示为chunk(n),对应该数据块单元chunk(n)的源数据最大可用部分为源数据中未被目标数据的高位地址的数据块单元chunk(n+1)至chunk(m)替代的数据块。即,对应该数据块单元chunk(n)的源数据最大可用部分为源数据的起始地址为0、大小为source_size-(chunk_size(n+1)+…+chunk_size(m-1)+chunk_size(m))的数据块;其中chunk_size(i)为目标数据的数据块单元chunk(i)的大小(n+1≤i≤m),source_size为源数据整体的大小。
[0044] 优选的是,所述指定数据块大小是在终端设备的ROM中开辟的备份空间的大小。
[0045] 优选的是,差分运算步骤中,对目标数据的任一个所述数据块单元与对应该数据块单元的源数据最大可用部分二者中的匹配数据块进行差分运算生成差分数据块DB;将该目标数据的数据块单元中不属于所述匹配数据块的部分作为额外数据块EB,并相应生成控制数据块CB;将所述DB、EB与CB作为实际数据,生成对应该数据块单元的差分包元素。
[0046] 优选的是,差分包生成方法还包括:差分包元素头部信息生成步骤,用于每一个差分包元素生成对应的头部信息。进一步优选的是,计算每个差分包元素所对应的源数据可用部分的hash值,以及每个差分包元素所对应的目标数据的数据块单元的hash值,存入差分包元素对应的所述头部信息。进一步优选的是,所述差分包元素对应的所述头部信息包括以下信息的至少一项:源数据可用部分的起始位置信息、源数据可用部分大小的信息、目标数据数据块单元的写入位置信息、目标数据数据块单元大小的信息、本差分包元素大小的信息、本差分包元素在差分包中的偏移位置信息。
[0047] 优选的是,差分包生成步骤用于生成一个差分包的总体头部信息,并且在该总体头部信息中记录差分包当中差分包元素的数量。进一步优选的是,所述总体头部信息包括整个源数据的hash签名以及整个目标数据的hash签名。
[0048] 本发明提供了一种实现软件在线更新的更新装置,其特征在于,包括:
[0049] 差分包获得模块,用于在线下载获得差分包;
[0050] 源数据可用部分确定模块,从所述差分包中提取任一个差分包元素,确定对应于该差分包元素的源数据最大可用部分;
[0051] 目标数据生成模块,用于将任一个所述差分包元素与ROM中存储的源数据最大可用部分结合,获得与该差分包元素对应的目标数据的数据块单元;
[0052] 备份模块,将该目标数据的数据块单元刷写至ROM的备份空间;
[0053] 源数据更新模块,用于将该目标数据的数据块单元刷写至ROM的对应位置,替代源数据中对应的数据块;最终为差分包中的每个差分包元素生成对应的目标数据的数据块单元并将其刷写至ROM替代源数据。
[0054] 优选的是,所述源数据最大可用部分是ROM中未被目标数据的数据块单元替代的源数据数据块。
[0055] 进一步优选的是,所述差分包包括m个差分包元素,其中任一个差分包元素delta(n)对应的目标数据的数据块单元表示为chunk(n);源数据可用部分确定模块从所述差分包中提取任一个差分包元素delta(n),对应该差分包元素delta(n)的源数据最大可用部分是源数据中未被目标数据的低位地址的数据块单元chunk(1)至chunk(n-1)替代的数据块;即,源数据最大可用部分是源数据中起始地址为chunk_size(1)+chunk_size(2)…+chunk_size(n-1)、大小为source_size-(chunk_size(1)+chunk_size(2)…+chunk_size(n-1))的数据块,其中chunk_size(i)为目标数据的数据块单元chunk(i)的大小(1≤i≤n-1),source_size为源数据整体的大小。
[0056] 或者,进一步优选的是,所述差分包包括m个差分包元素,其中任一个差分包元素delta(n)对应的目标数据的数据块单元表示为chunk(n);源数据可用部分确定模块从所述差分包中提取任一个差分包元素delta(n),对应该差分包元素delta(n)的源数据最大可用部分是源数据中未被目标数据的高位地址的数据块单元chunk(n+1)至chunk(m)替代的数据块;即,源数据最大可用部分是源数据中起始地址为0、大小为source_size-(chunk_size(n+1)+…+chunk_size(m-1)+chunk_size(m))的数据块,其中chunk_size(i)为目标数据的数据块单元chunk(i)的大小(n+1≤i≤m),source_size为源数据整体的大小。
[0057] 优选的是,所述差分包包括m个差分包元素,其中任一个差分包元素delta(n)对应的目标数据的数据块单元表示为chunk(n),源数据更新模块以该目标数据的数据块单元chunk(n)刷写替代源数据中起始地址为chunk_size(1)+chunk_size(2)+…+chunk_size(n-1)且大小等于chunk_size(n)的数据块,其中chunk_size(i)为目标数据的数据块单元chunk(i)的大小(1≤i≤n)。
[0058] 优选的是,所述差分包包括m个差分包元素,其中任一个差分包元素delta(n)对应的目标数据的数据块单元表示为chunk(n),源数据更新模块以该目标数据的数据块单元chunk(n)刷写替代起始地址为source_size-(chunk_size(n)+…+chunk_size(m-1)+chunk_size(m))且大小等于chunk_size(n)的数据块,其中chunk_size(i)为目标数据的数据块单元chunk(i)的大小(n≤i≤m),source_size为源数据整体的大小。
[0059] 优选的是,更新装置还进一步包括:差分包匹配验证模块,用于HASH验证下载的差分包与ROM中源数据source是否匹配;如果匹配则启动针对source的软件更新。
[0060] 优选的是,更新装置还进一步包括:目标数据验证模块,用于在根据差分包元素生成了对应的目标数据的数据块单元后,根据该差分包元素的头部信息,HASH校验该目标数据的数据块单元。
[0061] 优选的是,所述源数据可用部分确定模块确定了对应于差分包元素的源数据最大可用部分后,HASH验证该源数据最大可用部分是否与该差分包元素的头部信息相匹配,匹配的情况下启动应用该差分包元素实现的更新过程。
[0062] 本发明提供了一种实现软件在线更新的更新方法,其特征在于,包括:
[0063] 差分包获得步骤,用于在线下载获得差分包;
[0064] 源数据可用部分确定步骤,从所述差分包中提取任一个差分包元素,确定对应于该差分包元素的源数据最大可用部分;
[0065] 目标数据生成步骤,用于将任一个所述差分包元素与ROM中存储的源数据最大可用部分结合,获得与该差分包元素对应的目标数据的数据块单元;
[0066] 备份步骤,将该目标数据的数据块单元刷写至ROM的备份空间;
[0067] 源数据更新步骤,用于将该目标数据的数据块单元刷写至ROM的对应位置,替代源数据中对应的数据块;最终为差分包中的每个差分包元素生成对应的目标数据的数据块单元并将其刷写至ROM替代源数据。
[0068] 优选的是,所述源数据最大可用部分是ROM中未被目标数据的数据块单元替代的源数据数据块。
[0069] 进一步优选的是,所述差分包包括m个差分包元素,其中任一个差分包元素delta(n)对应的目标数据的数据块单元表示为chunk(n);在源数据可用部分确定步骤中,从所述差分包中提取任一个差分包元素delta(n),对应该差分包元素delta(n)的源数据最大可用部分是源数据中未被目标数据的低位地址的数据块单元chunk(1)至chunk(n-1)替代的数据块;即,源数据最大可用部分是源数据中起始地址为chunk_size(1)+chunk_size(2)…+chunk_size(n-1)、大小为source_size-(chunk_size(1)+chunk_size(2)…+chunk_size(n-1))的数据块,其中chunk_size(i)为目标数据的数据块单元chunk(i)的大小(1≤i≤n-1),source_size为源数据整体的大小。
[0070] 或者,进一步优选的是,所述差分包包括m个差分包元素,其中任一个差分包元素delta(n)对应的目标数据的数据块单元表示为chunk(n);在源数据可用部分确定步骤中,从所述差分包中提取任一个差分包元素delta(n),对应该差分包元素delta(n)的源数据最大可用部分是源数据中未被目标数据的高位地址的数据块单元chunk(n+1)至chunk(m)替代的数据块;即,源数据最大可用部分是源数据中起始地址为0、大小为source_size-(chunk_size(n+1)+…+chunk_size(m-1)+chunk_size(m))的数据块,其中chunk_size(i)为目标数据的数据块单元chunk(i)的大小(n+1≤i≤m),source_size为源数据整体的大小。
[0071] 优选的是,所述差分包包括m个差分包元素,其中任一个差分包元素delta(n)对应的目标数据的数据块单元表示为chunk(n),源数据更新步骤中,以该目标数据的数据块单元chunk(n)刷写替代源数据中起始地址为chunk_size(1)+chunk_size(2)+…+chunk_size(n-1)且大小等于chunk_size(n)的数据块,其中chunk_size(i)为目标数据的数据块单元chunk(i)的大小(1≤i≤n)。
[0072] 优选的是,所述差分包包括m个差分包元素,其中任一个差分包元素delta(n)对应的目标数据的数据块单元表示为chunk(n),源数据更新步骤中,以该目标数据的数据块单元chunk(n)刷写替代起始地址为source_size-(chunk_size(n)+…+chunk_size(m-1)+chunk_size(m))且大小等于chunk_size(n)的数据块,其中chunk_size(i)为目标数据的数据块单元chunk(i)的大小(n≤i≤m),source_size为源数据整体的大小。
[0073] 优选的是,更新方法还进一步包括:差分包匹配验证步骤,用于HASH验证下载的差分包与ROM中源数据source是否匹配;如果匹配则启动针对source的软件更新。
[0074] 优选的是,更新方法还进一步包括:目标数据验证步骤,用于在根据差分包元素生成了对应的目标数据的数据块单元后,根据该差分包元素的头部信息,HASH校验该目标数据的数据块单元。
[0075] 优选的是,所述源数据可用部分确定步骤确定了对应于差分包元素的源数据最大可用部分后,HASH验证该源数据最大可用部分是否与该差分包元素的头部信息相匹配,匹配的情况下启动应用该差分包元素实现的更新过程。
[0076] 本发明还提供了实现软件在线更新的系统,包括上述的差分包生成装置以及更新装置。
[0077] 综上所述,利用本发明提供的差分包生成方法、差分包生成装置,以及基于差分包实现软件在线更新方法与更新装置,通过采用了“最大限度的重复利用source可用部分”的原则,有效抑制了匹配数据块被人为切断所带来的CB与EB的增长,可以获得具有高压缩率的差分包;在终端设备的ROM中开辟预定数据块大小的备份空间,实现断电保护的备份机制,一方面节约了ROM备份空间,另一方面保证了升级过程的系统安全性。
[0078] 说明书附图
[0079] 图1是现有技术中差分包生成过程的示意图;
[0080] 图2是现有技术中将预定数据块大小的ROM备份空间作为断电保护安全机制的情况下差分包生成过程的示意图;
[0081] 图3是本申请实施例1中差分包生成过程的示意图;
[0082] 图4是本申请实施例1获得的差分包的包数据结构;
[0083] 图5是本申请实施例2中在源数据与目标数据的数据块分布结构示意图;
[0084] 图6是本申请实施例2中差分包生成过程的示意图;
[0085] 图7是本申请实施例3中差分包生成装置示意图;
[0086] 图8是本申请实施例3中更新装置示意图。

具体实施方式

[0087] 下面通过实施例,对本发明的技术方案做进一步具体的说明。
[0088] 实施例1
[0089] 由于现有技术的差分机制会导致source和target中可产生高压缩率DB的匹配数据块被拆分到多个chunk中,因而在delta中该匹配数据块不必要地产生出多个DB+EB+CB的碎片。本发明通过有效减少这种碎片化的情况,就可以优化最终delta的数据量大小,改善delta的压缩率。
[0090] 本实施例1首先提供了一种用于软件在线更新的差分包的生成方法,该方法被叫做递归做包法,它的原理在于最大限度地重复利用source的可用部分来达到减少EB部分,进而缩小差分包delta的size。
[0091] 如图3所示的差分包delta的生成方法。其中,首先根据指定数据块大小block-size,将目标数据target划分为m个数据块单元chunk,如图3中的chunk1、chunk2、chunk3、……chunk(m)。其中,每个chunk的大小均小于或者等于该指定数据块大小block-size。所述指定数据块大小block-size是在终端设备的ROM中开辟的备份空间(backup分区)的大小。可以将ROM刷入数据的一次IO操作的最小数据量设定为该备份空间的大小block-size。
[0092] 其中,设从target中划分的第一个chunk为chunk1,chunk1相对于整个target的起始地址chunk_start(1)为0,chunk1的size表示为chunk_size(1);依此推算,对于第n个chunk即chunk(n),起始地址chunk_start(n)为chunk_size(1)+chunk_size(2)…chunk_size(n-1),第n个chunk的size表示为chunk_size(n);显然,当n==m时,chunk_size(m)=target_size-(chunk_size(1)+chunk_size(2)…chunk_size(m-1)),其中target_size是整个target的size。而对于第1至m-1个chunk,在保证每个chunk的大小均小于或者等于该指定数据块大小block-size的前提下,各chunk的大小可以是不等的,也可以是相等的。其中,当决定使各chunk长度相等时,优先选取使其等于block-size。这是因为,由于受到备份空间block-size的限制,各chunk的长度只能小于或等于block-size,而越小的chunk则会导致越大的碎片化,因此当第1至m-1个chunk的长度相等时,优先使其长度等于block-size。当然,根据实际需要,基于对target和source的特定分析,也可以选用不等长的chunk来划分target。
[0093] 针对target的chunk1,按照“最大限度的重复利用source”的原则,确定source的最大可用部分(对于target的chunk1来说,source的最大可用部分是整个source),作为该source的chunk1;通过模糊查找最大匹配的算法,查找target的chunk1和source的chunk1,取得在target的chunk1和source的chunk1二者当中存在的若干大小相同且内容几乎相同(二者不同的数据位在允许的阈值以下)的匹配数据块,对target的chunk1与source的chunk1当中的匹配数据块执行差分运算,生成DB;target的chunk1当中不属于所述匹配数据块的部分作为EB,并相应生成CB;将所述DB、EB与CB作为实际数据,生成对应于target的chunk1的差分包元素delta1。
[0094] 针对target的chunk2,按照“最大限度的重复利用source可用部分”的原则,继续确定source的最大可用部分,作为该source的chunk2;由于在实际升级的过程中,会将差分包元素delta1与source中的匹配数据块结合获得target的chunk1,并且将target的chunk1刷写至ROM替代source中起始地址为0且大小等于chunk_size(1)的数据块,因此如图3中所示,对于target的chunk2来说,升级过程中source的最大可用部分是未被target的chunk1替代的、起始地址为chunk_size(1),大小为source_size-chunk_size(1)的数据块,将该最大可用部分作为source的chunk2;同样通过模糊查找最大匹配的算法,查找target的chunk2和source的chunk2二者中存在的匹配数据块,并对匹配数据块执行差分运算,生成DB;target的chunk2当中不属于所述匹配数据块的部分作为EB,并相应生成CB;将所述DB、EB与CB作为实际数据,生成对应于target的chunk2的差分包元素delta2。
[0095] 按照同样的方法,获得对应target的chunk3的差分包元素delta3。
[0096] 即,针对target的第n个chunk,按照“最大限度的重复利用source”的原则,确定source的最大可用部分是未被第1至n-1个target的chunk替代的数据块,即起始地址为chunk_size(1)+chunk_size(2)…+chunk_size(n-1)、大小为source_size-(chunk_size(1)+chunk_size(2)…+chunk_size(n-1))的数据块,作为该source的第n个chunk;通过模糊查找最大匹配的算法,查找target和source二者的第n个chunk——即target的chunk(n)与source的chunk(n)中——存在的匹配数据块,并对匹配数据块执行差分运算,生成DB;target的第n个chunk当中不属于所述匹配数据块的部分作为EB,并相应地生成CB;将所述DB、EB与CB作为实际数据,生成对应于target的第n个chunk的第n个差分包元素delta(n)。
[0097] 依次类推,直至目标数据target划分出来的m个数据块单元chunk1、chunk2、chunk3、……chunk(m)全部生成对应的差分包元素delta1、delta2、delta3……delta(m)。全部m个差分包元素delta1,delta2、delta3…delta(m)形成差分包元素序列。
[0098] 对于序列中的每一个差分包元素delta1、delta2、delta3…delta(m),分别计算每个差分包元素对应的source可用部分与target的chunk的shal hash值并存入该差分包元素的头部信息当中。
[0099] 创建一个差分包文件的总体头部信息,记录差分包元素的数量以及每一差分包元素delta1,delta2、delta3、…delta(m)的偏移信息。然后,以此总体头部信息为依据,将差分包元素序列中的每个元素delta1,delta2、delta3、…delta(m)的头部信息和实际数据写入该差分包文件,这样获得的该文件就是最终生成的差分包delta。
[0100] 图4示出了按照上述方法获得的差分包delta的包数据结构。其中,差分包的IOT_DELTA_HEADER是该差分包的所述总体头部信息,数据结构IOT_DELTA_HEADER描述了差分包delta作为差分包元素的集合体所必需的信息,具体的信息项目如图4中所示,包括如下内容:
[0101] unsigned char header[8]:表示差分包delta的Magic头信息,使用一个无符号8字节字符数组作为Magic Number,里面保存了常量字符串”ROCKDIFF”,便于调试时搜索和定位差分包delta位置,例如http下载时可以从received content中快速判断是否得到正确内容。
[0102] unsigned intsource_rom_len:表示做包时源数据总体大小;
[0103] unsigned inttarget_rom_len:表示做包时目标数据总体大小;
[0104] source_rom_len和target_rom_len,分别表示source与target整体占ROM的大小;它们都使用32位无符号整形,最大支持ROM size为4GB。
[0105] unsigned intsource_hash:表示做包时总体源数据的hash签名;
[0106] unsigned inttarget_hash:表示做包时总体目标数据的hash签名;
[0107] source_hash与target_hash分别表示source与target整体的hash值,用于在升级前对当前设备ROM中的软件数据做校验。校验逻辑如下:如果ROM中当前软件数据的hash签名与source_hash相同,则允许启动更新;如果ROM中当前软件数据的hash签名与target_hash相同,则表示已更新;如果ROM中当前软件数据的hash签名与source_hash和target_hash均不相同,则表示差分包与ROM中的当前软件不匹配。
[0108] intchunk_number:表示差分包delta中包含的差分包元素delta1、delta2…delta(m)的个数。
[0109] 图4中的IOT_DELTA_CHUNK[1]、IOT_DELTA_CHUNK[2]、IOT_DELTA_CHUNK[3]、IOT_DELTA_CHUNK[4]……IOT_DELTA_CHUNK[m]的序列表示的是各差分包元素delta1、delta2…delta(m)的头部信息,每个差分包元素delta1、delta2…delta(m)都拥有一个对应的IOT_DELTA_CHUNK结构的头部信息,这些头部信息的数据在差分包中紧挨着IOT_DELTA_HEADER头信息,IOT_DELTA_CHUNK数据结构描述了单个chunk在升级阶段所用到的重要信息,具体的信息项目如图4中所示,包括如下内容:
[0110] int type:表示升级类型;type为32位整形数据,表示当前chunk的升级类型;做包工具根据传入参数在做包阶段可以把各个差分包元素划分为CHUNK_DIFF和CHUNK_RAW两种类型;CHUNK_DIFF表示差分数据类型,即该差分包元素是按照上面介绍的差分算法生成的;而CHUNK_RAW则表示RAW类型数据,即该元素是target中本chunk的原数据,一般在差分效果很差的情况,做包工具会使用本类型,因为采用以chunk的原数据直接刷写方式,在运行上高于DIFF差分方式的更新效率。
[0111] unsigned intsource_base:表示更新中可用的源数据source的起始位置;
[0112] unsigned intsource_len:表示更新中可用的源数据source的大小;
[0113] unsigned inttarget_base:表示更新生成的目标数据target的写入位置;
[0114] unsigned inttarget_len:表示更新生成的目标数据target的大小;
[0115] unsigned intpatch_len:表示本差分包元素的大小;
[0116] unsigned intpatch_offset:表示本差分包元素在差分包delta中的偏移位置;
[0117] 根据以上patch_len和patch_offset信息,可以从差分包delta中提取出本项IOT_DELTA_CHUNK所对应的差分包元素,即图中的patch_data;当type属于CHUNK_DIFF的情况下,根据source_base和source_len确定更新过程中ROM内可用的source数据,利用可用的source数据和差分包元素可以获得target中属于本chunk的目标数据;根据target_base和target_len确定将target的该chunk刷写入ROM的位置。
[0118] unsigned intsource_hash:表示做包时记录的source的chunk数据的hash签名;
[0119] unsigned inttarget_hash:表示做包时记录的target的chunk数据hash签名;
[0120] 以上source_hash与target_hash用于实现对更新应用的source数据和更新后生成的target数据的校验。
[0121] 在按照上述方法生成的差分包的基础上,本实施例1进而提供了一种实现软件在线更新的方法,包括以下步骤:
[0122] 下载获得差分包delta;
[0123] HASH验证下载的差分包delta与ROM中源数据source是否匹配;具体是,判断差分包delta的IOT_DELTA_HEADER的source_hash与ROM中当前软件数据的hash签名是否匹配;如果匹配则启动针对source的软件更新;
[0124] 根据差分包delta的IOT_DELTA_CHUNK[1]记录的patch_len和patch_offset信息,提取差分包元素delta1;根据IOT_DELTA_CHUNK[1]记录的source_base和source_len,确定更新过程中ROM内source的可用部分数据(对于差分包元素delta1来说是整个source);并且根据IOT_DELTA_CHUNK[1]记录的source_hash,HASH验证ROM中source的可用部分数据与source_hash是否相匹配,在匹配的情况下启动应用差分包元素delta1实现的更新过程;
[0125] 在应用差分包元素delta1实现的更新过程中,将差分包元素delta1与source中的该可用部分结合,获得图3所示的target的chunk1;
[0126] 根据IOT_DELTA_CHUNK[1]记录的target_hash,HASH校验target的chunk1是否与target_hash匹配;在校验匹配的情况下,将该target的chunk1刷写至ROM中的备份空间backup分区;
[0127] 根据IOT_DELTA_CHUNK[1]记录的target_base和target_len,将target的chunk1刷写入ROM的对应位置,替代source中起始地址为0且大小等于chunk_size(1)的数据块;
[0128] 进一步根据差分包delta的IOT_DELTA_CHUNK[2]记录的patch_len和patch_offset信息,提取差分包元素delta2;根据IOT_DELTA_CHUNK[2]记录的source_base和source_len,确定更新过程中ROM内source的可用部分数据,对于delta2来说是,source的可用部分是未被target的chunk1替代的、起始地址为chunk_size(1)、大小为source_size-chunk_size(1)的数据块;并且根据IOT_DELTA_CHUNK[2]记录的source_hash,HASH验证source的可用部分是否与source_hash相匹配,在匹配的情况下启动应用差分包元素delta2实现的更新过程;
[0129] 将差分包元素delta2与source中的可用部分结合,获得图3所示的target的chunk2;
[0130] 根据IOT_DELTA_CHUNK[2]记录的target_hash与target的chunk2进行HASH校验;在校验匹配的情况下,将该target的chunk2刷写至ROM中的备份空间backup分区;
[0131] 根据IOT_DELTA_CHUNK[2]记录的target_base和target_len,将target的chunk2刷写入ROM的对应位置,替代source中起始地址为chunk_size(1)且大小等于chunk_size(2)的数据块;
[0132] 按照同样的方法,根据差分包delta的差分包元素delta3,delta4,生成目标数据target的chunk3、chunk4,并将chunk3、chunk4刷写入ROM的对应位置替代source中对应的数据块。
[0133] 即,根据差分包delta的IOT_DELTA_CHUNK[n]记录的patch_len和patch_offset信息,提取差分包元素delta(n);根据IOT_DELTA_CHUNK[n]记录的source_base和source_len,确定更新过程中ROM内source的可用数据,对于delta(n)来说是,source的可用部分是未被target的chunk1、chunk2…chunk(n-1)替代的、起始地址为chunk_size(1)+chunk_size(2)…+chunk_size(n-1)、大小为source_size-(chunk_size(1)+chunk_size(2)+…+chunk_size(n-1))数据块;并且根据IOT_DELTA_CHUNK[n]记录的source_hash,HASH验证source的可用部分是否相匹配,在匹配的情况下启动应用差分包元素delta(n)实现的更新过程;
[0134] 将差分包元素delta(n)与source中的可用部分结合,获得图3所示的target的chunk(n);
[0135] 根据IOT_DELTA_CHUNK[n]记录的target_hash,HASH校验target的chunk(n);在校验匹配的情况下,将该target的chunk(n)刷写至ROM中的备份空间backup分区;
[0136] 根据IOT_DELTA_CHUNK[n]记录的target_base和target_len,将target的chunk(n)刷写入ROM的对应位置,替代source中起始地址为chunk_size(1)+chunk_size(2)+…+chunk_size(n-1)且大小等于chunk_size(n)的数据块;
[0137] 依次类推,直至根据差分包delta的全部m个差分包元素均生成了目标数据target的chunk,并将chunk刷写入ROM的对应位置替代source中对应的数据块,从而完成了基于差分包delta实现的软件在线更新过程。
[0138] 从上述差分包生成方法以及基于差分包实现的软件在线更新方法可以看到,由于采用了“最大限度的重复利用source可用部分”的原则,对于target中的每一个chunk,可以在source的最大可用部分范围内搜索匹配数据块,有效抑制了匹配数据块被人为切断所带来的CB与EB的增长,可以获得具有高压缩率的差分包;在终端设备的ROM中开辟预定数据块大小的备份空间,实现断电保护的备份机制,一方面节约了ROM备份空间,另一方面保证了升级过程的系统安全性。
[0139] 实施例2
[0140] 在实施例1中,如图3所示,预设将source中以0作为起始地址的数据块刷写替换为target的chunk1,并继续向着source的末尾依次对source中各数据块分别以target的chunk2、chunk3…chunk(m)进行刷写替换。通过实践表明,上述chunk的预设刷写更新顺序并不能在所有的实际应用情况中均使差分包delta达到最优的压缩效果。
[0141] 软件更新的目标数据target在较多的情况下是在源数据source中插入了一定量的代码段,如果被插入的代码段主要分布在源数据source的末尾及其附近,则采用实施例1的方法生成差分包能够取得比较好的效果。相反,如果在源数据source的起始及其附近插入了一定量的代码段,则会出现下面图5中所示出的情况。
[0142] 如图5所示,软件更新的源数据source包括数据块s_chunk1、s_chunk2、s_chunk3…s_chunk(n-1)、s_chunk(n);目标数据target主要是在source的起始插入了新的数据块chunk1,而target中的数据块chunk2、chunk3、chunk4…chunk(n)分别高度近似匹配于source的数据块s_chunk1、s_chunk2、s_chunk3…s_chunk(n-1)。在这种情况下,如果按照实施例1的预设刷写更新顺序实施更新,则会发现,虽然source的数据块s_chunk1最大匹配于target的chunk2,但是由于target中新插入的chunk1将会刷写替换掉source的数据块s_chunk1的全部或大部分,因而对target的chunk2生成差分包元素时与之最大匹配的数据块s_chunk1不是source中的可用部分,不能用于与target的chunk2进行差分计算,这就降低了差分运算的压缩效率;同样,在实际更新过程中,由于source的数据块s_chunk1首先被target中新插入的chunk1刷写替换掉,因此在产生target的chunk2的过程中不能继续应用在source数据中原本与之最大匹配的s_chunk1。
[0143] 因此,相比于实施例1中采用的正向递归的差分包生成方法,针对目标数据target相比于源数据source主要在source的前部插入新数据导致source的原有数据向后偏移的情况,更为适用于本实施例2介绍的反向递归的差分包生成方法。
[0144] 实施例2的反向递归差分包生成方法如图6所示。其中,根据指定数据块大小block-size,将目标数据target划分为m个数据块单元chunk,每个chunk的大小均小于或者等于该指定数据块大小block-size,所述指定数据块大小block-size是在终端设备的ROM中开辟的备份空间(backup分区)的大小。
[0145] target的第m个数据块单元chunk(m)的起始地址chunk_start(m)=target_size-chunk_size(m),chunk(m)的size表示为chunk_size(m);target的第m-1个数据块单元chunk(m-1)的起始地址chunk_start(m-1)=target_size-(chunk_size(m)+chunk_size(m-1)),第m-1个数据单元的size表示为chunk_size(m-1);其中,target_size是target的size。
[0146] 针对target的第m个数据块单元chunk(m),确定source的最大可用部分作为该source的chunk(m);对于target的chunk(m)来说,source的最大可用部分起始地址为0,大小为source_size,也就是整个source;通过模糊查找最大匹配的算法取得在target的chunk(m)和source的chunk(m)二者当中的匹配数据块,对匹配数据块执行差分运算,生成DB;target的chunk(m)当中不属于所述匹配数据块的部分作为EB,并相应生成CB;将所述DB、EB与CB作为实际数据,生成对应于target的chunk(m)的差分包元素delta(m)。
[0147] 针对target的chunk(m-1),按照“最大限度的重复利用source可用部分”的原则,继续确定source的最大可用部分;由于在实际升级的过程中,将target的chunk(m)刷写至ROM替代source中起始地址为source_size-chunk_size(m)且大小等于chunk_size(m)的数据块,因此如图6中所示,对于target的chunk(m-1)来说,升级过程中source的最大可用部分是未被target的chunk(m)替代的、起始地址为0、大小为source_size-chunk_size(m)的数据块,将该最大可用部分作为source的chunk(m-1);同样通过模糊查找最大匹配的算法,查找target的chunk(m-1)和source的chunk(m-1)二者中存在的匹配数据块,并对匹配数据块执行差分运算,生成DB;target的chunk(m-1)当中不属于所述匹配数据块的部分作为EB,并相应生成CB;将所述DB、EB与CB作为实际数据,生成对应于target的chunk(m-1)的差分包元素delta(m-1)。
[0148] 按照同样的方法,获得对应target的chunk(m-2)、chunk(m-3)的差分包元素delta(m-2),delta(m-3)等,
[0149] 即,对于target的chunk(n),按照“最大限度的重复利用source可用部分”的原则,确定source的最大可用部分是未被chunk(n+1)…chunk(m-1)、chunk(m)替代的,起始地址为0,大小为source_size-(chunk(n+1)+…+chunk(m-1)+chunk(m))的数据块,将该最大可用部分作为source的chunk(n);查找target的chunk(n)和source的chunk(n)二者中存在的匹配数据块,并对匹配数据块执行差分运算,生成DB;target的chunk(n)当中不属于所述匹配数据块的部分作为EB,并相应生成CB;将所述DB、EB与CB作为实际数据,生成对应于target的chunk(n)的差分包元素delta(n)。
[0150] 依次类推,直至目标数据target划分出来的m个数据块单元chunk全部生成对应的差分包元素delta。全部m个差分包元素delta1,delta2…delta(m)形成差分包元素序列。
[0151] 与实施例1相同,对于序列中的每一个差分包元素delta1,delta2…delta(m),分别计算每个差分包元素对应的source可用部分与target的chunk的shal hash值并存入该差分包元素的头部信息当中。创建一个差分包文件的总体头部信息,记录差分包元素的数量以及每一差分包元素delta1,delta2…delta(m)的偏移信息。然后,以此总体头部信息为依据,将差分包元素序列中的每个元素delta1,delta2…delta(m)的头部信息和实际数据写入该差分包文件,这样获得的该文件就是最终生成的差分包delta。所得差分包delta的数据结构与图4相同,因而不再赘述。
[0152] 在按照上述反向递归的方法生成的差分包的基础上,本实施例2进而提供了一种实现软件在线更新的方法,包括以下步骤:
[0153] 下载获得差分包delta;
[0154] HASH验证下载的差分包与ROM中源数据source是否匹配;如果匹配则启动针对source的软件更新;
[0155] 首先提取差分包delta的差分包元素delta(m);确定更新过程中ROM内source的可用数据,对于delta(m)来说是整个source;HASH验证ROM中source的可用数据是否与source_hash相匹配,在匹配的情况下启动应用差分包元素delta(m)实现的更新过程;
[0156] 在应用差分包元素delta(m)实现的更新过程中,将差分包元素delta(m)与source中的可用部分结合,获得图6所示的target的chunk(m);
[0157] HASH校验target的chunk(m);在校验匹配的情况下,将该target的chunk(m)刷写至ROM中的备份空间backup分区;
[0158] 将target的chunk(m)刷写入ROM的对应位置,替代source中起始地址为source_size-chunk_size(m)且大小等于chunk_size(m)的数据块;
[0159] 进一步提取差分包元素delta(m-1);确定更新过程中ROM内source的可用数据,对于delta(m-1)来说,source的可用部分是未被target的chunk(m)替代的、起始地址为0、大小为source_size-chunk_size(m)的数据块;并且,HASH验证source的可用部分是否与source_hash相匹配,在匹配的情况下启动应用差分包元素delta(m-1)实现的更新过程;
[0160] 在更新过程中,将差分包元素delta(m-1)与source中的可用部分的数据块结合,获得图6所示的target的chunk(m-1);
[0161] HASH校验target的chunk(m-1);在校验匹配的情况下,将该target的chunk(m-1)刷写至ROM中的备份空间backup分区;
[0162] 将target的chunk(m-1)刷写入ROM的对应位置,替代source中起始地址为source_size-(chunk_size(m-1)+chunk_size(m))且大小等于chunk_size(m-1)的数据块;
[0163] 按照同样的方法,根据差分包delta的差分包元素delta(m-2),delta(m-3),生成目标数据target的chunk(m-2)、chunk(m-3),并将chunk(m-2)、chunk(m-3)刷写入ROM的对应位置替代source中对应的数据块。
[0164] 即提取差分包元素delta(n);确定更新过程中ROM内source的可用数据,对于delta(n)来说,source的可用部分是未被target的chunk(n+1)…chunk(m-1)、chunk(m)替代的,起始地址为0、大小为source_size-(chunk_size(n+1)+…+chunk_size(m-1)+chunk_size(m))的数据块,该可用部分作为source的chunk(n);并且,HASH验证source的可用部分是否与source_hash相匹配,在匹配的情况下启动应用差分包元素delta(n)实现的更新过程;
[0165] 在更新过程中,将差分包元素delta(n)与source中的可用部分的数据块结合,获得图6所示的target的chunk(n);
[0166] HASH校验target的chunk(n);在校验匹配的情况下,将该target的chunk(n)刷写至ROM中的备份空间backup分区;
[0167] 将target的chunk(n)刷写入ROM的对应位置,替代source中起始地址为source_size-(chunk_size(n)+…+chunk_size(m-1)+chunk_size(m))且大小等于chunk_size(n)的数据块。
[0168] 依次类推,直至根据差分包delta的全部m个差分包元素均生成了目标数据target的chunk,并将chunk刷写入ROM的对应位置替代source中对应的数据块,从而完成了基于差分包delta实现的软件在线更新过程。
[0169] 本实施例2的差分包生成方法以及基于差分包实现的软件在线更新方法同样基于“最大限度的重复利用source可用部分”的原则,具有实施例1相同的有益效果;对于主要在source的前部插入新数据生成target的情形,实施例2的反向递归差分包可以尽量保证source中与target具有最大匹配的数据段不被过早地刷写替换而不可用,从而保障了差分运算的压缩率。
[0170] 在实际应用中,对于同一个target,如果不易判断其插入的数据在source中的分布位置,则可以分别按照正向和反向递归生成对应的差分包,并且比较两个差分包的压缩效率。
[0171] 实施例3
[0172] 本实施例3首先提供了一种用于软件在线更新的差分包生成装置,该装置可以适用于执行以上介绍的正向或者反向递归的差分包生成方法。
[0173] 如图7所示,本实施例的差分包生成装置包括:
[0174] 目标数据划分模块,用于根据指定数据块大小block-size,将目标数据target划分为m个数据块单元chunk;其中,每个chunk的大小均小于或者等于该指定数据块大小block-size。所述指定数据块大小block-size是在终端设备的ROM中开辟的备份空间(backup分区)的大小,可以将ROM刷入数据的一次IO操作的最小数据量设定为该备份空间的大小block-size。
[0175] 源数据划分模块,用于为目标数据target的任何一个数据块单元chunk(n),分别确定对应于该target的数据块单元chunk(n)的源数据source最大可用部分,表示为source的chunk(n)。在正向递归的情况下,以源数据source中未被在先的第1至n-1个target的chunk替代的数据块,即起始地址为chunk_size(1)+chunk_size(2)…+chunk_size(n-1)、大小为source_size-(chunk_size(1)+chunk_size(2)…+chunk_size(n-1))的数据块,作为源数据source最大可用部分,即source的chunk(n)。在反向递归的情况下,以源数据source中未被在后的第n+1至第m个target的chunk替代的数据块,即起始地址为0、大小为source_size-(chunk_size(n+1)+…+chunk_size(m-1)+chunk_size(m))的数据块,作为源数据source最大可用部分,即source的chunk(n)。
[0176] 差分运算模块,用于针对目标数据target的任何一个数据块单元chunk(n)以及对应于该target的数据块单元chunk(n)的源数据source最大可用部分(即source的chunk(n)),查找target的该数据块单元chunk(n)与source的所述最大可用部分二者中的匹配数据块,并对匹配数据块执行差分运算,生成DB;将该target的数据块单元chunk(n)当中不属于所述匹配数据块的部分作为EB,并相应地生成CB;将所述DB、EB与CB作为实际数据,生成对应于target的数据块单元chunk(n)的差分包元素delta(n)。显然,差分运算模块可以为从目标数据target划分出来的m个数据块单元chunk全部生成对应的差分包元素,全部m个差分包元素delta1,delta2…delta(m)形成差分包元素序列。
[0177] 差分包元素头部信息生成模块,用于为差分包元素序列delta1,delta2…delta(m)中的每一个差分包元素生成对应的头部信息,包括:计算每个差分包元素对应的source可用部分与target的数据块单元chunk的shal hash值并存入该差分包元素的头部信息当中。
[0178] 差分包生成模块,生成一个差分包的总体头部信息,包括在该总体头部信息中记录差分包元素序列中的差分包元素的数量以及每一差分包元素delta1,delta2…delta(m)的偏移信息;以所述总体头部信息为依据,将差分包元素序列中的每个元素delta1,delta2…delta(m)的头部信息和实际数据写入该差分包文件,这样获得的该文件就是最终生成的差分包delta。
[0179] 本实施例3还提供了一种实现软件在线更新的更新装置,该装置可以适用于应用以上介绍的正向或者反向递归的差分包实现软件在线更新。如图8所示,本实施例的更新装置包括:
[0180] 差分包获得模块,用于在线下载获得差分包delta;
[0181] 差分包匹配验证模块,用于HASH验证下载的差分包与ROM中源数据source是否匹配;如果匹配则启动针对source的软件更新;
[0182] 源数据可用部分确定模块,从所述差分包中提取任一个差分包元素delta(n);确定利用该差分包元素delta(n)进行更新过程中ROM内source的可用部分;HASH验证source的可用部分是否与该差分包元素delta(n)的头部信息中记录的source_hash匹配;在匹配的情况下启动应用差分包元素delta(n)实现的更新过程。其中,对于正向迭代的差分包来说,source中的该可用部分是源数据source中未被在先的第1至n-1个target的chunk替代的数据块,即起始地址为chunk_size(1)+chunk_size(2)…+chunk_size(n-1)、大小为source_size-(chunk_size(1)+chunk_size(2)…+chunk_size(n-1))的数据块,表示为source的chunk(n)。在反向递归的情况下,source中的该可用部分是源数据source中未被在后的第n+1至第m个target的chunk替代的数据块,即起始地址为0、大小为source_size-(chunk_size(n+1)+…+chunk_size(m-1)+chunk_size(m))的数据块,表示为source的chunk(n)。
[0183] 目标数据生成模块,用于将该差分包元素delta(n)与ROM中存储的source中的该可用部分结合,获得与该差分包元素delta(n)对应的目标数据target的数据块单元chunk(n)。
[0184] 目标数据验证模块,用于根据该差分包元素delta(n)的头部信息中记录的target_hash,HASH校验该目标数据target的数据块单元chunk(n)。
[0185] 备份模块,在目标数据验证模块对该目标数据target的数据块单元chunk(n)校验匹配的情况下,将该target的chunk(n)刷写至ROM中的备份空间backup分区;
[0186] 源数据更新模块,用于将该target的chunk(n)刷写至ROM的对应位置,替代source中对应的数据块。其中,在正向递归的情况下,被该target的chunk(n)替代的是source中起始地址为chunk_size(1)+chunk_size(2)+…+chunk_size(n-1)且大小等于chunk_size(n)的数据块。在反向递归的情况下,被该target的chunk(n)替代的是source中起始地址为source_size-(chunk_size(n)+…+chunk_size(m-1)+chunk_size(m))且大小等于chunk_size(n)的数据块。这样,源数据更新模块可以为差分包中的每个差分包元素delta1,delta2…delta(m)分别生成target的chunk1、chunk2……chunk(m),并将target的chunk1、chunk2……chunk(m)刷写至ROM替代source的对应部分,最终实现将source整体替换为target。
[0187] 实施例3还可以组成实现软件在线更新的系统,包括图7的差分包生成装置以及图8的更新装置。
[0188] 综上所述,利用本发明提供的差分包生成方法、差分包生成装置,以及基于差分包实现软件在线更新方法与更新装置,通过采用了“最大限度的重复利用source可用部分”的原则,有效抑制了匹配数据块被人为切断所带来的CB与EB的增长,可以获得具有高压缩率的差分包;在终端设备的ROM中开辟预定数据块大小的备份空间,实现断电保护的备份机制,一方面节约了ROM备份空间,另一方面保证了升级过程的系统安全性。
[0189] 以上实施例仅用于说明本发明,而并非对本发明的限制,有需求和供给的关技术领域的普通技术人员,在不脱离本发明的精神和范围的情况下,还可以做出各种变化和变型,因此所有等同的技术方案也属于本发明的范畴,本发明的专利保护范围应由权利要求限定。