DFOTA差分算法

固件升级使用FOTA(Firmware Over-The-Air) 方式时,可以采用传输差分包的形式来减小升级包的大小,能够带来空口传输时间减小、降低终端功耗等优势。目前比较常见的算法有xdelta 使用的Vcdiff Bsdiff 等。
Vcdiff
Vcdiff 可以实现文件的差分并压缩的功能,当原文件为空时,则相当于对新的文件直接压缩。Vcdiff 采用差分文件包含:ADD COPY RUN[ NOOP( )] 等操作方式。生成差分文件前,需要首先进行Vcdiff decoding ,具体采用128 进制来重新编码,带来的好处: 一是在不同的系统中统一采用8 比特的字节编码方式,二是对于小数字则可以节省存储空间;在RF3284 给出的示例将123456789 ,经过编码后表示为MSB+58,MSB+111,MSB+26,0+21 ,二进制值为10111010 11101111 10011010 0010101 ,最高位MSB 用来表示数据是否完成,1 时表示下个字节仍属于同一数据块,即123456789 = 128*(128*(58 * 128 + 111) + 26) + 21 。编码完成后的文件生成差分格式包,也可进行压缩后再进行传输。差分包执行过程示例如下, 旧的文件内容为a b c d e f g h i j k l m n o p ,差分包包含指令COPY 4, 0 ADD 4, w x y z COPY 4, 4 COPY 12, 24 RUN 4, z COPY 指令带有两个参数,第一个为长度,第二个为地址;ADD 指令带有长度和,相应插入的符号信息;RUN 指令将某字符重复多次。
DFOTA差分算法_第1张图片
在生成差分文件时需要进行字符串比较,有后缀树及hash 等方式,Vdelta 中使用快速字符串比较算法(a fast string matching algorithm 可以使用相对其他算法较少的内存空间,hash 表索引?) Vdelta 的过程就是压缩的过程,生成差分包的过程,可以理解为原始包和新的包级联,然后进行压缩,只输出新包部分的信息即为差分包。理解生成差分包过程如下,采用最低3 个字节匹配( 需要使用合适前缀匹配,简单理解当匹配字符串太长时,匹配成功可能性低,较短如一个字符比较时,索引开销可能比存储Index 还大)
DFOTA差分算法_第2张图片
虽然Vcdiff 本身压缩能够覆盖大部分使用,在Vcdiff 中还支持二次压缩以达到更好的效果,也就是对生成的信息再一次压缩,压缩方式可以在文件头信息中携带。另外在考虑资源消耗方面,Vcdiff 支持分成多块(window) ,这样可以减少过程中内存等资源的需求,Vcdiff 差分包格式主要信息格式Header Info+Window1 Info + Window2…
Bsdiff
Bsdiff 采用差分文件信息包含三个部分: 一是ADD INSERT 的控制信息;一部分是包含概率匹配中不同字节差异文件(difference) ;最后一部分是不属于概率匹配内容的额外信息(extra 文件) Bsdiff 算法使用的的前提条件,一是文件直接修改引起的变化相当稀疏,二是数据和代码倾向于成块进行移动,导致大部分不同地址调整了相同的大小。ADD 指令操作对象包含源文件中信息的偏移、长度以及需要添加的值;INSERT 包含需要添加的长度以及需要添加的信息。区别于Vcdiff Bsdiff 只是差分文件生成的作用,而生成的文件并不会比源文件小,但其具有高度可压缩性,使得压缩后的差分文件比较小,参考文献中使用bzip2 的压缩方法。生成差分包的时候,首先对旧文件进行后缀排序( 使用faster string matching 算法) ,然后使用二分查找的方法将新文件中的字符串和旧文件字符串进行比较生成相应的diff 文件。而差分包与旧有的文件生成新文件时会简单些,直接利用差分信息进行处理,无需排序等操作。
如下为排序过程,首先按照字符值直接排序,第一次排序完成后,13 6 5 的字符顺序即可确定,由于这些字符唯一,而其他出现重叠的字符需要根据其后续字符再次排序,如index3 e index12 e ,需要使用其后续的第一个字符o $ 比较再次排序,依次类推,直至将所有的元素排序完成。
DFOTA差分算法_第3张图片
字符串查找方式如下,采用二分法,示例需要找到”obeo” 字符串,先找到I index ( 0 + 13 ) / 2 的位置6 ,对应原来字符串的index 10 进行字符串比较,obeo > obe$ 因此再到( 6 + 13 ) / 2 的位置即index 9 对应元字符串的index 7 ,以此类推。通过字符串的查找和比较,从新文件头字符串开始,依次到旧文件排序信息中查找字符串位置进行对比,得到旧文件的位置和匹配长度信息等。
DFOTA差分算法_第4张图片
Bsdiff 生成的差分包由几个部分组成,Header 文件头、控制信息、diff 部分的信息,其中头文件包含目标文件大小、控制信息长度等,以及extra 部分信息。通过两种操作ADD INSERT 进行合并。控制信息用三元组表示,由add 长度,insert 长度以及从旧文件忽略长度三部分表示。执行方式如下
DFOTA差分算法_第5张图片
参考文档
RFC3284 the VCDIFF Generic Differencing and Compression Data Format
naive differences of executable code
FASTER SUFFIX SORTING
http://www.daemonology.net/bsdiff/
Delta Algorithms_ An Empirical Analysis, ACM Trans
An Empirical Study of Delta Algorithms

你可能感兴趣的:(嵌入式系统,程序设计)