具体实施方式
提供了系统和方法,用于预处理文件的原始和新版本作为原始和新版本之间的差别文件产生的一部分。该预处理支持进一步减小差别文件的大小。软件/文件版本间的可执行改变包括限定为源代码改变的主要改变/逻辑改变以及次要改变。次要改变一般是由主要改变引起的并由软件编译器/链接器应用来产生。次要改变包括由主要改变引起的并由软件编译器/链接器应用所产生的地址改变、指针目标地址改变以及地址偏移改变。所提供的预处理系统和方法在文件版本间使用近似规则来去除/减少次要改变,并把有关去除这些改变的信息编码到对应的差别文件的信息中。
在此详细描述用于在电子文件的两个版本之间产生差别文件的系统和方法,其在这里称为文件差分。图1是示出在一个实施例中的文件差分和更新的框图。所述文件差分和更新包括差分组件和更新组件。差分组件,此处称为文件差别生成器,根据电子文件的原始版本和新版本在第一基于处理器的或计算机系统中产生差别文件。更新组件,此处称为更新生成器,使用差别文件和原始文件的掌控拷贝在第二基于处理器的或计算机系统上产生新文件的拷贝。
在以下说明中,介绍了若干具体细节以提供对本发明的实施例的完全理解和实现说明。但是,本领域的技术人员将认识到本发明可以不需具体细节的一个或多个而实现,或利用其他组件、系统等等来实现。在其他例子中,不显示或不详细说明公知的结构或操作,以避免模糊本发明的方面。
参考图1,第一计算机系统102和第二计算机系统104通过通信路径106通信。如在本领域公知的,计算机102和104包括一起工作的计算组件和设备的任何集合。计算机系统102和104也可以是较大的计算机系统或网络中的组件或子系统。
通信路径106包括任何介质,文件通过所述介质在计算机102和104之间交换和传送。因此,路径106包括无线连接、有线连接和混合无线/有线连接。通信路径106还包括到包括本地局域网(LAN)、城域网(MAN)、广域网(WAN)、专用网、局间或后端网络以及Internet的网络的耦合或连接。此外,通信路径106包括可移动的固定介质如软盘、硬盘驱动器和CD-ROM盘,以及电话线、总线和电子邮件消息。
第一通信系统102接收电子文件的原始的、或旧的版本110和新版本112。新文件112通常是原始文件110的更新或修正的版本,但并不限制于此。电子文件110和112包括:软件文件,包括动态链接库文件、共享对象文件、嵌入式软件组件(EBSC)、固件文件、可执行文件;数据文件,包括十六进制数据文件、系统配置文件;以及包括个人使用数据的文件,但并不限制于此。因为任何类型的文件都可以看作字节流,以下依据上下文而可将文件描述为字节流。
如下所述,文件差别生成器114的组件接收新文件112,把它与原始文件110比较,并计算被比较文件间的差别。这些差别包括被比较文件间的字节级差别,但并不限制于此。文件差别生成器114在比较期间产生差别文件116,这里称作增量文件116。
一个实施例的文件差别生成器114耦合于主机系统102的组件之间,其中所述组件包括至少一个处理器、至少一个控制器、至少一个存储器设备以及至少一个总线,但并不限制于此。一个实施例的文件差别生成器114的组件包括至少一个预处理子系统124和至少一个差分子系统134。预处理子系统124也称为预处理器124,包括在预处理算法、程序或例程的至少一个的控制下运行的至少一个处理器。同样,差分子系统134包括在差分算法、程序或例程的至少一个的控制下运行的至少一个处理器。
增量文件116的内容提供了对新文件112和原始文件110之间差别的有效表示。增量文件116包括表现有关文件的新的或当前版本与该文件的以前版本之间差别的元数据以及代替和/或插入操作的真实数据,如2002年5月13日提出的标题为“Byte-Level File Differencing and UpdatingAlgorithms”、申请专利号10/146,545的美国专利申请所述。文件差别生成器114用最少量的字节和预定义的格式或协议在增量文件116中提供原始110和新112文件之间的任何差别,从而提供在空间上优化的增量文件。
增量文件116通过通信路径106传送或传输到另一处理系统104。传送之前,增量文件116可用本领域公知的压缩技术来压缩,但并不限制于此。掌控在接收系统104上的更新生成器118用增量文件116与掌控的原始文件110H一起产生或创建新文件的拷贝112C。新文件的拷贝112C随后用于更新掌控在目的为修正或更新的客户设备上的原始文件110H。当该更新过程完成时,现在存储在第二计算机系统上的新文件与第一计算机系统102中接收的新文件112一致。
原始文件和新文件之间的差别通常比新文件小,如果是差别而不是整个新文件被传输和存储,则显著节省了存储和传输。这对掌控着通过可通常是慢速和昂贵的连接如无线或蜂窝状连接而更新的程序的移动电子设备(客户设备)特别重要。增量文件减小的大小提供了很多改进,其中之一包括将增量文件传输到客户设备所需的带宽减小;较小的文件意味着传送需要较小的带宽。而且,较小的文件需要较少的传输时间,并且因此降低了文件传送被中断的可能性且同时减少了接收文件中的传输错误。另外,通过非安全连接传输增量文件比传输新软件映像更安全。所有这些改进提高了用户满意度。
图2是在图1的实施例中的产生增量文件的流程图。在块204,当新文件和原始文件在第一处理或计算机系统中被接收时,操作开始。对应于新和原始文件的映射文件也被接收。映射文件是包括软件映像的每个符号的开始地址和大小的高级文本文件,其中符号实例包括函数和全局变量。映射文件由编译器/链接器应用来输出,并且也称为日志文件、符号文件和/或列表文件。
在块206,在新文件和原始文件的内容之间执行预处理操作以便识别两文件内容的共有段和简单模式。通常,预处理使用所识别共有段和模式来减少/去除新和原始文件间的次要改变。一个实施例的预处理包括减少和/或去除由与逻辑改变相关联的地址偏移所引起的原始和新文件之间的改变,如下所述,但并不限制于此。于是,该预处理减少了文件共有段之间的差别,包括次要改变,因此提高了差别计算的效率。
预处理之后,在块208,计算新文件和经修改原始文件之间的字节级差别。在块210,编码和合并经计算的差别并通过遵循预定义的编码格式而产生增量文件。如果可能,在块212,然后如本领域公知的优化增量文件以进一步减小文件大小,并且在块214,提供优化的增量文件作为输出。
如上所述,在新文件和原始文件的内容之间执行预处理操作以便识别两文件内容中的共有段和简单模式。共有段和简单模式的知识用于减少/去除次要改变,因此造成整体性能增强。
如上所述,电子文件或软件更新在系统和客户设备之间的传输会花大量时间,尤其是通过低带宽通道传输时。一个实例是蜂窝电话软件升级。典型的实现是通过蜂窝无线耦合发送新和原始软件版本之间的字节级文件差别或改变。出现相当大的传递时间是因为可执行文件的新和原始版本之间的差别比其对应的源文件之间的差别更复杂。
出现这些新和原始文件版本之间的复杂差别一部分是因为源文件中小的改变经常引入贯穿可执行文件的较大改变。例如,可执行文件中引入的改变包括两种主要类型的改变:主要改变和次要改变。主要改变,也称为逻辑改变,是由从原始文件中删除源代码行、添加源代码行到新文件以及修改源代码行所引起的源代码改变。次要改变限定为包括但不局限于由主要改变引起并由编译器/链接器应用产生的地址改变、指针目标地址改变以及地址偏移改变。下面所述的预处理例程减少/去除了次要改变并把有关去除这些改变的信息编码到对应增量文件的信息中。
对可执行文件中引入的次要改变的分析从假设可执行文件包括代码(文本)段和数据段开始。图3是框图300,示出可执行文件的原始版本V1和新版本V2。原始版本V1和新版本V2都包括代码(文本)段310和320及数据段312和322。新版本V2和原始版本V1差别在于新版本V2包括了大小为0x500的附加的新代码块302。新代码块302的存在引入了两种次要改变。
第一种次要改变发生在新版本V2的代码(文本)段320并导致分支指令BRANCH具有不同的分支位移,也称为相对地址或分支偏移,由在分支指令地址BRANCH和目标指令地址TARGET之间添加新代码块302引起。在此实例中,目标指令地址是0x1000,而分支指令地址是0x3000,导致原始版本中0x2000(0x3000-0x1000)的分支位移。在分支指令地址和目标指令地址之间的新代码块(大小为0x500)的添加把分支指令地址改变为0x3500(0x3000+0x500)。所以,新版本V2中的分支位移改变为0x2500(0x3500-0x1000)。
第二种次要改变发生在新版本V2的数据段322中并导致数据指针POINTER中存储的值改变或存储对应数据区的绝对地址的数据指针值改变。数据指针值的改变由在代码(文本)段中添加新代码302引起。新代码302插入在数据段322之前的原始文件中的一个点。因此,在原始版本中为0x8000的数据指针值在新版本中改变为0x8500(0x8000+0x500)。
由于软件开发变得越来越复杂,次要改变遍布在可执行文件中,以至当考虑字节级文件差分的上下文时次要改变的数量超过了主要改变。下述的预处理例程使用文件的原始和新版本之间的关系来减少编码在增量文件中的有关次要改变的差别的信息数量。利用最少的信息,当进行字节级差分和重构时可以达到级联计算的效果,从而减小了增量文件的大小。
通常,一个实施例的预处理例程包括用于最小化增量文件大小的至少一个近似例程和至少一个合并例程。近似例程作用是根据文本(代码)和数据模型假设来减少/去除次要改变。合并例程,也称为提示合并例程,以用于传送到接收新版本的设备的最低成本水平来编码模型信息。如上所述,模型信息用于设备中的新版本的恢复,但并不限制于此。
图4是图1和图2的实施例中预处理电子文件的不同版本的流程图206。在块402,当接收到文件的新和原始版本时,从相关的映射文件中提取共有函数单元和共有数据单元。在块404,合并共有函数单元以形成共有函数块,其在以下及参考图11详细描述。同样,合并共有数据单元以形成共有数据块,其在以下参考图12详细说明。然后,在块408,预处理系统的预处理例程预处理新和原始文件的代码(文本)段,其在以下参考图5、6、7描述。在块410,预处理例程随后或同时预处理新和原始文件的数据段,其在以下参考图8、9、10描述。在块412,编码共有函数块和共有数据块,并输出原始文件的经修改版本以用于执行字节级文件差分。
图5是在图4的实施例中的预处理电子文件的不同版本的代码(文本)段的流程图408。通常,文件的代码(文本)段由一个或多个函数单元或块组成。在块502,一个实施例的代码(文本)段的预处理从识别原始和新文件的每个函数单元的开始和结束地址开始,其中原始文件的函数单元在这里称为“原始函数单元”而新文件的函数单元称为“新函数单元”。函数单元的开始和结束地址使用映射文件识别,但并不限制于此。
在块504,预处理器接下来给每个唯一的函数单元分配唯一的索引或索引值。给唯一函数单元分配索引值支持对原始和新文件版本都是共有的函数单元的识别。随后,当在文件的原始和新版本中都发现相同的函数单元时,该函数被分配一个共有索引值,但该实施例并不限制于此。
例如,考虑包括原始函数单元F1、F2、F3和F4的原始文件版本,以及包括新函数单元F1、F2、F3和F5的新文件版本。如果预处理器分别用索引值1、2、3、4和5来索引函数单元F1、F2、F3、F4和F5,则下表是针对原始文件版本组合的:
Index |
startAddressV1 |
endAddressV1 |
1234 |
0x80400x80620x80860x9056 |
0x80620x80800x809e0x90a8 |
同样,下表是针对新文件版本组合的:
Index |
startAddressV2 |
endAddressV2 |
1235 |
0x80600x80820x80a60x90e6 |
0x80820x80a00x80be0x9138 |
在这两个表中,startddress通常限定为对应函数单元的开始地址;因此“startAddressV1”是原始文件的函数单元的startAddress,而“startAddressV2”是新文件的函数单元的startAddress。进一步地,endAddress通过把函数单元大小与函数单元开始地址相加而产生,即
endAddress=startAddress+函数单元大小
但是该实施例并不限制于此。于是,endAddressV1限定为原始文件的函数单元的endAddress,而endAddressV2限定为新文件的函数单元的endAddress。对结束地址的该限定这里也适用于数据单元,但并不限制于此。
接下来,在块506,预处理器使用来自于上表的索引值、开始地址和结束地址的信息产生共有函数单元的HintTable。该HintTable包括组合在一个表中的共有函数单元的信息,包括索引值、原始文件版本(V1)的原始函数单元的开始和结束地址以及新文件版本(V2)的新函数单元的开始和结束地址。HintTable的信息使用任何数量的本领域公知的技术来设置。使用以上信息,一个实施例的HintTable如下产生:
Index |
startAddrV1 |
endAddrV1 |
startAddrV2 |
endAddrV2 |
123 |
0x80400x80620x8086 |
0x80620x80800x809e |
0x80600x80820x80a6 |
0x80820x80a00x80be |
在块508,预处理器继续为包括目标地址的原始函数单元的指令产生新目标地址值。图6是在图5的实施例下为电子文件的原始版本的代码(文本)段产生新目标地址值的流程图508。
在描述新目标地址值的产生时,与函数单元相关联的各种地址用特殊记号说明如下。指令地址在此通常用记号“addr”表示;因此,“addrV1”表示原始函数单元中的指令地址,而“addrV2”表示新函数单元中的指令地址。目标地址在此通常用记号“targetAddr”表示;因此,“targetAddrV1”表示原始函数单元中的目标地址,而“targetaddrV2”表示新函数单元中的对应目标地址。此外,包括targetAddrV1的原始函数单元的开始地址在此用记号“targetStartAddrV1”表示,是包括targetAddrV1的原始函数单元的开始地址,而包括targetAddrV2的新函数单元的开始地址在此用记号“targetStartAddrV2”表示。
图7是一个实施例中的文件的原始版本V1和新版本V2的框图,示出关于为电子文件原始版本的代码(文本)段产生新目标地址值而描述的不同地址(和相应记号)。第一共有函数单元CFUA和第二共有函数单元CFU B对原始版本V1和新版本V2都是共有的。原始版本V1的共有函数单元CFU B具有开始地址startAddrV1,并包括位于指令地址addrV1的可计算指令cal_insA。该可计算指令在以下描述。原始版本V1的共有函数单元CFU A具有开始地址targetStartAddrV1,并包括可计算指令cal-insA的目标地址targetAddrV1。
同样地,新版本V2的共有函数单元CFU B具有开始地址strtAddrV2,并包括位于指令地址addrV2的可计算指令cal_insB。新版本V2的共有函数单元CFU A具有开始地址targetStartAddrV2,并包括可计算指令cal-insB的目标地址targetAddrV2。
回到图6,在块602,通过从原始文件版本的原始函数单元j读取未预处理的可计算指令开始产生新目标地址值,其中j是计数器值,值初始化为1并且接下来每次增加1直到j=n,其中n代表原始版本和新版本间的共有函数单元的总数。
然后在块604产生或计算可计算指令的当前目标地址,如下所述。对包括目标地址的任何指令,例如象程序计数器相关的跳转指令和加载/存储指令,目标地址用当前指令地址和对应指令解码来计算。使用以上提及的记号,当前目标地址计算变成
targetAddrV1=addrV1+解码(指令),或可替换地,
解码(指令)=targetAddrV1-addrV1。
如果值[targetAddrV1-addrV1]已知,该指令也可基于对应的编码方案来计算:
指令=编码(targetAddrV1-addrV1)
这一类指令称为可计算指令,在此用“cal-ins”表示,而值(targetAddrV1-addrV1)称为可计算指令的值或“指令值”。
对共有函数单元中的可计算指令,一个实施例的预处理器使用原始版本中的指令值连同原始函数单元开始地址及新函数单元开始地址一起产生共有函数单元的新版本中的指令值。利用以上提及的记号,于是,使用原始版本中的指令值(targetAddrV1-addrV1)、startAddrV1、targetStartAddrV1、startAddrV2和targetStartAddrV2来产生或计算新版本中的指令值(targetAddrV2-addrV2)。
因此,在块606,一旦产生原始文件的目标地址(targetAddrV1),预处理器访问HintTable以识别k,即包括目标地址targetAddrV1的原始文件版本的函数单元。在块608,利用原始函数单元j及其目标函数单元k的识别,预处理器从HintTable中读取startAddrV1、startAddrV2、targetStartAddrV1和targetStartAddrV2。
接下来,在块610,预处理器现在为cal_insB产生指令值(targetAddrV2-addrV2)以替换cal_nsA的指令值,如下所述。一个实施例的预处理器在至少两个假设之下操作,但并不限制于此。第一假设假定在原始版本和新版本中具有相同大小的共有函数单元具有在原始和新版本上的相同指令结构,这里所述指令结构包括指令类型和指令顺序。第二假设假定对于满足第一假设的共有函数单元中的任何可计算指令,当所述可计算指令是函数调用或可计算指令的目标地址落入也满足第一假设的共有函数单元中时,两个不变量通常在原始和新版本上保持如下:
addrV1-startAddrV1=addrV2-startAddrV2
及
targetAddrV1-targetStartAddrV1=targetAddrV2-targetStartAddrV2。
于是,根据这两个假设,在块610,预处理器为cal_insA产生新指令值(targetAddrV2-addrV2),如
targetAddrV2-addrV2=(targetAddrV1-addrV1)
+(targetStartAddrV2-targetStartAddrV1)
-(startAddrV2-startAddrV1),
在此称为公式1。
在块612,使用cal_insA的新指令值,预处理器将cal_insA修改为
指令=编码(targetAddrV2-addrV2)。
在原始版本的地址addrV1的原始指令cal_insA就以新指令替换。
在块614,预处理器随后判定是否有原始函数单元j的任何可计算指令仍然是未预处理。当可计算指令仍然是未预处理,预处理器返回去在块602从原始函数单元j读取另一个或可替换地下一个未预处理的可计算指令,并且继续如上所述进行预处理。
如在块614所判定的,当原始函数单元j的所有可计算指令都预处理后,在块616,预处理器判定计数器中的值j是否大于值n。判定j不大于n表明有共有函数单元未被预处理,所以在块618,计数器中的值j增加1,并继续如上所述进行预处理。
判定j大于n表明原始文件版本的所有函数单元都已被预处理。随后,在块620,预处理器输出包括新文件的近似版本的原始文件的修改版本。
如以上参考图4所述的,在块410,除了根据文本(代码)模型假设以去除次要改变,预处理器和近似例程还起到根据数据模型假设以去除次要改变的作用。图8是在图4的实施例下的用来预处理电子文件的原始和新版本的数据段的流程图410。通常,文件的数据段由一个或多个全局变量单元或块组成,所述单元或块此处称为“数据单元”。
在块802,一个实施例的数据段的预处理开始于对原始和新文件的每个数据单元的开始和结束地址的识别,这里原始文件的数据单元表示为“原始数据单元”,而新文件的数据单元表示为“新数据单元”。数据单元的开始和结束地址用映射文件识别,但并不限制于此。
在块804,预处理接下来给每个唯一的数据单元分配唯一的索引或索引值。给每个唯一的数据单元分配索引值支持对原始和新文件版本都是共有的数据单元的识别。随后,当在文件的原始和新版本中发现相同的数据单元时,给该数据单元分配一共有索引值,但该实施例并不限制于此。给唯一的数据单元的索引值的分配与上述给唯一的函数单元的索引值的分配相同,但并不限制于此。同样,根据索引值所组织的并包括每个数据单元的开始和结束地址的表的产生与用于原始和新文件版本的函数单元的上述表的产生相同。但是,可替换的实施例可使用任何数量的本领域公知的技术来分配索引值和产生表。
接下来,在块806,预处理器用来自上表的索引值、开始地址和结束地址的信息来产生共有数据单元的HintTable。该HintTable包括组合在一张表中的共有数据单元信息,包括索引值、原始文件版本(V1)的原始数据单元的开始和结束地址以及新文件版本(V2)的新数据单元的开始和结束地址。该HintTable的产生与参考共有函数单元的HintTable在以上所描述的相同,但是在可替换实施例中可使用任何数量的本领域公知的技术来产生该HintTable。
在块808,预处理器继续为原始版本的数据指针产生新数据指针值。图9是在图8的实施例下的用于为电子文件原始版本中的数据指针产生新数据指针值的流程图808。
数据指针是指向数据单元中的一些数据的指令。接着描述此处用于描述新数据指针值的产生的记号。包括数据指针的指令的地址在此通常用记号“dataPointer”表示;因此,“dataPointerV1”表示原始版本中的dataPointer,而“dataPointerV2”表示新版本中的dataPointer。包括由数据指针所指向的数据的数据单元的开始地址在此用“dataStartAddr”表示;因此“dataStartAddrV1”表示原始版本中的dataStartAddr,而“dataStartAddrV2”表示新版本中的dataStartAddr。
图10是一个实施例中的原始版本V1和新版本V2的框图,示出用于为电子文件原始版本产生新数据指针值的不同地址(和对应记号)。原始版本V1和新版本V2都包括代码(文本)段和数据段。数据段包括对原始文件版本V1和新文件版本V2都是共有的共有数据单元CDU A。原始版本V1包括指向原始版本的共有数据单元CDU A中的一些数据的代码(文本)段中的数据指针dataPointerV1,这里原始版本V1的CDU A的开始地址是dataStartAddrV1。同样,新版本V2包括指向新版本V2的共有数据单元CDU A中的一些数据的代码(文本)段中的数据指针dataPointerV2,这里新版本V2的CDU A的开始地址是dataStartAddrV2。dataStartAddr地址来自与文件的原始版本V1和新版本V2的软件映像相关联的映射文件。
回到图9,在块902,新数据指针值的产生通过识别原始版本中的未预处理的数据指针开始。一个实施例的预处理器用原始版本中的指针值(dataPointerV1)连同包括dataPointerV1所指向数据的数据单元的开始地址(dataStartAddrV1)及它在新版本中的对应数据单元的开始地址(dataStartAddrV2)一起产生新版本中的数据指针值(dataPointerV2),如下所述。这是通过在块904通过访问HintTable以识别k、即原始版本中的一数据单元来完成的,所述数据单元包括由dataPointerV1指向的数据。在块906,利用对数据单元k的识别,预处理器从HintTable中读取dataStartAddrV1和dataStartAddrV2。
在块908,预处理器随后产生数据指针值(dataPointerV2)以替换dataPointerV1,如下所述。一个实施例的预处理器在有关数据单元的至少两个附加假设下操作,这里称为第三和第四假设,但并不限制于此。第三假设假定在原始版本和新版本中具有相同大小的共有数据单元在原始和新版本上具有相同数据结构,这里所述数据结构包括数据变量的类型、大小和顺序。第四假设假定对满足第三假设的共有数据单元中的任何数据指针,不变式在原始和新版本上通常保持如下:
dataPointerV1-dataStartAddrV1=dataPointerV2-dataStartAddrV2。
因此,根据第三和第四假设,在块908,预处理器为新数据单元产生新数据指针值(dataPointerV2),如
dataPointery2=dataPointerV1+(dataStartAddrV2-dataStartAddrV1),在此称为公式2。
在块910,利用数据指针值datPointerV2,预处理器在原始版本中的对应地址处用dataPointerV2替换dataPointerV1。在块912,预处理器随后判定是否有原始数据单元的任何数据指针仍然是未预处理。
在块912,当原始数据单元的数据指针仍然是未预处理,预处理器返回以从原始数据单元读取另一个或可替换地下一个未预处理的数据指针,且如上所述继续进行预处理。如在块912所判定的,当原始数据单元的所有数据指针都预处理了,在块914,预处理器输出包括新文件的近似版本的原始文件的修改版本。
如以上在HintTable中所用的共有函数单元及共有数据单元的开始和结束地址共同称为“算法提示”或“提示”,因为它们用于判定不同文件版本间的共有单元的相对位置。如此,所述提示被传送给接收差别或增量文件以用于从增量文件和原始文件恢复新文件版本的客户设备,如上所述。由于传送提示通过与用于传送增量文件和其他信息到客户设备相同的低带宽通道来执行,一个实施例的预处理器执行提示合并以合并HintTable的共有函数单元和共有数据单元而不影响预处理算法或例程的性能。该合并减小了包括提示的文件大小并因此减小了传送给客户设备的信息量。
利用由上述预处理代码(文本)段所得到的共有函数单元,并返回到图4,在块404,在提示合并例程或算法的控制下的预处理器合并共有函数单元以形成共有函数块。图11是在图4的实施例下的共有函数单元的提示合并404的流程图。
同样,在块406,预处理器使用由上述数据段的预处理所产生的共有数据单元来合并共有数据单元以形成共有数据块。图12是在图4的实施例下的共有数据单元的提示合并406的流程图。下面依次描述共有函数单元和共有数据单元的提示合并。
尽管为了清楚在此分开描述了共有函数单元和共有数据单元的提示合并,所述实施例可以按任意顺序和任意组合来执行与合并相关联的操作。有关记号,函数或数据单元的开始地址在此通常用如上所述的记号“startAddress”表示;因此,“startAddressV1”表示原始函数或数据单元的开始地址,而“startAddressV2”表示在新函数或数据单元中的对应开始地址。同样,函数或数据单元的结束地址在此通常用记号“endAddress”表示;因此,“endAddressV1”表示原始函数或数据单元的结束地址,而“endAddressV2”表示在新函数或数据单元中的对应结束地址。
如以上参考图5所述的,产生共有函数单元的HintTable,其包括组合在一张表中的共有函数单元的信息,所述信息包括索引值、原始文件版本V1的原始函数单元的开始和结束地址以及新文件版本V2的新函数单元的开始和结束地址。上面提供的HintTable用作描述共有函数单元的提示合并的例子,但所述实施例并不限制于此:
Index |
startAddrV1 |
endAddrV1 |
startAddrV2 |
endAddrV2 |
123 |
0x80400x80620x8086 |
0x80620x80800x809e |
0x80600x80820x80a6 |
0x80820x80a00x80be |
参考图4和图11以及该HintTable,在块1102,共有函数单元的提示合并404的操作开始于预处理器将HintTable的所有n个记录标记为可用、设置计数器j=1以及从关联的HintTable读取函数单元j和单元(j+1)的原始和新版本。在此例中,单元j和单元(j+1)的值对应于提示表的索引值,这里j=1,2,…(n-1),但并不限制于此。此外,j的值初始地设置为等于1且随后在进行提示合并404和处理了共有单元时用本领域公知的方法来增加。所以,在块1102,读取与索引值1和2(j+1=1+1=2)关联的共有函数单元的信息。
在块1104,预处理器判定共有函数单元j的原始版本V1和新版本V2的大小是否相等。该判定通过在原始版本V1和新版本V2的开始和结束地址之间求差来完成,如
endAddrV1(j)-startAddrV1(j)=endAddrV2(j)-startAddrV2(j),
但并不限制于此。当原始版本V1和新版本V2具有不同大小的文件时,在块1112,操作进行为判定j的值是否小于量(n-1)。
当原始版本V1和新版本V2具有相同大小时,在块1116,预处理器判定共有函数单元j的原始版本V1的结束地址是否与共有函数单元(j+1)的原始版本V1的开始地址相同,如
endAddrV1(j)=startAddrV1(j+1),
但并不限制于此。当共有函数单元j的原始版本V1的结束地址与共有函数单元(j+1)的原始版本V1的开始地址不同时,在块1112,操作进行为判定j的值是否小于量(n-1)。
当共有函数单元j的原始版本V1的结束地址与共有函数单元(j+1)的原始版本V1的开始地址相同时,在块1108,预处理器判定共有函数单元j的新版本V2的结束地址是否与共有函数单元(j+1)的新版本V2的开始地址相同,如
endAddrV2(j)=startAddrV2(j+1),
但并不限制于此。当共有函数单元j的新版本V2的结束地址与共有函数单元(j+1)的新版本V2的开始地址不同时,在块1112,操作进行为判定j的值是否小于量(n-1)。
当共有函数单元j的新版本V2的结束地址与共有函数单元(j+1)的新版本V2的开始地址相同时,在块1110,预处理器合并共有函数单元j和共有单元(j+1)的信息以形成共有函数块来替换单元(j+1)的记录,然后把单元j的记录标记为不可用。在块1112,操作然后进行为判定j的值是否小于量(n-1)。
在块1112,预处理器判定j的值是否小于量(n-1)。当j的值等于量(n-1),表明所有函数单元都已预处理,在块1116,操作进行为输出所有可用的记录作为共有函数块,并且操作返回。当j的值小于量(n-1),表明函数单元仍然是未预处理,在块1114,j的值增加,并且在块1102,操作进行为读取对应于j的新值的共有函数单元的信息。如上所述继续进行预处理。
下面参考图11和HintTable说明包括共有函数单元的提示合并的例子。操作开始于预处理器把所有三个记录标记为可用并从HintTAble中读取函数单元1和2的原始和新版本。然后预处理器判定共有函数单元1的原始版本V1和新版本V2是否大小相等。该判定通过在原始版本V1和新版本V2的开始和结束地址之间求差来完成,如
endAddrV1(1)-startAddrV1(1)=endAddrV2(1)-startAddrV2(1)。
用来自HintTable的真实值代替产生
(0x8062)-(0x8040)=(0x8082)-(0x8060)。
由于原始版本V1和新版本V2大小相等,预处理器接下来判定共有函数单元1的原始版本V1的结束地址是否与共有函数单元2的原始版本V1的开始地址相同,如
endAddrV1(1)=startAddrV1(2)。
用来自HintTable的真实值代替产生共有函数单元1的原始版本V1的结束地址与共有函数单元2的原始版本V1的开始地址相同的判定,如
(0x8062)=(0x8062)。
因为共有函数单元1的原始版本V1的结束地址与共有函数单元2的原始版本V1的开始地址相同,接下来判定共有函数单元1的新版本V2的结束地址是否与共有函数单元2的新版本V2的开始地址相同,如
endAddrV2(1)=startAddrV2(2)。
用来自HintTable的真实值代替产生共有函数单元1的新版本V2的结束地址与共有函数单元2的新版本V2的开始地址相同的判定,如
(0x8082)=(0x8082)。
响应于共有函数单元1的新版本V2的结束地址与共有函数单元2的新版本V2的开始地址相同的判定,预处理器合并共有函数单元1和共有函数单元2的信息以形成共有函数块如下:
Index |
startAddrV1 |
endAddrV1 |
startAddrV2 |
endAddrV2 | |
123 |
0x80400x80400x8086 |
0x80620x80800x809e |
0x80600x80600x80a6 |
0x80820x80a00x80be |
不可用可用可用 |
继续该例子,预处理器接下来从HintTable读取函数单元2和3的原始和新版本。预处理器判定共有函数单元2的原始版本V1和新版本V2是否大小相等。该判定通过在原始版本V1和新版本V2的开始和结束地址之间求差来完成,如
endAddrV1(2)-startAddrV1(2)=endAddrV2(2)-startAddrV2(2)。
用来自HintTable的真实值代替产生
(0x8080)-(0x8040)=(0x80a0)-(0x8060),
表示原始版本V1和新版本V2大小相等。
预处理器接下来判定共有函数单元2的原始版本V1的结束地址是否与共有函数单元3的原始版本V1的开始地址相同,如
endAddrV1(2)=startAddrV1(3)。
用来自HintTable的真实值代替产生判定共有函数单元2的原始版本V1的结束地址与共有函数单元3的原始版本V1的开始地址不同的判定,如
(0x8080)不等于(0x8086)。
因为共有函数单元2的原始版本V1的结束地址与共有函数单元3的原始版本V1的开始地址不同,操作返回并且共有函数单元2和3不合并以形成共有函数块。
合并共有函数单元之后,上面例子的HintTable的可用记录如下输出:
Index |
startAddrV1 |
endAddrV1 |
startAddrV2 |
endAddrV2 |
23 |
0x80400x8086 |
0x80800x809e |
0x80600x80a6 |
0x80a00x80be |
一个实施例的预处理器使用与上述关于共有函数单元的类似的方式来执行共有数据单元的提示合并。参考图4和图12,共有数据单元的提示合并406的操作开始于预处理器标记HintTable的所有n个记录、设置计数器j=1以及在块1202从关联的HintTable读取数据单元j和(j+1)的原始和新版本。单元j和单元(j+1)的值对应于提示表的索引值,这里j=1,2,…(n-1),但并不限制于此。
在块1204,预处理器判定共有数据单元j的原始版本V1和新版本V2的大小是否相等。该判定通过在原始版本V1和新版本V2的开始和结束地址之间求差来完成,如
endAddrV1(j)-startAddrV1(j)=endAddrV2(j)-startAddrV2(j),
但并不限制于此。当原始版本V1和新版本V2具有不同大小的文件时,在块1212,操作进行为判定j的值是否小于量(n-1)。
当原始版本V1和新版本V2大小相等时,在块1206,预处理器判定共有数据单元j的原始版本V1的结束地址是否与共有数据单元(j+1)的原始版本V1的开始地址相同,如
endAddrV1(j)=startAddrV1(j+1),
但并不限制于此。当共有数据单元j的原始版本V1的结束地址与共有数据单元(j+1)的原始版本V1的开始地址不同时,在块1212,操作进行为判定j的值是否小于量(n-1)。
当共有数据单元j的原始版本V1的结束地址与共有数据单元(j+1)的原始版本V1的开始地址相同时,在块1208,预处理器判定共有数据单元j的新版本V2的结束地址是否与共有数据单元(j+1)的新版本V2的开始地址相同,如
endAddrV2(j)=startAddrV2(j+1),
但并不限制于此。当共有数据单元j的新版本V2的结束地址与共有数据单元(j+1)的新版本V2的开始地址不同时,在块1212,操作进行为判定j的值是否小于量(n-1)。
当共有数据单元j的新版本V2的结束地址与共有数据单元(j+1)的新版本V2的开始地址相同时,在块1210,预处理器合并共有数据单元j和共有数据单元(j+1)的信息以形成共有数据块来替换单元(j+1)的记录,然后把单元j的记录标记为不可用。在块1212,操作进行为判定j的值是否小于量(n-1)。
在块1212,预处理器判定j的值是否小于量(n-1)。当j的值等于量(n-1),表明所有数据单元都已预处理,在块1216,操作进行为输出HintTable中的可用记录作为共有数据块,并且操作返回。当j的值小于量(n-1),表明数据单元未被预处理,在块1214,j的值增加,并且在块1202,操作进行为读取对应于j的新值的共有数据单元的信息。如上所述继续进行预处理。
所述用于预处理电子文件的不同版本的系统和方法可应用于使用任意数量的指令架构的任意数量的处理和/或基于处理器的系统的软件和可执行文件。例如,此处的系统和方法可用于ARM架构,如由D.Jagger和D.Seal的“ARM架构参考手册”第二版所述。ARM架构是基于16/32位嵌入式精简指令集计算机(RISC)核心的微处理器架构,并引入Thumb16位指令集。当用在ARM架构中时,例如,以上提及的可计算指令将包括ARM/Thumb指令集的“利用链接分支(BL)”和“利用链接分支以及将模式改变为ARM/Thumb(BLX)”指令。此外,以上提及的数据指针包括ARM/Thumb指令集的DCD指令。
作为使用上述预处理的设备和/或系统的例子,接收和使用增量文件的计算设备可以是掌控更新所需的对应软件应用的客户设备,例如蜂窝电话、移动电子设备、移动通信设备、个人数字助理以及其他基于处理器的设备。通过使运营商和设备制造商能够经由他们的无线基础设施有效地发布电子文件内容和应用,对范围从固件到嵌入式应用的所有移动设备软件提供这种支持。
得益于上述预处理的系统的另一例子包括使用有线串行连接将增量文件从掌控文件差别生成器的设备传送到掌控文件更新生成器的设备的系统。这些系统典型地具有低的传送速率,并且因为传送速率低,减小增量文件大小是一种实现较快传送时间的途径。
得益于使用预处理的系统的又一例子包括使用无线电通信将增量文件从掌控文件差别生成器的设备传送到运行文件更新生成器的设备的系统。在经受与无线连接相关的低可靠性的同时,这些系统也具有低的传送速率。在这些系统中使用较小的增量文件提供了几个优点。例如,较小的文件大小导致较快的增量文件传送时间。较快的传送时间在为设备用户节约时间的同时也减少了将错误引入增量文件中的机会,从而提高了系统可靠性。而且,利用蜂窝通信,减少的传送时间造成为典型地按分钟为服务付费的消费者节约了成本。
作为另一优点,较小的增量文件减小了传送增量文件到客户设备所需的带宽。减小的带宽使得通过分配的通道支持更多客户设备。如同减少的传送时间,这也导致为无线服务提供商减少了运营成本。
用于预处理文件的原始和新版本作为在原始和新文件之间产生的差别文件的一部分的上述系统包括用于产生差别文件的第一设备,以及接收差别文件并用差别文件在第二设备中产生新文件版本的第二设备。第一设备包括减小差别文件大小的至少一个组件,所述减小通过以下进行:对应于由代码行删除、代码行添加以及代码行修改的至少一种所引起的地址偏移来识别原始和新版本之间的差别;通过使用原始版本的文本段的地址与新版本的对应文本段的地址之间的至少一种关系来修改原始版本的指令的目标地址,来去除原始和新版本之间所共有的文本段中的所识别差别;以及产生原始文件的修改版本,所述修改版本包括具有经修改目标地址的指令。
在一个实施例中,去除原始和新版本之间所共有的文本段中的所识别差别进一步包括:识别原始和新版本间所共有的第一和第二文本段,其中原始版本中的第一文本段包括第一可计算指令而新版本中第二文本段包括第二可计算指令;识别原始和新版本间所共有的第三和第四文本段,其中原始版本中的第三文本段包括对应第一可计算指令的第一目标地址,其中新版本中的第四文本段包括对应第二可计算指令的第二目标地址;通过用第三和第四函数单元的开始地址之间的第一差别及用第一和第二函数单元的开始地址之间的第二差别修改第一指令值,来从第二可计算指令产生第二指令值;以及用第二指令值替换第一可计算指令的第一指令值。
文件预处理作为一个实施例的差别文件产生的部分进一步包括通过修改原始版本中的数据指针值来去除包括指向原始和新版本所共有的数据段的数据指针的指令中的所识别差别,其中使用由当前数据指针指向的原始版本中的数据段的开始地址与新版本中的对应数据段的开始地址之间的差别来修改数据指针值。去除包括数据指针的指令中的所识别差别进一步包括:识别原始和新版本之间所共有的第一和第二代码段,其中原始版本中的第一代码段包括第一数据指针,而新版本中的第二代码段包括第二数据指针;识别原始和新版本之间所共有的第一和第二数据单元,其中原始版本中的第一数据单元包括对应第一数据指针的第一目标地址,其中新版本中的第二数据单元包括对应第二数据指针的第二目标地址;通过用第一和第二数据单元的开始地址间的差别修改第一指针值,来从第二数据指针产生第二数据指针值;以及用第二数据指针值替换第一数据指针的第一数据指针值。
一个实施例的系统中的第一设备用至少一种耦合来传送差别文件到第二设备,其中至少一种耦合是无线耦合、有线耦合以及混合无线/有线耦合中的至少一种。
一个实施例的系统中的第二设备包括至少一个基于处理器的设备,如个人计算机、便携式计算设备、蜂窝电话、便携式通信设备以及个人数字助理。
上述用于预处理文件的原始和新版本作为在原始和新版本之间的差别文件产生的部分的系统包括用于产生差别文件的设备。该设备包括:用于接收电子文件原始版本和新版本的装置;用于识别原始和新版本所共有的代码单元的装置;用于识别代码单元所共有的指令的装置,其中所述指令包括指示对相应文件的另一部分处理的指令值;用于从原始版本的第一指令产生第一指令值的装置;用于从新版本的第二指令产生第二指令值的装置,其中第二指令对应于第一指令;用于用第二指令值替换第一指令的第一指令值的装置;以及用于产生包括具有第二指令值的第一指令的原始文件的修改版本的装置。
上述用于预处理文件的原始和新版本作为原始和新版本之间的差别文件产生的部分的系统包括相关的方法。这些方法当中有一种方法用于减小包括电子文件的原始版本和新版本之间的经编码差别的差别文件的大小。一个实施例的方法包括:对应于由代码行删除、代码行添加以及代码行修改中的至少一种引起的地址偏移,来识别原始和新版本之间的差别;通过使用原始版本的文本段的地址与新版本的对应文本段的地址之间的至少一种关系修改原始版本的指令目标地址,来去除原始和新版本所共有的文本段中的所识别差别;以及产生包括具有经修改目标地址的指令的原始文件的修改版本。
去除共有文本段中的所识别差别的方法,进一步包括:识别原始和新版本间所共有的第一和第二文本段,其中原始版本中第一文本段包括第一可计算指令,而新版本中第二文本段包括第二可计算指令;识别原始和新版本间所共有的第三和第四文本段,其中原始版本中的第三文本段包括对应第一可计算指令的第一目标地址,其中新版本中的第四文本段包括对应第二可计算指令的第二目标地址;通过用第三和第四函数单元的开始地址之间的第一差别以及用第一和第二函数单元的开始地址之间的第二差别修改第一指令值,来从第二可计算指令产生第二指令值;以及用第二指令值替换第一可计算指令的第一指令值。
一个实施例的方法进一步包括通过修改原始版本中的数据指针值来去除包括指向原始和新版本所共有的数据段的数据指针的指令中的所识别差别,其中使用由当前数据指针所指向的原始版本中的数据段的开始地址与新版本中的对应数据段的开始地址之间的差别来修改数据指针值。
去除包括数据指针的指令中的所识别差别进一步包括:识别原始和新版本之间所共有的第一和第二代码段,其中原始版本中的第一代码段包括第一数据指针,而新版本中的第二代码段包括第二数据指针;识别原始和新版本之间所共有的第一和第二数据单元,其中原始版本中的第一数据单元包括对应第一数据指针的第一目标地址,其中新版本中的第二数据单元包括对应第二数据指针的第二目标地址;从第二数据指针产生第二数据指针值;以及用第二数据指针值替换第一数据指针的第一数据指针值。一个实施例的第二数据指针值的产生包括用第一和第二数据单元的开始地址之间的差别来修改第一数据指针值。
一个实施例的方法进一步包括产生包括具有经修改数据指针的指令的原始文件的修改版本。
一个实施例的方法进一步包括合并共有数据单元以形成共有数据块。一个实施例的合并包括:当原始版本的第一数据单元与新版本的第一数据单元大小相等、原始版本的第一数据单元的结束地址等于原始版本的第二数据单元的开始地址以及新版本的第一数据单元的结束地址等于新版本的第二数据单元的开始地址时,组合原始版本的第一和第二数据单元并组合新版本的对应第一和第二数据单元以形成共有数据块;以及对另外的可合并数据单元重复该组合操作。所述合并进一步包括合并共有文本段以形成共有函数块。所述合并还可包括:当原始版本的第一文本段与新版本的第一文本段大小相等、原始版本的第一文本段的结束地址等于原始版本的第二文本段的开始地址以及新版本的第一文本段的结束地址等于新版本的第二文本段的开始地址时,组合原始版本的第一和第二文本段并组合相应新版本的对应第一和第二文本段以形成共有函数块;以及对另外的可合并文本段重复该组合操作。
上述用于预处理文件的原始和新版本作为在原始和新版本之间的差别文件产生的部分的系统包括相关的方法。这些方法当中有一种方法用于执行文件差分,包括:接收电子文件的原始版本和新版本;识别原始和新版本所共有的代码单元;识别代码单元所共有的指令,其中所述指令包括有关对应文件的另一部分的指令值;从原始版本的第一指令解码第一指令值;从新版本的第二指令产生第二指令值,其中第二指令对应于第一指令;用第二指令值替换第一指令的第一指令值;以及产生包括具有第二指令值的第一指令的原始文件的修改版本。
一个实施例的方法进一步包括从相关的映射文件中提取共有代码单元,其中所述共有代码单元包括共有函数单元和共有数据单元。
一个实施例的方法进一步包括合并代码单元的共有函数单元以形成共有函数块。一个实施例的合并包括:当原始版本的第一函数单元与新版本的第一函数单元大小相等、原始版本的第一函数单元的结束地址等于原始版本的第二函数单元的开始地址以及新版本的第一函数单元的结束地址等于新版本的第二函数单元的开始地址时,组合原始版本的第一和第二函数单元并组合新版本的对应第一和第二函数单元以形成共有函数块;以及对另外的可合并函数单元重复该组合操作。一个实施例的方法进一步包括编码所述共有函数块。
一个实施例的方法进一步包括合并代码单元的共有数据单元以形成共有数据块。一个实施例的合并包括:当原始版本的第一数据单元与新版本的第一数据单元大小相等、原始版本的第一数据单元的结束地址等于原始版本的第二数据单元的开始地址以及新版本的第一数据单元的结束地址等于新版本的第二数据单元的开始地址时,组合原始版本的第一和第二数据单元并组合新版本的对应第一和第二数据单元以形成共有数据块;以及对另外的可合并数据单元重复该组合操作。所述方法可以进一步包括编码共有数据块。
在一个实施例的方法中,原始和新版本所共有的代码单元是共有函数单元,其中第一指令包括第一可计算指令,而第二指令包括第二可计算指令,其中产生第二指令值包括用包括目标地址的原始和新版本的共有函数单元的开始地址之间的第一差别以及用包括第一和第二可计算指令的共有函数单元的开始地址之间的第二差别来修改第一指令值。
一个实施例的方法的代码单元包括函数单元。在这些方法中,产生第一指令值包括产生第一可计算指令的当前指令地址与第一可计算指令的目标地址之间的差别。产生第二指令值包括:产生第一可计算指令的当前指令地址与第一可计算指令的目标地址之间的差别;产生新版本的第一共有函数单元的开始地址与原始版本的对应第一共有函数单元的开始地址之间的差别;以及产生新版本的第二共有函数单元的开始地址与原始版本的对应第二共有函数单元的开始地址之间的差别。
在一个实施例的一些方法中,代码单元包括数据单元而指令包括数据指针。
在一个实施例的方法中,原始和新版本所共有的代码单元是共有数据单元,其中第一指令包括第一数据指针而第二指令包括第二数据指针,其中第一指令值包括第一数据指针值而第二指令值包括第二数据指针值,其中产生第二指令值包括通过用第一和第二数据单元的开始地址之间的差别修改第一数据指针值来产生第二数据指针值。
一个实施例的方法进一步包括在原始文件的修改版本与新文件之间执行文件差分并产生差别文件。该方法还进一步包括:传送差别文件到便携式处理系统;以及用差别文件在便携式处理系统中产生新文件版本。一个实施例的方法还进一步包括:合并代码单元的共有函数单元以形成共有函数块;合并代码单元的共有数据单元以形成共有数据块;以及编码共有函数块和共有数据块以用于在便携式处理系统中产生新文件版本。
上述用于预处理文件的原始和新版本作为原始和新版本之间的差别文件产生的部分的系统还包括附加的相关的方法。这些方法当中有一种方法用于判定电子文件之间的差别,包括:接收电子文件的原始版本和新版本;识别原始和新版本之间所共有的第一和第二函数单元,其中原始版本中的第一函数单元包括第一可计算指令而新版本中的第二函数单元包括第二可计算指令;识别原始和新版本之间所共有的第三和第四函数单元,其中原始版本中的第三函数单元包括对应第一可计算指令的第一目标地址,其中新版本中的第四函数单元包括对应第二可计算指令的第二目标地址;从第二可计算指令产生第二指令值;用第二指令值替换第一可计算指令的第一指令值;以及产生包括具有第二指令值的第一指令的原始文件的修改版本。
在所述方法下产生第二指令值包括用第三和第四函数单元的开始地址之间的第一差别以及用第一和第二函数单元的开始地址之间的第二差别来修改第一指令值。
一个实施例的方法进一步包括:识别原始和新版本之间所共有的第一和第二代码段,其中原始版本中的第一代码段包括第一数据指针而新版本中的第二代码段包括第二数据指针;识别原始和新版本之间所共有的第一和第二数据单元,其中原始版本中的第一数据单元包括对应第一数据指针的第一目标地址,其中新版本中的第二数据单元包括对应第二数据指针的第二目标地址;从第二数据指针产生第二数据指针值;用第二数据指针值替换第一数据指针的第一数据指针值;以及产生包括具有第二数据指针值的第一数据指针的原始文件的修改版本。在一个实施例中产生第二数据指针值包括产生由当前数据指针指向的原始版本中的数据段的开始地址与新版本中的对应数据段的开始地址之间的差别。
一个实施例的方法进一步包括合并共有函数单元以形成共有函数块。
一个实施例的方法进一步包括合并共有数据单元以形成共有数据块。
一个实施例的方法进一步包括使用原始文件的经修改版本和新文件来产生差别文件。所述方法还进一步包括:传送差别文件到便携式处理系统;以及用差别文件在便携式处理系统中产生新文件版本。
上述用于预处理文件的原始和新版本作为原始和新版本之间的差别文件产生的部分的系统包括计算机可读介质。一个实施例的计算机可读介质包括可执行指令,当所述指令在处理系统中执行时,通过以下减小了包括电子文件的原始版本和新版本之间的代码差别的差别文件大小:对应于由代码行删除、代码行添加以及代码行修改中的至少一种所引起的地址偏移,来识别原始和新版本之间的差别;通过使用原始版本的文本段的地址与新版本的对应文本段的地址之间的至少一种关系修改原始版本的指令目标地址,来去除原始和新版本所共有的文本段中的所识别差别;以及产生包括具有经修改目标地址的指令的原始文件的修改版本。
本发明的各方面可以实现为编程到多种电路中的功能性,所述电路包括可编程逻辑器件(PLD)如现场可编程门阵列(FPGA)、可编程阵列逻辑(PAL)器件、电可编程逻辑和存储器器件及标准的基于蜂窝的器件,以及专用集成电路(ASIC)。实现本发明的各方面的一些其他可能性包括:带存储器的微控制器(如电子可擦除可编程只读存储器(EEPROM))、嵌入式微处理器、固件、软件等等。此外,本发明的各方面可以在具有基于软件的电路仿真、离散逻辑(顺序的和组合的)、定制器件、模糊(神经系统的)逻辑、量子器件以及任意以上器件类型的混合的微处理器中实施。当然基础的器件技术可以多种组成类型提供,例如象互补金属氧化物半导体(CMOS)的金属氧化物半导体场效应晶体管(MOSFET)技术、象发射极耦合逻辑(ECL)的双极技术、聚合物技术(例如硅共轭聚合物和金属共轭聚合物金属结构)、混合模拟和数字等等。
除非上下文清楚地需要,否则在整个说明和权利要求中,词“包括”应解释为与排除或穷尽的意思相对的内含的意义;即,是“包括但不限于”的意思。使用单数或复数的词也分别包括复数和单数。另外,当用于本申请中时,词“在此”、“在下面”、“以上”、“以下”以及类似词应指整个该申请而非该申请的任何特殊部分。当关于两个或更多条目的列表来使用词“或”时,该词覆盖所有以下对该词的理解:列表中的任何条目、列表中的所有条目以及列表中的条目的任意组合。
以上对本发明实施例的说明不是要穷尽或把本分明限制为所公开的精确形式。尽管为了说明的目的在此描述了本发明的特定实施例和例子,如本领域的技术人员将认识到的,在本发明的范围内进行各种等效的修改是可能的。这里提供的本发明的讲授可应用于其他处理系统和通信系统,而不仅用于上述的文件差分系统。
上述各种实施例的元素和行为可以组合以提供进一步的实施例。可以根据上述详细说明而对本发明进行这些和其他的改变。
所有以上引用和美国专利及专利申请通过引用结合于此。如果需要,可以修改本发明的各方面,采用上述各种专利和申请的系统、功能和概念以提供本发明进一步的实施例。
总之,在以下权利要求中,所使用的术语不应理解为把本发明限制于说明书和权利要求中所公开的特定实施例,而应理解为包括工作在权利要求下以提供文件差分的所有处理系统。相应地,本发明不受公开内容所限制,而本发明的范围应完全由权利要求来确定。
尽管本发明的某些方面在下面以某种权利要求的形式出现,发明人以多种权利要求形式设想了本发明的各个方面。例如,仅仅本发明的一个方面描述为在计算机可读介质中实施,但其他方面同样也可以在计算机可读介质中实施。相应地,发明人保留在提出申请之后添加附加权利要求的权利,以便为本发明的其他方面追加这样的附加权利要求形式。