專利名稱:處理軟件鏡像并產(chǎn)生差異文件的制作方法
相關(guān)申請
本申請要求2005年9月23日提交的美國臨時(shí)專利申請第60/720,264號的優(yōu)先權(quán)。
本申請是2003年6月20日提交的美國專利申請第10/600,978號的部分繼續(xù)申請。
背景技術(shù):
在處理器、微處理器和/或處理單元上運(yùn)行以提供特定功能的軟件經(jīng)常隨著時(shí)間發(fā)生變化。這些變化可能是由于例如校正軟件文件中的缺陷(bug)或錯(cuò)誤、適應(yīng)技術(shù)的發(fā)展、或者增加新的特征等的需要而產(chǎn)生的。特別是,在例如移動(dòng)無線設(shè)備的移動(dòng)處理設(shè)備上駐留的嵌入式軟件組件經(jīng)常包括需要校正的大量軟件缺陷。軟件包括人可讀的美國信息交換標(biāo)準(zhǔn)碼(ASCII,American Standard Code for Information Interchange)純文本文件或者二進(jìn)制代碼形式的一個(gè)或多個(gè)文件??梢詫④浖募澐譃楦〉膯卧ǔ⑵浞Q為模塊或者組件。
例如移動(dòng)處理設(shè)備的基于便攜式處理器的設(shè)備一般包括實(shí)時(shí)操作系統(tǒng)(RTOS,real-time operating system),其中將設(shè)備的所有軟件組件鏈接為大的單個(gè)文件。此外,在這些移動(dòng)無線設(shè)備中一般不設(shè)置文件系統(tǒng)支持。另外,需要使用例如無線電、紅外或者串行鏈路的慢通信鏈路將該大的單個(gè)文件預(yù)先加載或者嵌入到設(shè)備中。
經(jīng)由慢通信鏈路更新移動(dòng)處理設(shè)備的大文件的障礙包括與對設(shè)備分發(fā)更新后的文件相關(guān)聯(lián)的時(shí)間、帶寬和成本。對移動(dòng)處理設(shè)備分發(fā)大文件的問題的一個(gè)現(xiàn)有解決方案包括使用壓縮。然而,雖然通常使用多個(gè)現(xiàn)有壓縮算法,但是經(jīng)常是即使壓縮后的文件對于經(jīng)由慢、昂貴、窄帶通信鏈路下載到設(shè)備中也太大。
用于更新文件的另一個(gè)典型解決方案使用差異程序來產(chǎn)生修訂后的文件如何與原始文件不同的描述。存在生成這種差異數(shù)據(jù)的可用差異程序。然而,與使用壓縮類似,使用這些差異程序生成的差異文件有時(shí)候?qū)τ诮?jīng)由相關(guān)聯(lián)的通信協(xié)議進(jìn)行傳送也太大。通過引用包含 在本說明書中提及的每一個(gè)出版物、專利和/或?qū)@暾埖娜績?nèi)容通過引用包含于此,就像具體并且獨(dú)立地指出每一個(gè)獨(dú)立出版物和/或?qū)@暾埻ㄟ^引用包含于此一樣。
圖1是示出根據(jù)實(shí)施例的文件求差和更新的框圖。
圖2是根據(jù)圖1的實(shí)施例產(chǎn)生△(delta)文件的流程圖。
圖3是示出可執(zhí)行文件的原始版本和新版本的框圖。
圖4是根據(jù)圖1和圖2的實(shí)施例對電子文件的差異版本進(jìn)行預(yù)處理的流程圖。
圖5是根據(jù)圖4的實(shí)施例對電子文件的差異版本的代碼(文本)部分進(jìn)行預(yù)處理的流程圖。
圖6是根據(jù)圖5的實(shí)施例產(chǎn)生電子文件的原始版本的代碼(文本)部分的新目標(biāo)地址值的流程圖。
圖7是根據(jù)實(shí)施例的文件的原始版本和新版本的框圖,其示出參考電子文件的原始版本的代碼(文本)部分的新目標(biāo)地址值的產(chǎn)生所描述的差異地址(和相應(yīng)的記號)。
圖8是根據(jù)圖4的實(shí)施例對電子文件的原始版本和新版本的數(shù)據(jù)部分進(jìn)行預(yù)處理的流程圖。
圖9是根據(jù)圖8的實(shí)施例產(chǎn)生電子文件的原始版本的數(shù)據(jù)部分的新數(shù)據(jù)指針值的流程圖。
圖10是根據(jù)實(shí)施例的文件的原始版本和新版本的框圖,其示出在產(chǎn)生電子文件的原始版本的新數(shù)據(jù)指針值時(shí)所使用的差異地址(和相應(yīng)的記號)。
圖11是根據(jù)圖4的實(shí)施例的公共函數(shù)單元的線索(hint)合并的流程圖。
圖12是根據(jù)圖4的實(shí)施例的公共數(shù)據(jù)單元的線索合并的流程圖。
圖13示出根據(jù)實(shí)施例的對產(chǎn)生一個(gè)或多個(gè)新代碼塊的預(yù)處理數(shù)據(jù)的后處理。
圖14示出根據(jù)實(shí)施例的對增大一個(gè)或多個(gè)先前識別的公共代碼塊的大小同時(shí)還產(chǎn)生至少一個(gè)新代碼塊的預(yù)處理數(shù)據(jù)的后處理。
圖15A~15F示出提供預(yù)處理和后處理方法的示例結(jié)果的圖形表示。
具體實(shí)施例方式 本發(fā)明提供一種系統(tǒng)和方法,用于對文件的原始版本和新版本進(jìn)行預(yù)處理,作為原始文件版本和新文件版本之間的差異文件產(chǎn)生的一部分。該預(yù)處理支持差異文件的大小的進(jìn)一步減小。文件版本之間的軟件/可執(zhí)行變化包括被定義為源代碼變化的初級變化/邏輯變化和次級變化。次級變化通常由初級變化引起,并且是由軟件編譯器/連接器所產(chǎn)生的。次級變化包括由初級變化引起并由軟件編譯器/連接器產(chǎn)生的地址變化、指針目標(biāo)地址變化和地址偏移的變化。提供的預(yù)處理系統(tǒng)和方法在文件版本之間使用近似規(guī)則,以去除/減小次級變化并對相應(yīng)的差異文件的信息中與這些變化的去除有關(guān)的信息進(jìn)行編碼。
這里,詳細(xì)描述用于產(chǎn)生電子文件的兩個(gè)版本之間的差異文件、這里稱為文件求差的系統(tǒng)和方法。圖1是示出根據(jù)實(shí)施例所提供的文件求差和更新的框圖。文件求差和更新包括求差組件和更新組件。求差組件,這里稱為文件差異產(chǎn)生器,根據(jù)電子文件的原始版本和新版本在第一基于處理器的系統(tǒng)或者計(jì)算機(jī)系統(tǒng)中產(chǎn)生差異文件。更新組件,這里稱為更新產(chǎn)生器,使用差異文件和所保存的原始文件的拷貝在第二基于處理器的系統(tǒng)或者計(jì)算機(jī)系統(tǒng)上產(chǎn)生新文件的拷貝。
在下面的描述中,引入大量具體細(xì)節(jié)提供對本發(fā)明的實(shí)施例的全面理解以及對本發(fā)明的實(shí)施例的詳細(xì)描述。然而,本領(lǐng)域技術(shù)人員將認(rèn)識到可以不使用這些具體細(xì)節(jié)中的一個(gè)或多個(gè)或者使用其它組件、系統(tǒng)等等來實(shí)現(xiàn)本發(fā)明。另外,沒有示出或者沒有詳細(xì)描述公知結(jié)構(gòu)或者操作以避免混淆本發(fā)明的各個(gè)方面。
參考圖1,第一計(jì)算機(jī)系統(tǒng)102和第二計(jì)算機(jī)系統(tǒng)104經(jīng)由通信路徑106進(jìn)行通信。如在本領(lǐng)域中已知的,這些計(jì)算機(jī)系統(tǒng)102和104包括計(jì)算組件和設(shè)備操作的任意集合。計(jì)算機(jī)系統(tǒng)102和104還可以是更大的計(jì)算機(jī)系統(tǒng)或者網(wǎng)絡(luò)內(nèi)的組件或者子系統(tǒng)。
通信路徑106包括用來在計(jì)算機(jī)系統(tǒng)102和104之間傳遞或者傳送文件的任意介質(zhì)。因此,該路徑106包括無線連接、有線連接和混合無線/有線連接。通信路徑106還包括到網(wǎng)絡(luò)的耦合或者連接,網(wǎng)絡(luò)包括局域網(wǎng)(LAN,local area network)、城域網(wǎng)(MAN,metropolitan area network)、廣域網(wǎng)(WAN,wide area network)、專線網(wǎng)絡(luò)(proprietary network)、局間(interoffice)網(wǎng)絡(luò)或者后端(backend)網(wǎng)絡(luò)、以及因特網(wǎng)。此外,通信路徑106包括例如軟盤、硬盤驅(qū)動(dòng)和CD-ROM盤的可去除固定介質(zhì)以及電話線、總線和電子郵件消息等。
第一通信系統(tǒng)102接收電子文件的原始或者舊版本110和新版本112。新文件112通常是原始文件110的更新后或者修訂后的版本,但是不限于此。電子文件110和112包括包括動(dòng)態(tài)鏈接庫文件的軟件文件、共享對象文件、嵌入式軟件組件(EBSC,embedded software component)、固件文件、可執(zhí)行文件、包括十六進(jìn)制數(shù)據(jù)文件的數(shù)據(jù)文件、系統(tǒng)配置文件和包括個(gè)人使用數(shù)據(jù)的文件,但是不限于此。由于可以將任意類型的文件視為字節(jié)流,因此下文中根據(jù)上下文可能將文件描述為字節(jié)流。
如下面所描述的,文件差異產(chǎn)生器114的組件接收新文件112,將其與原始文件110相比較,并計(jì)算所比較的文件之間的差異。這些差異包括所比較的文件之間的字節(jié)級別的差異,但是不限于此。在比較過程中,文件差異產(chǎn)生器114產(chǎn)生差異文件116,這里稱為△文件116。
實(shí)施例的文件差異產(chǎn)生器114耦合在主計(jì)算機(jī)系統(tǒng)102的組件之間,這些組件包括處理器、至少一個(gè)控制器、至少一個(gè)存儲(chǔ)設(shè)備和至少一個(gè)總線中的至少一個(gè),但是不限于此。實(shí)施例的文件差異產(chǎn)生器114的組件包括至少一個(gè)預(yù)處理子系統(tǒng)124和至少一個(gè)求差子系統(tǒng)134。預(yù)處理子系統(tǒng)124,也稱為預(yù)處理器124,包括在至少一個(gè)預(yù)處理算法、程序或者例程的控制下運(yùn)行的至少一個(gè)處理器。類似地,求差子系統(tǒng)134包括在至少一個(gè)求差算法、程序或者例程的控制下運(yùn)行的至少一個(gè)處理器。
△文件116的內(nèi)容提供新文件112和原始文件110之間的差異的有效表示。如在2002年5月13日提交的申請?zhí)枮?0/146,545、發(fā)明名稱為“Byte-Level File Differencing and Updating Algorithms”的美國專利申請中所描述的,△文件116包括與表示相關(guān)聯(lián)的文件的新或當(dāng)前版本和文件的在前版本之間的差異的替換和/或插入操作的實(shí)際數(shù)據(jù)一起的元數(shù)據(jù)(meta-data)。文件差異產(chǎn)生器114在△文件116中用最少數(shù)量的字節(jié)和預(yù)先定義的格式或者協(xié)議提供始文件110和新文件112之間的任何差異,從而提供在空間上最優(yōu)化的△文件。
經(jīng)由通信路徑106將△文件116傳送或者發(fā)送到另一個(gè)處理系統(tǒng)104。在傳送之前,可以使用本領(lǐng)域已知的壓縮技術(shù)對△文件116進(jìn)行壓縮,但是不限于此。駐留在接收系統(tǒng)104上的更新產(chǎn)生器118使用△文件116與所保存的原始文件110H產(chǎn)生或者創(chuàng)建新文件112C的拷貝。然后,使用該新文件112C的拷貝來更新在客戶設(shè)備上保持的作為修訂或者更新目標(biāo)的原始文件110H。在完成該更新處理時(shí),現(xiàn)在存儲(chǔ)在第二計(jì)算機(jī)系統(tǒng)上的新文件與在第一計(jì)算機(jī)系統(tǒng)102中接收到的新文件112是相同的。
原始文件和新文件之間的差異一般小于新文件,因此如果代替整個(gè)新文件發(fā)送并存儲(chǔ)這些差異將節(jié)省相當(dāng)?shù)拇鎯?chǔ)和發(fā)送。這對于經(jīng)由例如無線或者蜂窩式連接的一般可能慢且昂貴的連接來進(jìn)行更新的移動(dòng)電子設(shè)備(客戶設(shè)備)駐留程序尤其重要。減小了大小的△文件提供了大量改進(jìn),其中之一包括將△文件發(fā)送到客戶設(shè)備所需的帶寬減小;越小的文件意味著傳送需要越小的帶寬。此外,越小的文件需要越短的發(fā)送時(shí)間,因此降低了文件傳送被中斷的可能性,同時(shí)減少了接收文件中的發(fā)送錯(cuò)誤。另外,經(jīng)由非安全連接發(fā)送△文件比發(fā)送新軟件鏡像(image)更安全。所有這些改進(jìn)提高了客戶滿意度。
圖2是根據(jù)圖1的實(shí)施例的△文件的產(chǎn)生的流程圖。在塊204,當(dāng)在第一處理或者計(jì)算機(jī)系統(tǒng)中接收到新文件和原始文件時(shí),操作開始。還接收到了與新文件和原始文件相對應(yīng)的映射文件。映射文件是高級別的文本文件,其包括軟件鏡像的每一個(gè)符號的起始地址和大小,符號的示例包括函數(shù)變量和全局變量。編譯器/連接器輸出映射文件,還已知映射文件是日志文件、符號文件和/或列表文件。
在塊206,在新文件和原始文件的內(nèi)容之間進(jìn)行預(yù)處理操作,以識別兩個(gè)文件的內(nèi)容中的公共片段和簡單模式。通常,預(yù)處理使用識別出的公共片段和模式來減少/去除新文件和原始文件之間的次級變化。如下面所描述的,實(shí)施例的預(yù)處理包括減少和/或去除由與邏輯變化相關(guān)聯(lián)的地址偏移所引起的原始文件和新文件之間的變化,但是不限于此。因此,該預(yù)處理減小了包括次級變化的文件的公共片段之間的差異,從而提高了差異計(jì)算的效率。
在預(yù)處理之后,在塊208,計(jì)算新文件和修正后的原始文件之間的字節(jié)級別差異。對算出的差異進(jìn)行編碼和合并,在塊210,通過遵循預(yù)先定義的編碼格式來產(chǎn)生△文件。然后,在塊212,如果可能,如在本領(lǐng)域中已知的對△文件進(jìn)行優(yōu)化以進(jìn)一步減小文件大小,在塊214,提供優(yōu)化后的△文件作為輸出。
如上所述,在新文件和原始文件的內(nèi)容之間進(jìn)行預(yù)處理操作,以識別兩個(gè)文件的內(nèi)容中的公共片段和簡單模式。公共片段和簡單模式的確認(rèn)用于減小/去除次級變化,從而產(chǎn)生總體性能增益。
如上所述,系統(tǒng)和客戶設(shè)備之間的電子文件的發(fā)送或者軟件更新可能花費(fèi)大量時(shí)間,尤其在經(jīng)由低帶寬信道進(jìn)行時(shí)。一個(gè)示例是蜂窩式電話軟件更新。通過蜂窩式無線耦合發(fā)送新軟件版本和原始軟件版本之間的字節(jié)級別的文件差異或者變化已成為典型的實(shí)踐。因?yàn)榭蓤?zhí)行文件的新版本和原始版本之間的差異比其相應(yīng)的源文件之間的差異更復(fù)雜,所以產(chǎn)生了相當(dāng)長的傳送時(shí)間。
出現(xiàn)新文件版本和原始文件版本之間的這些復(fù)雜的差異,部分是因?yàn)樵次募男〉淖兓?jīng)常引起整個(gè)可執(zhí)行文件的大幅度變化。作為示例,可執(zhí)行文件中引入的變化包括兩種主要類型的變化初級變化和次級變化。初級變化也稱為邏輯變化,是由從原始文件中刪除源代碼行、向新文件中增加源代碼行以及源代碼行修正引起的源代碼的變化。定義次級變化包括但不限于地址變化、指針目標(biāo)地址變化和由初級變化引起的并且由軟件編譯器/連接器產(chǎn)生的地址偏移的變化。下面描述的預(yù)處理例程去除/減小了次級變化,并且對相應(yīng)的△文件的信息中與這些變化的去除有關(guān)的信息進(jìn)行編碼。
對在可執(zhí)行文件中引入的次級變化的分析從假設(shè)可執(zhí)行文件包括代碼(文本)部分和數(shù)據(jù)部分開始。圖3是示出可執(zhí)行文件的原始版本V1和新版本V2的框圖300。原始版本V1和新版本V2二者包括代碼(文本)部分310和320以及數(shù)據(jù)部分312和322。新版本V2與原始版本V1的不同之處在于新版本V2包括大小為0x500的附加新代碼塊302。新代碼塊302的存在引入了兩種類型的次級變化。
第一種類型的次級變化出現(xiàn)在新版本V2的代碼(文本)部分320中,并且產(chǎn)生具有不同分支偏移的分支指令BRANCH,也稱為相對地址或者分支偏移,這是由在分支指令BRANCH的地址和目標(biāo)指令地址TARGET之間增加了新代碼塊302引起的。在該示例中,目標(biāo)指令地址是0x1000,分支指令地址是0x3000,在原始版本中產(chǎn)生0x2000(0x3000-0x1000)的分支偏移。在分支指令地址和目標(biāo)指令地址之間增加新代碼塊(大小為0x500)使分支指令地址改變?yōu)?x3500(0x3000+0x500)。因此,新版本V2中的分支偏移改變?yōu)?x2500(0x3500-0x1000)。
第二種類型的次級變化出現(xiàn)在新版本V2的數(shù)據(jù)部分322,并且引起存儲(chǔ)在數(shù)據(jù)指針POINTER中的值的變化或者存儲(chǔ)相應(yīng)的數(shù)據(jù)區(qū)域的絕對地址的數(shù)據(jù)指針值的變化。數(shù)據(jù)指針值的變化是由在代碼(文本)部分中新代碼302的增加引起的。在原始版本中的數(shù)據(jù)部分322之前的點(diǎn)處插入新代碼302。因此,在原始版本中是0x8000的數(shù)據(jù)指針值改變?yōu)樾掳姹局械?x8500(0x8000+0x500)。
隨著軟件開發(fā)變得越來越復(fù)雜,次級變化遍布在可執(zhí)行文件中,在字節(jié)級別的文件求差的情況下考慮時(shí),甚至到了次級變化在數(shù)量上超過初級變化的程度。下面描述的預(yù)處理例程使用文件的原始版本和新版本之間的關(guān)系來減少在△文件中進(jìn)行編碼的關(guān)于與次級變化有關(guān)的差異的信息的量。當(dāng)進(jìn)行字節(jié)級別求差和重建時(shí),使用最少的信息可以達(dá)到級聯(lián)計(jì)算的效果,從而減小了△文件的大小。
通常,實(shí)施例的預(yù)處理例程包括在使△文件的大小最小化時(shí)使用的至少一個(gè)近似例程和至少一個(gè)合并例程。根據(jù)文本(代碼)和數(shù)據(jù)模型假設(shè),近似例程用來減小/去除次級變化。合并例程也稱為線索合并例程,在針對接收新版本的設(shè)備傳送的最小成本級別對模型信息進(jìn)行編碼。如上所述,在設(shè)備中恢復(fù)新版本時(shí)使用模型信息,但是不限于此。
圖4是根據(jù)圖1和圖2的實(shí)施例用于對電子版本的差異版本進(jìn)行預(yù)處理的流程圖206。在收到文件的新版本和原始版本時(shí),在塊402,從相關(guān)聯(lián)的映射文件中提取公共函數(shù)單元和公共數(shù)據(jù)單元。如下面將參考圖11詳細(xì)描述的,在塊404,合并公共函數(shù)單元以形成公共函數(shù)塊。類似地,如下面將參考圖12詳細(xì)描述的,在塊406,合并公共數(shù)據(jù)單元以形成公共數(shù)據(jù)塊。然后,如下面將參考圖5、6和7描述的,在塊408,預(yù)處理系統(tǒng)的預(yù)處理例程對新文件和原始文件的代碼(文本)部分進(jìn)行預(yù)處理。如下面將參考圖8、9和10描述的,在塊410,預(yù)處理例程相繼或者同時(shí)對新文件和原始文件的數(shù)據(jù)部分進(jìn)行預(yù)處理。在塊412,對公共函數(shù)塊和公共數(shù)據(jù)塊進(jìn)行編碼,輸出原始文件修正后的版本,用于在進(jìn)行字節(jié)級別文件求差時(shí)使用。
圖5是根據(jù)圖4的實(shí)施例用于對電子文件的差異版本的代碼(文本)部分進(jìn)行預(yù)處理的流程圖408。通常,文件的代碼(文本)部分由一個(gè)或多個(gè)函數(shù)單元或者塊構(gòu)成。實(shí)施例的對代碼(文本)部分的預(yù)處理從塊502開始識別原始文件和新文件的每一個(gè)函數(shù)單元的起始地址和結(jié)束地址,這里將原始文件的函數(shù)單元稱為“原始函數(shù)單元”,將新文件的函數(shù)單元稱為“新函數(shù)單元”。使用映射文件來識別函數(shù)單元的起始地址和結(jié)束地址,但是不限于此。
接下來,在塊504,預(yù)處理器對每一個(gè)唯一函數(shù)單元分配唯一索引或者索引值。這種對唯一函數(shù)單元的索引值的分配支持對原始文件版本和新文件版本兩者公共的函數(shù)單元的識別。因此,當(dāng)在文件的原始版本和新版本中找到相同的函數(shù)單元時(shí),對該函數(shù)分配公共索引值,但是本實(shí)施例不限于此。
作為示例,考慮包括原始函數(shù)單元F1、F2、F3和F4的原始文件版本和包括新函數(shù)單元F1、F2、F3和F5的新文件版本。如果預(yù)處理器使用索引值1、2、3、4和5分別對函數(shù)單元F1、F2、F3、F4和F5編寫索引,則對于原始文件版本組成下面的表 索引startAddressV1endAddressV1 1 0x80400x8062 2 0x80620x8080 3 0x80860x809e 4 0x90560x90a8 類似地,對于新文件版本組成下面的表 索引 startAddressV1endAddressV1 1 0x80600x8082 2 0x80820x80a0 3 0x80a60x80be 5 0x90e60x9138 在這兩個(gè)表中,通常將“startAddress”定義為相應(yīng)的函數(shù)單元的起始地址;因此,“startAddressV1”是原始文件的函數(shù)單元的起始地址,“startAddressV2”是新文件的函數(shù)單元的起始地址。此外,通過將函數(shù)單元的大小加到函數(shù)單元的起始地址來產(chǎn)生endAddress(結(jié)束地址),因此 endAddress=startAddress+函數(shù)單元的大小, 但是本實(shí)施例不限于此。因此,將endAddressV1定義為原始文件的函數(shù)單元的結(jié)束地址,而將endAddressV2定義為新文件的函數(shù)單元的結(jié)束地址。這里,還將結(jié)束地址的這種定義應(yīng)用于數(shù)據(jù)單元,但是不限于此。
然后,在塊506,預(yù)處理器使用來自上述表的索引值、起始地址和結(jié)束地址的信息產(chǎn)生公共函數(shù)單元的HintTable(線索表)。HintTable包括組成在一個(gè)表中的公共函數(shù)單元的信息,包括原始文件版本(V1)的原始函數(shù)單元的索引值、起始地址和結(jié)束地址以及新文件版本(V2)的新函數(shù)單元的起始地址和結(jié)束地址。使用本領(lǐng)域已知的任意技術(shù)來排列HintTable的信息。使用上述信息,產(chǎn)生如下的實(shí)施例的HintTable 索引 startAddV1 endAddV1 startAddV2 endAddV2 1 0x8040 0x80620x8060 0x8082 2 0x8062 0x80800x8082 0x80a0 3 0x8086 0x809e0x80a6 0x80be 在塊508,預(yù)處理器繼續(xù)針對包括目標(biāo)地址的原始函數(shù)單元的指令產(chǎn)生新目標(biāo)地址值。圖6是根據(jù)圖5的實(shí)施例用于產(chǎn)生電子文件的原始版本的代碼(文本)部分的新目標(biāo)地址值的流程圖508。
在描述新目標(biāo)地址值的產(chǎn)生時(shí),使用如下特定記號來描述與函數(shù)單元相關(guān)聯(lián)的各種地址。這里,通常使用記號“addr”稱謂指令地址;因此,“addrV1”是指原始函數(shù)單元中的指令地址,而“addrV2”是指新函數(shù)單元中的指令地址。這里,通常使用記號“targetAddr”稱謂目標(biāo)地址;因此,“targetAddrV1”是指原始函數(shù)單元中的目標(biāo)地址,而“targetAddrV2”是指新函數(shù)單元中相應(yīng)的目標(biāo)地址。此外,這里使用記號“targetStartAddrV1”稱謂包括targetAddrV1的原始函數(shù)單元的起始地址,“targetStartAddrV1”是包括targetAddrV1的原始函數(shù)單元的起始地址,這里使用記號“targetStartAddrV2”稱謂包括targetAddrV2的新函數(shù)單元的起始地址。
圖7是根據(jù)實(shí)施例的文件的原始版本V1和新版本V2的框圖,其示出參考電子文件的原始版本的代碼(文本)部分的新目標(biāo)地址值的產(chǎn)生所描述的差異地址(和相應(yīng)的記號)。第一公共函數(shù)單元CFU A和第二公共函數(shù)單元CFU B是原始版本V1和新版本V2公共的。原始版本V1的公共函數(shù)單元CFU B具有起始地址startAddrV1,并且包括位于指令地址addrV1的可計(jì)算指令cal_insA。下面描述可計(jì)算指令。原始版本V1的公共函數(shù)單元CFU A具有起始地址targetStartAddrV1,并且包括可計(jì)算指令cal_insA的目標(biāo)地址targetAddrV1。
類似地,新版本V2的公共函數(shù)單元CFU B具有起始地址startAddrV2,并且包括位于指令地址addrV2的可計(jì)算指令cal_insB。新版本V2的公共函數(shù)單元CFU A具有起始地址targetStartAddrV2,并且包括可計(jì)算指令cal_insB的目標(biāo)地址targetAddrV2。
返回到圖6,在塊602,新目標(biāo)地址值的產(chǎn)生通過從原始文件版本的原始函數(shù)單元j中讀取未經(jīng)預(yù)處理的可計(jì)算指令開始,其中,j是計(jì)數(shù)器值,其被初始化為值一,隨后每一次增加1,直到j(luò)=n為止,其中,n表示原始版本和新版本之間的公共函數(shù)單元的總數(shù)。
然后,在塊604,如下產(chǎn)生或者計(jì)算可計(jì)算指令的當(dāng)前目標(biāo)地址。對于包括目標(biāo)地址的任意指令,例如程序計(jì)數(shù)器相關(guān)的跳轉(zhuǎn)指令和加載/存儲(chǔ)指令,使用當(dāng)前指令地址和相應(yīng)的指令解碼(instruction decoding)來計(jì)算目標(biāo)地址。使用上述記號,當(dāng)前目標(biāo)地址計(jì)算變?yōu)? targetAddrV1=addrV1+decode(instruction) 或者可選地, decode(instruction)=targetAd由V1-addrV1。
如果值[targetAddrV1-addrV1]是已知的,則可以基于相應(yīng)的編碼方案如下計(jì)算指令 instruction=encode(targetAddrV1-addrV1)。
將這種類型的指令稱為可計(jì)算指令,這里稱為“cal_ins”,并且將值(targetAddrV1-addrV1)稱為可計(jì)算指令的值或者“指令值”。
對于公共函數(shù)單元中的可計(jì)算指令,實(shí)施例的預(yù)處理器使用原始版本中的指令值以及原始函數(shù)單元起始地址和新函數(shù)單元起始地址來產(chǎn)生公共函數(shù)單元的新版本中的指令值。因此,使用上述記號,使用原始版本中的指令值(targetAddrV1-addrV1)、startAddrV1、targetStartAddrV1、startAddrV2和targetStartAddrV2來產(chǎn)生或者計(jì)算新版本中的指令值(targetAddrV2-addrV2)。
因此,在產(chǎn)生原始文件的目標(biāo)地址(targetAddrV1)時(shí),在塊606,預(yù)處理器訪問HintTable以識別k,即包括目標(biāo)地址targetAddrV1的原始文件版本的函數(shù)單元。在塊608,通過原始函數(shù)單元j和其目標(biāo)函數(shù)單元k的標(biāo)識符,預(yù)處理器從HintTable中讀取startAddrV1、startAddrV2、targetStartAddrV1和targetStartAddrV2。
隨后,在塊610,預(yù)處理器現(xiàn)在產(chǎn)生cal_insB的指令值(targetAddrV2-addrV2)以代替cal_insA的指令值,如下。實(shí)施例的預(yù)處理器在至少兩個(gè)假設(shè)下工作,但是不限于此。第一假設(shè)假設(shè)原始版本和新版本兩者中具有相同大小的公共函數(shù)單元在原始版本和新版本兩者之間具有相同的指令結(jié)構(gòu),其中,指令結(jié)構(gòu)包括指令類型和指令順序。第二假設(shè)假設(shè)對于滿足第一假設(shè)的公共函數(shù)單元中的任意可計(jì)算指令,當(dāng)可計(jì)算指令是函數(shù)調(diào)用或者可計(jì)算指令的目標(biāo)地址落入也滿足第一假設(shè)的公共函數(shù)單元中時(shí),通常在原始版本和新版本兩者之間保持兩個(gè)不變量,如下 addrV1-startAddrV1=addrV2-startAddrV2 以及 targetAddrV1-targetStartAddrV1=targetAddrV2-targetStartAddrV2。
因此,根據(jù)這兩個(gè)假設(shè),在塊610,預(yù)處理器產(chǎn)生cal_insA的新指令值(targetAddrV2-addrV2),如下 targetAddrV2-addrV2=(targetAddrV1-addrV1) +(targetStartAddrV2-targetStartAddrV1) -(startAddrV2-startAddrV1), 這里稱為公式1。
在塊612,使用cal_insA的新指令值,預(yù)處理器將cal_insA修正為instruction=encode(targetAddrV2-addrV2)。
然后,使用新指令代替原始版本的地址addrV1處的原始指令cal_insA。
在塊614,預(yù)處理器隨后判斷原始函數(shù)單元j的任何可計(jì)算指令是否保持未經(jīng)預(yù)處理。當(dāng)可計(jì)算指令保持未經(jīng)預(yù)處理時(shí),預(yù)處理器返回,在塊602從原始函數(shù)單元j中讀取另一個(gè)或者可選地下一個(gè)未經(jīng)預(yù)處理的可計(jì)算指令,如上面所描述的繼續(xù)進(jìn)行預(yù)處理。
當(dāng)在塊614判斷為對原始函數(shù)單元j的所有可計(jì)算指令進(jìn)行了預(yù)處理時(shí),在塊616,預(yù)處理器判斷計(jì)數(shù)器j的值是否大于值n。判斷為j不大于n表示存在未經(jīng)預(yù)處理的公共函數(shù)單元,因此在塊618將計(jì)數(shù)器j的值增加1,如上面所描述的繼續(xù)進(jìn)行預(yù)處理。
判斷為j大于n表示已經(jīng)對原始文件版本的所有函數(shù)單元進(jìn)行了預(yù)處理。因此,在塊620,預(yù)處理器輸出包括新文件的近似版本的原始文件的修正版本。
如上面參考圖4所描述的,除了根據(jù)文本(代碼)模型假設(shè)去除次級變化之外,預(yù)處理器和近似例程還用來在塊410根據(jù)數(shù)據(jù)模型假設(shè)去除次級變化。圖8是根據(jù)圖4的實(shí)施例用來對電子文件的原始版本和新版本的數(shù)據(jù)部分進(jìn)行預(yù)處理的流程圖410。通常,文件的數(shù)據(jù)部分由一個(gè)或者多個(gè)這里稱為“數(shù)據(jù)單元”的全局變量單元或者塊構(gòu)成。
實(shí)施例的數(shù)據(jù)部分的預(yù)處理從在塊802識別原始文件和新文件的每一個(gè)數(shù)據(jù)單元的起始地址和結(jié)束地址開始,這里將原始文件的數(shù)據(jù)單元稱為“原始數(shù)據(jù)單元”,這里將新文件的數(shù)據(jù)單元稱為“新數(shù)據(jù)單元”。使用映射文件來識別數(shù)據(jù)單元的起始地址和結(jié)束地址,但是不限于此。
接下來,在塊804,預(yù)處理對每一個(gè)唯一數(shù)據(jù)單元分配唯一索引或者索引值。這種對唯一數(shù)據(jù)單元的索引值的分配支持對于原始文件版本和新文件版本兩者公共的數(shù)據(jù)單元的識別。因此,當(dāng)在文件的原始版本和新版本兩者中找到相同的數(shù)據(jù)單元時(shí),對該數(shù)據(jù)單元分配公共索引值,但是本實(shí)施例不限于此。對唯一數(shù)據(jù)單元分配索引值與上述對唯一函數(shù)單元分配索引值相同,但是不限于此。類似地,根據(jù)索引值組織的且包括每一個(gè)數(shù)據(jù)單元的起始地址和結(jié)束地址的表的產(chǎn)生與上述原始文件版本和新文件版本的函數(shù)單元的表的產(chǎn)生相同。然而,可選實(shí)施例可以使用任意數(shù)量的本領(lǐng)域已知的技術(shù)來分配索引值并產(chǎn)生表。
隨后,在塊806,預(yù)處理器使用來自上述表的索引值、起始地址和結(jié)束地址的信息來產(chǎn)生公共數(shù)據(jù)單元的HintTable。HintTable包括在一個(gè)表中組成的公共數(shù)據(jù)單元的信息,包括原始文件版本(V1)的原始數(shù)據(jù)單元的索引值、起始地址和結(jié)束地址以及新文件版本(V2)的新數(shù)據(jù)單元的起始地址和結(jié)束地址。HintTable的產(chǎn)生如上述參考公共函數(shù)單元的HintTable所描述的,但是在可選實(shí)施例中可以使用任意數(shù)量的本領(lǐng)域已知技術(shù)來產(chǎn)生HintTable。
在塊808,預(yù)處理器繼續(xù)產(chǎn)生原始版本的數(shù)據(jù)指針的新數(shù)據(jù)指針值。圖9是根據(jù)圖8的實(shí)施例用于產(chǎn)生電子文件的原始版本中的數(shù)據(jù)指針的新數(shù)據(jù)指針值的流程圖808。
數(shù)據(jù)指針是指向數(shù)據(jù)單元中的某些數(shù)據(jù)的指令。這里描述新數(shù)據(jù)指針值的產(chǎn)生時(shí)所使用的記號如下。這里,通常使用記號“dataPointer”稱謂包括數(shù)據(jù)指針的指令的地址;因此,“dataPointerV1”是指原始版本中的dataPointer,“dataPointerV2”是指新版本中的dataPointer。這里,使用記號“dataStartAddr”來稱謂包括數(shù)據(jù)指針?biāo)赶虻臄?shù)據(jù)的數(shù)據(jù)單元的起始地址;因此,“dataStartAddrV1”是指原始版本中的dataStartAddr,“dataStartAddrV2”是指新版本中的dataStartAddr。
圖10是根據(jù)實(shí)施例的文件的原始版本V1和新版本V2的框圖,其示出在產(chǎn)生電子文件的原始版本的新數(shù)據(jù)指針值時(shí)所使用的差異地址(和相應(yīng)的記號)。原始版本V1和新版本V2都包括代碼(文本)片段和數(shù)據(jù)片段。數(shù)據(jù)片段包括原始文件版本V1和新文件版本V2兩者公共的公共數(shù)據(jù)單元CDUA。原始版本V1包括代碼(文本)片段中指向原始版本的公共數(shù)據(jù)單元CDU A中的某些數(shù)據(jù)的數(shù)據(jù)指針dataPointerV1,其中原始版本V1中的CDU A的起始地址是dataStartAddrV1。類似地,新版本V2包括代碼(文本)片段中指向新版本V2的公共數(shù)據(jù)單元CDU A中的某些數(shù)據(jù)的數(shù)據(jù)指針dataPointerV2,其中原始版本V2中的CDU A的起始地址是dataStartAddrV2。dataStartAddr地址來自與文件的原始版本V1和新版本V2的軟件鏡像相關(guān)聯(lián)的映射文件。
返回到圖9,在塊902通過識別原始版本中未經(jīng)預(yù)處理的數(shù)據(jù)指針,開始新數(shù)據(jù)指針值的產(chǎn)生。如下面所描述的,實(shí)施例的預(yù)處理器使用原始版本中的指針值(dataPointerV1)以及包括dataPointerV1指向的數(shù)據(jù)的數(shù)據(jù)單元的起始地址(dataStartAddrV1)和其相應(yīng)的新版本中的數(shù)據(jù)單元的起始地址(dataStartAddrV2)來產(chǎn)生新版本的數(shù)據(jù)指針值(dataPointerV2)。在塊904這通過訪問HintTable來識別k,即原始版本中包括dataPointerV1指向的數(shù)據(jù)的數(shù)據(jù)單元,來進(jìn)行。在塊906,預(yù)處理器使用數(shù)據(jù)單元k的標(biāo)識符從HintTable中讀取dataStartAddrV1和dataStartAddrV2。
隨后,在塊908,預(yù)處理器產(chǎn)生數(shù)據(jù)指針值(dataPointerV2)來代替dataPointerV1,如下。實(shí)施例的預(yù)處理器在關(guān)于數(shù)據(jù)單元的至少兩個(gè)附加假設(shè)下工作,這里稱為第三和第四假設(shè),但是不限于此。第三假設(shè)假設(shè)原始版本和新版本兩者中具有相同大小的公共數(shù)據(jù)單元在原始版本和新版本兩者之間具有相同的數(shù)據(jù)結(jié)構(gòu),其中數(shù)據(jù)結(jié)構(gòu)包括數(shù)據(jù)變量的類型、大小和順序。第四假設(shè)假設(shè)對于滿足第三假設(shè)的公共數(shù)據(jù)單元中的任意數(shù)據(jù)指針,通常在原始版本和新版本兩者之間保持不變量,如下 dataPointerV1-dataStartAddrV1=dataPointerV2-dataStartAddrV2。因此,在塊908,預(yù)處理器根據(jù)第三和第四假設(shè)產(chǎn)生新數(shù)據(jù)單元的新數(shù)據(jù)指針值(dataPointerV2),如下 dataPointerV2=dataPointerV1+(dataStartAddrV2-dataStartAddrV1),這里稱為公式2。
在塊910,使用數(shù)據(jù)指針值dataPointerV2,預(yù)處理器在原始版本中相應(yīng)的地址處用dataPointerV2代替dataPointerV1。隨后,在塊912,預(yù)處理器判斷是否有原始數(shù)據(jù)單元的數(shù)據(jù)指針保持未經(jīng)處理。
當(dāng)原始數(shù)據(jù)單元的數(shù)據(jù)指針保持未經(jīng)處理時(shí),預(yù)處理器返回,在塊902從原始數(shù)據(jù)單元中讀取另一個(gè)或者可選地下一個(gè)未經(jīng)處理的數(shù)據(jù)指針,并且如上面所描述的繼續(xù)進(jìn)行預(yù)處理。當(dāng)在決912進(jìn)行判斷為對原始數(shù)據(jù)單元的所有數(shù)據(jù)指針進(jìn)行了預(yù)處理時(shí),在塊914,預(yù)處理器輸出包括新文件的近似版本的原始文件的修正后的版本。
由于在確定不同文件版本之間的公共單元的相對位置時(shí)使用,如上述在HintTable中使用的,將公共函數(shù)單元和公共數(shù)據(jù)單元的起始地址和結(jié)束地址統(tǒng)稱為“算法線索”或者“線索”。同樣地,如上所述,將這些線索傳送到接收差異或者△文件的客戶設(shè)備,用于在從△文件和原始文件恢復(fù)新文件版本時(shí)使用。因?yàn)榻?jīng)由用來將△文件和其它信息傳送到客戶設(shè)備的同一低帶寬信道進(jìn)行線索的傳送,所以實(shí)施例的預(yù)處理器進(jìn)行線索合并來合并HintTable的公共函數(shù)單元和公共數(shù)據(jù)單元,而不影響預(yù)處理算法或者例程的性能。這種合并減小了包括線索的文件的大小,從而減少了傳送到客戶設(shè)備的信息的量。
返回到圖4,在塊404,使用以上描述的通過對代碼(文本)部分進(jìn)行預(yù)處理而產(chǎn)生的公共函數(shù)單元,預(yù)處理器在線索合并例程或者算法的控制下合并公共函數(shù)單元以形成公共函數(shù)塊。圖11是根據(jù)圖4的實(shí)施例的公共函數(shù)單元的線索合并404的流程圖。
類似地,在塊406,預(yù)處理器使用以上描述的通過對數(shù)據(jù)部分進(jìn)行預(yù)處理而產(chǎn)生的公共數(shù)據(jù)單元來合并公共數(shù)據(jù)單元以形成公共數(shù)據(jù)塊。圖12是根據(jù)圖4的實(shí)施例的公共數(shù)據(jù)單元的線索合并406的流程圖。下面,依次描述公共函數(shù)單元和公共數(shù)據(jù)單元的線索合并。
雖然為了清楚這里分開描述公共函數(shù)單元和公共數(shù)據(jù)單元的線索合并,但是實(shí)施例能夠以任意順序或者任意組合執(zhí)行與合并相關(guān)聯(lián)的操作。關(guān)于記號,如上所述,這里通常使用記號“startAddress”來稱謂函數(shù)或者數(shù)據(jù)單元的起始地址;因此,“startAddress V1”是指原始函數(shù)或者數(shù)據(jù)單元的起始地址,而“startAddress V2”是指新函數(shù)或者數(shù)據(jù)單元的相應(yīng)的起始地址。類似地,這里通常使用記號“endAddress”來稱謂函數(shù)或者數(shù)據(jù)單元的結(jié)束地址;因此,“endAddress V1”是指原始函數(shù)或者數(shù)據(jù)單元的結(jié)束地址,而“endAddress V2”是指新函數(shù)或者數(shù)據(jù)單元的相應(yīng)的結(jié)束地址。
如上面參考圖5所描述的,產(chǎn)生包括組成在一個(gè)表中的公共函數(shù)單元的信息的公共函數(shù)單元的HintTable,包括原始文件版本V1的原始函數(shù)單元的索引值、起始地址和結(jié)束地址以及新文件版本V2的新函數(shù)單元的起始地址和結(jié)束地址。上面提供的HintTable用作描述公共函數(shù)單元的線索合并時(shí)的示例,但是本實(shí)施例不限于此 索引 startAddrV1 endAddrV1 startAddrV2 endAddrV2 1 0x8040 0x8062 0x80600x8082 2 0x8062 0x8080 0x80820x80a0 3 0x8086 0x809e 0x80a60x80be 參考圖4和圖11以及HintTable,公共函數(shù)單元的線索合并操作404從預(yù)處理器將HintTable的所有n個(gè)項(xiàng)標(biāo)記為可用、設(shè)置計(jì)數(shù)器j=1開始并且在塊1102從相關(guān)聯(lián)的HintTable中讀取函數(shù)單元j和單元)(j+1)的原始版本和新版本。在該示例中,單元j和單元(j+1)的值對應(yīng)于線索表的索引值,其中j=1,2,...,(n-1),但是不限于此。此外,起初將j的值設(shè)置為等于1,隨后隨著線索合并404的進(jìn)程和對公共單元進(jìn)行處理,使用本領(lǐng)域已知的方法使j的值增大。因此,在塊1102,讀取與索引值1和2(j+1=1+1=2)相關(guān)聯(lián)的公共函數(shù)單元的信息。
在塊1104,預(yù)處理器判斷公共函數(shù)單元j的原始版本V1和新版本V2的大小是否相等。通過在原始版本V1和新版本V2的起始地址和結(jié)束地址之間求差來進(jìn)行該判斷,如下 endAddrV1(j)-startAddrV1(j)=endAddrV2(j)-startAddrV2(j), 但是不限于此。當(dāng)原始版本V1和新版本V2具有不同大小的文件時(shí),操作進(jìn)行到塊1112,判斷j的值是否小于量(n-1)。
當(dāng)原始版本V1和新版本V2的大小相等時(shí),在塊1106,預(yù)處理器判斷公共函數(shù)單元j的原始版本V1的結(jié)束地址是否與公共函數(shù)單元(j+1)的原始版本V1的起始地址相同,如下 endAddrV1(j)=startAddrV1(j+1), 但是不限于此。當(dāng)公共函數(shù)單元j的原始版本V1的結(jié)束地址與公共函數(shù)單元(j+1)的原始版本V1的起始地址不同時(shí),操作進(jìn)行到塊1112,判斷j的值是否小于量(n-1)。
當(dāng)公共函數(shù)單元j的原始版本V1的結(jié)束地址與公共函數(shù)單元(j+1)的原始版本V1的起始地址相同時(shí),在塊1108,預(yù)處理器判斷公共函數(shù)單元j的新版本V2的結(jié)束地址是否與公共函數(shù)單元(j+1)的新版本V2的起始地址相同,如下 endAddrV2(j)=startAddrV2(j+1) 但是不限于此。當(dāng)公共函數(shù)單元j的新版本V2的結(jié)束地址與公共函數(shù)單元(j+1)的新版本V2的起始地址不同時(shí),操作進(jìn)行到塊1112,判斷j的值是否小于量(n-1)。
當(dāng)公共函數(shù)單元j的新版本V2的結(jié)束地址與公共函數(shù)單元(j+1)的新版本V2的起始地址相同時(shí),在塊1110,預(yù)處理器合并公共函數(shù)單元j和公共函數(shù)單元(j+1)的信息以形成公共函數(shù)塊來代替單元(j+1)的項(xiàng),然后將單元j的項(xiàng)標(biāo)記為不可用。然后,操作進(jìn)行到塊1112,判斷j的值是否小于量(n-1)。
在塊1112,預(yù)處理器判斷j的值是否小于量(n-1)。當(dāng)j的值等于量(n-1)時(shí),表示對所有函數(shù)單元進(jìn)行了預(yù)處理,操作進(jìn)行到塊1116,作為公共函數(shù)塊輸出所有可用項(xiàng),然后操作返回。當(dāng)j的值小于量(n-1)時(shí),表示剩余函數(shù)單元未經(jīng)預(yù)處理,在塊1114遞增j的值,操作進(jìn)行到塊1102,讀取與新的j值相對應(yīng)的公共函數(shù)單元的信息。然后,如上面所描述的繼續(xù)進(jìn)行預(yù)處理。
下面,參考圖11和HintTable描述涉及公共函數(shù)單元的線索合并的示例。操作從預(yù)處理器將所有三個(gè)項(xiàng)標(biāo)記為可用并且從HintTable中讀取函數(shù)單元1和2的原始版本和新版本開始。然后,預(yù)處理器判斷公共函數(shù)單元1的原始版本V1和新版本V2的大小是否相等。通過在原始版本V1和新版本V2的起始地址和結(jié)束地址之間求差來進(jìn)行該判斷,如下 endAddrV1(1)-startAddrV1(1)=endAddrV2(1)-startAddrV2(1)。
代入來自HintTable的實(shí)際值,得到 (0x8062)-(0x8040)=(0x8082)-(0x8060)。
當(dāng)原始版本V1和新版本V2的大小相等時(shí),接下來,預(yù)處理器判斷公共函數(shù)單元1的原始版本V1的結(jié)束地址是否與公共函數(shù)單元2的原始版本V1的起始地址相同,如下 endAddrV1(1)=startAddrV1(2)。
代入來自HintTable的實(shí)際值得到公共函數(shù)單元1的原始版本V1的結(jié)束地址與公共函數(shù)單元2的原始版本V1的起始地址相同的判斷,如下 (0x8062)=(0x8062)。
因?yàn)楣埠瘮?shù)單元1的原始版本V1的結(jié)束地址與公共函數(shù)單元2的原始版本V1的起始地址相同,接下來對公共函數(shù)單元1的新版本V2的結(jié)束地址是否與公共函數(shù)單元2的新版本V2的起始地址相同進(jìn)行判斷,如下 endAddrV2(1)=startAddrV2(2)。
代入來自HintTable的實(shí)際值得到公共函數(shù)單元1的新版本V2的結(jié)束地址與公共函數(shù)單元2的新版本V2的起始地址相同的判斷,如下 (0x8082)=(0x8082) 響應(yīng)于公共函數(shù)單元1的新版本V2的結(jié)束地址與公共函數(shù)單元2的新版本V2的起始地址相同的判斷,預(yù)處理器合并公共函數(shù)單元1和公共函數(shù)單元2的信息以形成公共函數(shù)塊,如下 索引 startAddrV1 endAddrV1 startAddrV2 endAddrV2 1 0x8040 0x8062 0x8060 0x8082不可用 2 0x8040 0x8080 0x8060 0x80a0可用 3 0x8086 0x809e 0x80a6 0x80be可用 繼續(xù)該示例,接下來,預(yù)處理器從HintTable中讀取函數(shù)單元2和3的原始版本和新版本。預(yù)處理器判斷公共函數(shù)單元2的原始版本V1和新版本V2的大小是否相等。通過在原始版本V1和新版本V2的起始地址和結(jié)束地址之間求差來進(jìn)行該判斷,如下 endAddrV1(2)-startAddrV1(2)=endAddrV2(2)-startAddrV2(2)。
代入來自HintTable的實(shí)際值,得到 (0x8080)-(0x8040)=(0x80a0)-(0x8060), 這顯示原始版本V1和新版本V2的大小相等。
接下來,預(yù)處理器判斷公共函數(shù)單元2的原始版本V1的結(jié)束地址是否與公共函數(shù)單元3的原始版本V1的起始地址相同,如下 endAddrV1(2)=startAddrV1(3)。
代入來自HintTable的實(shí)際值得到公共函數(shù)單元2的原始版本V1的結(jié)束地址與公共函數(shù)單元3的原始版本V1的起始地址不同的判斷,如下 (0x8080)不等于(0x8086)。
因?yàn)楣埠瘮?shù)單元2的原始版本V1的結(jié)束地址與公共函數(shù)單元3的原始版本V1的起始地址不相同,所以操作返回,并且不合并公共函數(shù)單元2和3以形成公共函數(shù)塊。
在合并公共函數(shù)單元之后,輸出上述示例的HintTable的可用項(xiàng)如下 索引 startAddrV1 endAddrV1 startAddrV2 endAddrV2 2 0x8040 0x8080 0x8060 0x80a0 3 0x8086 0x809e 0x80a6 0x80be 實(shí)施例的預(yù)處理器以與上述對公共函數(shù)單元進(jìn)行線索合并類似的方式對公共數(shù)據(jù)單元進(jìn)行線索合并。參考圖4和圖12,公共數(shù)據(jù)單元的線索合并操作406從預(yù)處理器標(biāo)記HintTable的所有n個(gè)項(xiàng)、設(shè)置計(jì)數(shù)器j=1開始并且在塊1202從相關(guān)聯(lián)的HintTable中讀取數(shù)據(jù)單元j和(j+1)的原始版本和新版本。單元j和單元(j+1)的值對應(yīng)于線索表的索引值,其中j=1,2,...,(n-1),但是不限于此。
在塊1204,預(yù)處理器判斷公共數(shù)據(jù)單元j的原始版本V1和新版本V2的大小是否相等。通過在原始版本V1和新版本V2的起始地址和結(jié)束地址之間求差來進(jìn)行該判斷,如下 endAddrV1(j)-startAddrV1(j)=endAddrV2(j)-startAddrV2(j), 但是不限于此。當(dāng)原始版本V1和新版本V2具有不同大小的文件時(shí),操作進(jìn)行到塊1212,判斷j的值是否小于量(n-1)。
當(dāng)原始版本V1和新版本V2的大小相等時(shí),在塊1206,預(yù)處理器判斷公共數(shù)據(jù)單元j的原始版本V1的結(jié)束地址是否與公共數(shù)據(jù)單元(j+1)的原始版本V1的起始地址相同,如下 endAddrV1(j)=startAddrV1(j+1), 但是不限于此。當(dāng)公共數(shù)據(jù)單元j的原始版本V1的結(jié)束地址與公共數(shù)據(jù)單元(j+1)的原始版本V1的起始地址不同時(shí),操作進(jìn)行到塊1212,判斷j的值是否小于量(n-1)。
當(dāng)公共數(shù)據(jù)單元j的原始版本V1的結(jié)束地址與公共數(shù)據(jù)單元(j+1)的原始版本V1的起始地址相同時(shí),在塊1208,預(yù)處理器判斷公共數(shù)據(jù)單元j的新版本V2的結(jié)束地址是否與公共數(shù)據(jù)單元(j+1)的新版本V2的起始地址相同,如下 endAddrV2(j)=startAddrV2(j+1), 但是不限于此。當(dāng)公共數(shù)據(jù)單元j的新版本V2的結(jié)束地址與公共數(shù)據(jù)單元(j+1)的新版本V2的起始地址不同時(shí),操作進(jìn)行到塊1212,判斷j的值是否小于量(n-1)。
當(dāng)公共數(shù)據(jù)單元j的新版本V2的結(jié)束地址與公共數(shù)據(jù)單元(j+1)的新版本V2的起始地址相同時(shí),在塊1210,預(yù)處理器合并公共數(shù)據(jù)單元j和公共數(shù)據(jù)單元(j+1)的信息以形成公共函數(shù)塊來代替單元(j+1)的項(xiàng),然后將單元j的項(xiàng)標(biāo)記為不可用。然后,操作進(jìn)行到塊1212,判斷j的值是否小于量(n-1)。
在塊1212,預(yù)處理器判斷j的值是否小于量(n-1)。當(dāng)j的值等于量(n-1)時(shí),表示對所有函數(shù)單元進(jìn)行了預(yù)處理,操作進(jìn)行到塊1216,作為公共數(shù)據(jù)塊輸出HintTable中的可用項(xiàng),然后操作返回。當(dāng)j的值小于量(n-1)時(shí),表示剩余函數(shù)單元未經(jīng)預(yù)處理,在塊1214遞增j的值,操作進(jìn)行到塊1202,讀取與新的j值相對應(yīng)的公共數(shù)據(jù)單元的信息。然后,如上面所描述的繼續(xù)進(jìn)行預(yù)處理。
所描述的用于對電子文件的不同版本進(jìn)行預(yù)處理的系統(tǒng)和方法可以應(yīng)用于使用任意數(shù)量的指令架構(gòu)的任意數(shù)量的處理和/或基于處理器的系統(tǒng)的軟件和可執(zhí)行文件。例如,如在D.Jagger和D.Seal的“ARMArchitecture Reference Manual”第二版中所描述的,可以在
架構(gòu)中使用這里的系統(tǒng)和方法。
架構(gòu)是基于16/32位嵌入式精簡指令集計(jì)算機(jī)(RISC,Reduced Instruction Set Computer)核心的微處理器架構(gòu),其包含Thumb 16位指令集。在
架構(gòu)中使用時(shí),例如,上述引入的可計(jì)算指令包括ARM/Thumb指令集的“branch with link(BL)”和“branch with link and change mode to ARM/Thumb(BLX)”指令。此外,上面引入的數(shù)據(jù)指針包括ARM/Thumb指令集的DCD指令。
除了不使用來自編譯器/連接器產(chǎn)生的映射文件、符號文件或者日志文件的符號信息而直接從可執(zhí)行軟件對產(chǎn)生公共代碼/數(shù)據(jù)表的預(yù)處理之外,這里描述的實(shí)施例的處理還包括后處理。對經(jīng)過預(yù)處理的數(shù)據(jù)的后處理包括對如上所述的公共代碼塊陣列的后處理。
圖13示出根據(jù)實(shí)施例的產(chǎn)生一個(gè)或多個(gè)新代碼塊的后處理。圖14示出根據(jù)實(shí)施例的增大一個(gè)或多個(gè)先前識別的公共代碼塊的大小同時(shí)還產(chǎn)生至少一個(gè)新代碼塊的后處理。如這里所描述的,提供系統(tǒng)和方法用于對文件的原始版本和新版本進(jìn)行預(yù)處理,作為在原始文件版本和新文件版本之間的差異文件產(chǎn)生的一部分。作為預(yù)處理的一部分,各個(gè)實(shí)施例在文件版本之間使用近似規(guī)則來去除/減小次級變化并對相應(yīng)的差異文件的信息中與這些變化的去除有關(guān)的信息進(jìn)行編碼。差異文件可以“over-the-air”(OTA,經(jīng)由無線下載)發(fā)送,并且用于在不同的計(jì)算機(jī)系統(tǒng)上產(chǎn)生新文件版本的拷貝。
參考圖13和14,左側(cè)標(biāo)為“舊鏡像V1”的豎線表示電子文件的原始版本。右側(cè)標(biāo)為“新鏡像V2”的豎線表示電子文件的新版本。每一個(gè)豎線表示例如字節(jié)序列的代碼單元。在描述用于改進(jìn)經(jīng)過預(yù)處理的指令的性能的后處理系統(tǒng)和方法的實(shí)施例時(shí)使用舊鏡像V1和新鏡像V2,但是不限于此。
在實(shí)施例中,如下面所描述的,后處理檢查指令特性以確定具有指定關(guān)系的指令對。例如,后處理檢查指令特性以確定對齊的指令對。對于每一對對齊的指令,后處理產(chǎn)生一對目標(biāo)地址。在集合了目標(biāo)地址對之后,可以使用后處理算法來延伸一些現(xiàn)有(已知)公共代碼塊和/或創(chuàng)建新公共代碼塊。后處理算法解決在提高預(yù)處理成功率和保持小的預(yù)處理數(shù)據(jù)的總量之間的平衡。這是重要的考慮,因?yàn)槿菀淄ㄟ^引入大量新的預(yù)處理數(shù)據(jù)來提高預(yù)處理成功率,而這是不理想的。在一個(gè)或多個(gè)后處理算法改進(jìn)了公共代碼塊之后,可以重新計(jì)算任意數(shù)據(jù)塊,這改進(jìn)了對具有數(shù)據(jù)指針的指令的預(yù)處理性能。這些指令包括但是不限于常見的ARM LDR指令。
這里描述的經(jīng)過預(yù)處理的數(shù)據(jù)的后處理接收經(jīng)過預(yù)處理的數(shù)據(jù)作為公共代碼塊的陣列??梢栽谝粋€(gè)或多個(gè)公共代碼塊中分析例如Thumb BL指令的可計(jì)算指令,以識別可以用于判斷是否延伸和/或增加公共代碼塊的指令特性。例如,可以分析可計(jì)算指令來識別具有在鏡像中但是不在已知公共代碼塊中的目標(biāo)地址的指令。由于這時(shí)舊鏡像和新鏡像兩者均可用,因此可以對在代碼塊中是否存在具有指定關(guān)系的指令例如對齊的指令進(jìn)行判斷。然后,可以部分基于指令的關(guān)系和/或起始地址和/或目標(biāo)地址來進(jìn)行關(guān)于是否增加和/或延伸的評價(jià)?;趯Πㄆ鹗嫉刂泛湍繕?biāo)地址的這種類型數(shù)據(jù)的收集,可以延伸現(xiàn)有或者已知公共代碼塊和/或產(chǎn)生新公共代碼塊。
實(shí)施例的后處理通過創(chuàng)建或者產(chǎn)生大小等于舊鏡像中的字節(jié)數(shù)的兩個(gè)整數(shù)陣列來收集數(shù)據(jù)。將所有整數(shù)都初始化為零,并且 int*backward,*forward。
如果地址“i”在舊鏡像中并且不在已知代碼塊中,則backward[i]計(jì)算如果向前延伸在前的代碼塊以包括地址“i”則可以對多少例如BL指令的指令正確地進(jìn)行預(yù)處理。Forward[i]計(jì)算如果向后延伸隨后的代碼塊以包括地址“i”則可以對多少指令正確地進(jìn)行預(yù)處理。后處理還創(chuàng)建addr_pair結(jié)構(gòu)列表,其中這些結(jié)構(gòu)具有所分配的等于舊鏡像中的字節(jié)數(shù)的大約一半的大小,這應(yīng)當(dāng)足以處理指令。例如,由于對于Thumb BL指令的第一部分和第二部分相關(guān)位是不同的,因此應(yīng)當(dāng)在鏡像中有不比鏡像中的字節(jié)數(shù)的大約四分之一多的BL指令。變量跟蹤存儲(chǔ)在該列表中的addr_pair的數(shù)目,起初將該變量設(shè)置為零。
實(shí)施例的addr_pair結(jié)構(gòu)包括如下的一對值 addr_pair*addrArray, 這些值表示舊鏡像中的目標(biāo)地址和新鏡像中的目標(biāo)地址,但是本實(shí)施例不限于此。當(dāng)一對目標(biāo)地址包括導(dǎo)致使用在前或者在后的代碼塊指令沒有被正確預(yù)處理的特性時(shí),將這一對目標(biāo)地址增加到該列表中。通常,當(dāng)嘗試延伸已知代碼塊時(shí),可以使用“backward(向后)”陣列和“forward(向前)”陣列,而當(dāng)嘗試創(chuàng)建新代碼塊時(shí),可以使用addr_pair列表。
如圖13所示,舊鏡像V1和新鏡像V2包括多個(gè)已知公共代碼塊1300、1302、1304和新公共代碼塊1307。例如,已知公共代碼塊1300可以表示JPEG或者M(jìn)PEG文件。已知公共代碼塊1302可以表示W(wǎng)AV文件。已知公共代碼塊1304可以表示地址簿。公共代碼塊1307是實(shí)施例的后處理產(chǎn)生的“新”公共代碼塊(公共代碼塊1307的“虛線”邊界表示其是新公共代碼塊)。雖然示出了特定數(shù)量的公共代碼塊,但是可以有更大或者更小數(shù)量的公共代碼塊。
實(shí)施例的后處理改進(jìn)了使用相對尋址概念的指令的預(yù)處理的性能??梢詫⑦@些指令稱為“信標(biāo)”或者“廣義信標(biāo)”。它們包括但不限于可計(jì)算指令,例如常見的ARM BL指令。由于當(dāng)創(chuàng)建預(yù)處理數(shù)據(jù)時(shí)舊鏡像和新鏡像兩者均可用,因此可以測試在公共代碼塊中是否存在處于對齊位置的指令。還可以檢查相關(guān)聯(lián)的起始和/或目標(biāo)地址?;陉P(guān)于指令的包括起始地址和/或目標(biāo)地址的這種類型的數(shù)據(jù)的收集,可以延伸現(xiàn)有公共代碼塊和/或創(chuàng)建新公共代碼塊。
根據(jù)實(shí)施例,函數(shù)/算法使用addr_pair列表來嘗試創(chuàng)建新代碼塊。
例如,該函數(shù)使用addr_pair列表來嘗試創(chuàng)建新代碼塊,如下 /* 通過addrArray搜索具有相同偏移(例如對齊)的地址對的連續(xù)序列(僅允許maxInterrupt中斷)。
返回DT_OK或者錯(cuò)誤代碼。
*/ static dt_int16 modify_tryToAddArray() 圖13示出了導(dǎo)致新公共代碼塊的1307的增加的后處理。當(dāng)判斷是否增加例如公共代碼塊1307的新公共代碼塊時(shí),后處理識別具有在鏡像中但是不在已知代碼塊中的目標(biāo)地址的指令。例如,后處理識別出指令1308、1310、1312和1314是包括可能導(dǎo)致產(chǎn)生一個(gè)或多個(gè)新公共代碼塊的特性的指令。每一個(gè)指令包括相關(guān)聯(lián)的起始地址和目標(biāo)地址(1308a-b、1310a-b、1312a-b和1314a-b)。指令1308、1310、1312和1314的后處理導(dǎo)致新公共代碼塊1307的增加。
如上所述,后處理識別出指令1308、1310、1312和1314具有導(dǎo)致創(chuàng)建新公共代碼塊1307的特性。例如,后處理識別出在已知代碼塊中不存在指令1308、1310、1312和1314的目標(biāo)地址1308b、1310b、1312b和1314b,并且根據(jù)定義的最小間隔將目標(biāo)地址1308b、1310b、1312b和1314b間隔開。另外,在例如已知公共代碼塊1306的一個(gè)或多個(gè)已知公共代碼塊內(nèi)存在指令1308、1310、1312和1314的起始地址1308a、1310a、1312a和1314a。
目標(biāo)地址1308b、1310b、1312b和1314b之間的間隔僅僅是在判斷是否創(chuàng)建新公共代碼塊時(shí)可以使用的一個(gè)因素。包括指向公共區(qū)域的目標(biāo)地址的指令的數(shù)量是在判斷是否創(chuàng)建新公共代碼塊時(shí)可以使用的另一個(gè)因素。另外,包括指向公共區(qū)域的目標(biāo)地址的指令的頻率是在判斷是否創(chuàng)建新公共代碼塊時(shí)可以使用的另一個(gè)因素。根據(jù)實(shí)施例,基于可以指向舊鏡像和新鏡像中的一個(gè)或多個(gè)公共代碼區(qū)域的指令的數(shù)量、指令的頻率和指令之間的間隔中的至少一個(gè)來創(chuàng)建一個(gè)或多個(gè)新代碼塊。
現(xiàn)在,參考圖14,根據(jù)實(shí)施例,使用后處理來增大一個(gè)或多個(gè)先前識別出的公共代碼塊的大小或者擴(kuò)展一個(gè)或多個(gè)先前識別出的公共代碼塊,同時(shí)還產(chǎn)生新公共代碼塊。關(guān)于對代碼塊進(jìn)行后處理的算法,該函數(shù)/算法可以使用“backward”陣列和“forward”陣列來延伸代碼塊,如下 /* 查看代碼塊之間的每一個(gè)間隙。
可以將相鄰的塊延伸到間隙中。
返回DT_OK或者代碼錯(cuò)誤。
*/ static dt_int16 modify_tryToExtend() 如圖14所示,舊鏡像V1和新鏡像V2包括多個(gè)已知公共代碼塊1400、1402、1404、1406和新公共代碼塊1408。如上面所討論的,后處理可以擴(kuò)展例如已知公共代碼塊1400~1406中的一個(gè)或多個(gè)的一個(gè)或多個(gè)先前識別出的公共代碼塊或者增大其大小。當(dāng)判斷是否延伸或擴(kuò)展例如公共代碼塊1402的已知公共代碼塊時(shí),后處理識別具有在鏡像中但是不在已知代碼塊中的目標(biāo)地址的指令。后處理還識別具有相對于指令和/或已知公共代碼塊具有可計(jì)算關(guān)系的起始地址的指令。
例如,后處理識別出指令1410和1412是包括可能導(dǎo)致例如已知公共代碼塊1402的一個(gè)或多個(gè)已知公共代碼塊的擴(kuò)展的特性的指令。即,識別出的指令1410和1412具有不在已知公共代碼塊中的相應(yīng)的目標(biāo)地址1410b和1412b。由于目標(biāo)地址1410b和1412b不在已知公共代碼塊中,因此后處理可以評價(jià)指令1410和1412的一個(gè)或多個(gè)特性來判斷是否擴(kuò)展已知公共代碼塊1402。
在確定目標(biāo)地址1410b和1412b不在已知公共代碼塊中之后,后處理可以檢查指令1410和1412的每一個(gè)起始地址1410a和1412a,來判斷是否擴(kuò)展已知公共代碼塊1402以包括目標(biāo)地址1410b和1412b。根據(jù)實(shí)施例,由于起始地址1410a在已知公共代碼塊1400內(nèi),因此后處理檢查指令1410的起始地址1410a和已知公共代碼塊1400的起始地址1400a之間的偏移或者差。在圖14中,將該差表示為“△a”。類似地,后處理檢查指令1412的起始地址1412a和已知公共代碼塊1400的起始地址1400a之間的偏移或者差。將該差表示為“△b”。
如果△a等于△b,則起始地址1410a和1412a對齊,后處理擴(kuò)展已知公共代碼塊1402以包括目標(biāo)地址1410b和1412b。換句話說,基于指令1410和1412的一個(gè)或多個(gè)特性,后處理可以增大公共代碼塊1402的大小使得現(xiàn)在擴(kuò)展后的公共代碼塊1402包含目標(biāo)地址1410b和1412b。因此,延伸后的公共代碼塊1402包括新的邊界1418,其對應(yīng)于公共代碼塊1402的大小的增加。后處理可以通過使用backward和/或forward陣列來延伸公共代碼塊的大小,從而改變線索表中的兩個(gè)編號。如上面所描述的,移動(dòng)邊界(通過修正StartADDRV1(i)和StartADDV2(i))也可以改變SIZE變量。
作為又一個(gè)示例,后處理識別出指令1414和1416是包括可能導(dǎo)致例如已知公共代碼塊1406的一個(gè)或多個(gè)已知公共代碼塊的擴(kuò)展的特性的指令。即,識別出的指令1414和1416具有不在已知公共代碼塊中的相應(yīng)的目標(biāo)地址1414b和1416b。由于目標(biāo)地址1414b和1416b不在已知公共代碼塊中,因此后處理可以評價(jià)指令1414和1416的一個(gè)或多個(gè)的一個(gè)或多個(gè)特性來判斷是否擴(kuò)展已知公共代碼塊1406。
由于目標(biāo)地址1414b和1416b不在已知公共代碼塊中,因此后處理可以檢查指令1414和1416的每一個(gè)起始地址1414a和1416a,來判斷是否擴(kuò)展已知公共代碼塊1406以包括目標(biāo)地址1414b和1416b。如上所述,根據(jù)實(shí)施例,后處理檢查指令1414的起始地址1414a和已知公共代碼塊1404的起始地址1404a之間的偏移或者差。在圖14中,將該差表示為“△c”。類似地,后處理檢查指令1416的起始地址1416a和已知公共代碼塊1404的起始地址1404b之間的偏移或者差。將該差表示為“△d”。
如果△c等于△d,則起始地址1414a和1416a對齊,后處理擴(kuò)展已知公共代碼塊1404以包括目標(biāo)地址1414b和1416b。換句話說,基于指令1414和1416的一個(gè)或多個(gè)特性,后處理可以增大公共代碼塊1406的大小使得現(xiàn)在擴(kuò)展后的公共代碼塊1406包含目標(biāo)地址1414b和1416b。因此,延伸后的公共代碼塊1406包括新的邊界1420,其對應(yīng)于公共代碼塊1406的大小的增加。在該示例中,向后延伸了公共代碼塊1406,而在第一示例中向前延伸了公共代碼塊1402。如前面所描述的,關(guān)于向后還是向前延伸的判斷至少部分基于要正確地對多少指令進(jìn)行預(yù)處理。
除了延伸已知公共代碼塊1402和1406之外,后處理還增加了新公共代碼塊1408。公共代碼塊1408是實(shí)施例的后處理產(chǎn)生的“新”公共代碼塊(公共代碼塊1408的“虛線”邊界表示其是新公共代碼塊)。當(dāng)判斷是否增加例如公共代碼塊1408的新公共代碼塊時(shí),后處理識別具有在鏡像中但是不在已知代碼塊中的目標(biāo)地址的指令。例如,后處理識別出指令1422、1424、1426和1428是包括可能導(dǎo)致一個(gè)或多個(gè)新公共代碼塊的產(chǎn)生的特性的指令。指令1422、1424、1426和1428的后處理導(dǎo)致增加新公共代碼塊1408。
如上所述,后處理識別出指令1422、1424、1426和1428具有導(dǎo)致創(chuàng)建新公共代碼塊1408的特性。例如,后處理識別出在已知代碼塊中不存在目標(biāo)地址1422b、1424b、1426b和1428b,并且根據(jù)定義的最小間隔將目標(biāo)地址1422b、1424b、1426b和1428b間隔開。另外,在已知公共代碼塊1402和1404內(nèi)存在起始地址1422a、1424a、1426a和1428a。目標(biāo)地址1422b、1424b、1426b和1428b之間的間隔僅僅是在判斷是否創(chuàng)建例如新公共代碼塊1408的新公共代碼塊時(shí)可以使用的一個(gè)因素。
包括指向公共區(qū)域的目標(biāo)地址的指令的數(shù)量是在判斷是否創(chuàng)建新公共代碼塊時(shí)可以使用的另一個(gè)因素。另外,包括指向公共區(qū)域的目標(biāo)地址的指令的頻率是在判斷是否創(chuàng)建新公共代碼塊時(shí)可以使用的另一個(gè)因素。根據(jù)實(shí)施例,基于可以指向舊版本和新版本中的一個(gè)或多個(gè)公共代碼區(qū)域的指令的數(shù)量、指令的頻率和指令之間的間隔中的至少一個(gè)來創(chuàng)建一個(gè)或多個(gè)新代碼塊。
可能改變的參數(shù)包括但不限于 /*可以增加的塊的最大數(shù)量。
基于經(jīng)驗(yàn),增加大于10000個(gè)無用*/ const int maxAdditional=10000 /*地址對的連續(xù)序列的最大長度, 嘗試增加塊*/ const int minLength=10 /*在地址對的連續(xù)序列中允許的中斷的最大數(shù)量*/ const int maxInterrupt=1 在一些實(shí)例中,使用后處理技術(shù)實(shí)現(xiàn)的總體改進(jìn)是相當(dāng)顯著的。這是可預(yù)期的,部分因?yàn)檫@些實(shí)施例能夠找到大小不大但是按照鏡像內(nèi)的指令的總體圖卻非常重要的公共代碼塊。一個(gè)這種示例是ARM代碼中公共的插入代碼(veneer)。這些插入代碼通常僅僅是幾個(gè)字節(jié),因此使用傳統(tǒng)技術(shù)難以檢測到。
實(shí)施例的“數(shù)據(jù)陣列”包括但不限于以下 int *backward,*forward; addr_pair*addrArray; 根據(jù)實(shí)施例,對于代碼塊陣列的給定輸入,可以執(zhí)行兩個(gè)不同的后處理過程,并且基于經(jīng)過正確預(yù)處理的指令數(shù)量選擇過程。兩個(gè)不同的過程包括下面描述的第一過程和第二過程。第一過程包括但不限于清除數(shù)據(jù)陣列;基于輸入代碼塊計(jì)算數(shù)據(jù)陣列;modify_tryToAddArray();清除數(shù)據(jù)陣列;基于修正后的代碼塊計(jì)算數(shù)據(jù)陣列;modify_tryToExtend();以及基于修正后的代碼塊計(jì)算經(jīng)過正確預(yù)處理的指令數(shù)量。
第二過程包括但不限于清除數(shù)據(jù)陣列;基于輸入代碼塊計(jì)算數(shù)據(jù)陣列;modify_tryToExtend();清除數(shù)據(jù)陣列;基于修正后的代碼塊計(jì)算數(shù)據(jù)陣列;modify_tryToAddArray();基于修正后的代碼塊計(jì)算經(jīng)過正確預(yù)處理的指令數(shù)量。第一過程和第二過程的不同之處在于,它們以相反的序列使用算法(modify_tryToAddArray()和modify_tryToExtend())。至少部分基于經(jīng)過正確預(yù)處理的指令數(shù)量來進(jìn)行第一或者第二過程的選擇。
圖15A~15F是提供上面討論的預(yù)處理和后處理方法的示例結(jié)果的圖形表示。采樣數(shù)據(jù)包括表示“舊鏡像”的“v1.bin”和表示“新鏡像”的“v2.bin”。兩個(gè)鏡像具有近似相同數(shù)量的BL指令。在v1.bin中有259,653個(gè)BL指令,在v2.bin中有261,283個(gè)BL指令。
圖15A示出預(yù)處理之后的結(jié)果。如圖15A所示,垂直條紋顯示具有變化的寬度的多個(gè)公共代碼塊。例如,1500、1502、1504、1506、1508、1510和1512是示例性公共代碼塊。除了公共代碼塊1500~1512之外,圖15A還包括其它公共代碼塊。圖15A底部的水平軸是去除了填充(padding)區(qū)域之后的舊鏡像(v1.bin)的地址空間。該圖中間的水平軸是去除了填充區(qū)域之后的新鏡像(v2.bin)的地址空間。對于本示例,僅在地址9,585,324有一個(gè)填充區(qū)域位于圖的右側(cè)附近。填充區(qū)域的大小是245,076字節(jié)。小于9,585,324的地址不受填充影響,圖中的地址等于鏡像中的實(shí)際地址。
如上所述,每一個(gè)垂直條紋表示一個(gè)公共代碼塊,第一部分標(biāo)識出舊鏡像中的區(qū)域(這是與圖中的下部軸相接觸的條紋的范圍),第二部分標(biāo)識出新鏡像中的區(qū)域(這是與圖中的中間軸相接觸的條紋的范圍)。圖中的大多數(shù)條紋顯示是幾乎垂直的,這是因?yàn)樵搱D的水平刻度大于九兆字節(jié),在這種大的刻度上不容易看出代碼塊小的偏移。
在公共代碼塊中的v1.bin中有258,822個(gè)BL指令。其中,187,162個(gè)具有也在公共代碼塊中的目標(biāo)地址。在這些目標(biāo)地址中,公共代碼塊正確地預(yù)測了186,058個(gè)。正確的預(yù)測通常意味著目標(biāo)地址之間的間隔以與相關(guān)公共代碼塊偏移一致的方式在舊鏡像和新鏡像之間不同。如上面所說明的,后處理方法分析在公共代碼塊中沒有目標(biāo)地址的例如BL指令的指令。如果指令在公共代碼塊中沒有目標(biāo)地址,則后處理嘗試通過延伸已知公共代碼塊和/或增加新公共代碼塊來改進(jìn)公共代碼塊,但是不限于此。
如上面所描述的,根據(jù)實(shí)施例,后處理嘗試以下過程 1.modify_tryToAddArray 2.modify_tryToExtend 后處理產(chǎn)生正確預(yù)測的242,198個(gè)BL指令的計(jì)數(shù)。
接下來,后處理嘗試以下過程 1.modify_tryToExtend 2.modify_tryToAddArray 該后處理產(chǎn)生正確預(yù)測的257,217個(gè)BL指令的計(jì)數(shù)。由于第二過程產(chǎn)生更多數(shù)量的正確預(yù)測的指令,因此對于該示例使用第二過程。應(yīng)當(dāng)指出,來自第二過程的計(jì)數(shù)相當(dāng)接近v1.bin中的BL指令的總數(shù)258,822。此外,回顧在后處理之前正確預(yù)測的BL指令的計(jì)數(shù)是186,058。因此,作為后處理方法的結(jié)果是△文件明顯更小。未經(jīng)后處理的△文件的大小是274,259字節(jié)。經(jīng)過后處理的△文件的大小是131,799字節(jié)。因此,對于該示例,后處理產(chǎn)生了大小小于沒有使用后處理的△文件的大小的一半的△文件。
圖15B示出后處理之后的結(jié)果。如圖15B所示,垂直條紋顯示具有變化的寬度的多個(gè)公共代碼塊。例如,1514、1516、1518、1520、1522、1524和1526是示例性公共代碼塊。除了公共代碼塊1514~1526之外,圖15B還包括其它公共代碼塊。上部區(qū)域是受后處理影響的字節(jié)的密度。我們注意到該曲線趨于比圖1中的相應(yīng)的曲線高。尤其在左側(cè)從0到大約2,000,000的地址范圍內(nèi)這值得注意(地址以圖底部的水平軸作為參考)。為了理解該結(jié)果,我們看圖15C,其示出v2.bin中具有鏡像內(nèi)的目標(biāo)地址的BL指令。對于v1.bin可以繪制類似的曲線圖。用菱形標(biāo)記每一個(gè)點(diǎn),以使其更容易看到。點(diǎn)表示BL指令。水平軸上的值是指令的地址,垂直軸上的值是其目標(biāo)地址。參看圖的左下部,我們看到很少的具有從0到2,000,000的范圍內(nèi)的地址的BL指令具有1,000,000附近的目標(biāo)地址。這對應(yīng)于左下部(被虛線包圍)的水平分組的點(diǎn)。
圖15D和15E分別是圖15A和15B的相關(guān)區(qū)域的放大結(jié)果。僅放大了水平軸(垂直軸未發(fā)生變化)。圖15D是放大了的圖15A,擴(kuò)展了水平軸以顯示使公共代碼塊1500、1502和1504高亮的從900,000到1,100,000的范圍。圖15E是放大了的圖15B,擴(kuò)展了水平軸以顯示使公共代碼塊1514、1516、1518和1520高亮的從900,000到1,100,000的范圍。在針對沒有使用后處理方法的計(jì)算的圖15D中,有一些可以看到的間隙。然而,如圖15E所示,后處理通過延伸(例如使用modify_tryToExtend())相鄰的公共代碼塊(例如1514、1516和1520)和/或通過引入新(例如使用modify_tryToAddArray())公共代碼塊(例如1518)幾乎填滿了這些間隙。
下面的表提供更詳細(xì)的信息。該表突出了上面討論的對于檢查后的區(qū)域中的幾個(gè)公共代碼塊的后處理的效果。
在上述表中,用三個(gè)編號描述每一個(gè)公共代碼塊a、b和c。前綴“a”表示v1.bin中的塊的起始地址。前綴“b”表示v2.bin中的塊的起始地址。前綴“c”表示(v1.bin和v2.bin兩者中的)塊的長度。
表中的編號顯示第一塊在其末端經(jīng)過了延伸,這是因?yàn)閍和b值是相同的,但是c值增大了。該延伸是使用modify_tryToExtend()算法完成的。還使用modify_tryToExtend()算法在左右兩側(cè)延伸了第二塊。使用modify_tryToAddArray()算法增加了新的塊(這是圖15E的第三窄塊)。應(yīng)當(dāng)指出,表中的最后一塊未發(fā)生變化。在圖15D~15E中這些變化是明顯的。圖15F是放大的圖15C的區(qū)域,其示出了后處理增加的塊的效果。增加的塊中所包含的點(diǎn)表示現(xiàn)在預(yù)處理的BL指令。
作為使用上述預(yù)處理和/或后處理的設(shè)備和/或系統(tǒng)的示例,接收并使用△文件的計(jì)算設(shè)備可以是駐留需要更新的相應(yīng)軟件應(yīng)用程序的客戶設(shè)備,例如蜂窩式電話、移動(dòng)電子設(shè)備、移動(dòng)通信設(shè)備、個(gè)人數(shù)字助理以及其它基于處理器的設(shè)備。通過使電信公司(carrier)和設(shè)備制造商能夠經(jīng)由其無線基礎(chǔ)設(shè)施有效地分配電子文件內(nèi)容和應(yīng)用程序來為從固件到嵌入式應(yīng)用程序的所有移動(dòng)設(shè)備軟件提供這種支持。
受益于上述預(yù)處理和/或后處理的系統(tǒng)的另一個(gè)示例包括使用有線串行連接以將△文件從駐留文件差異產(chǎn)生器的設(shè)備傳送到駐留文件更新產(chǎn)生器的設(shè)備的系統(tǒng)。這些系統(tǒng)一般具有慢的傳送速率,并且因?yàn)閭魉退俾事?,所以△文件的大小的減小是一種實(shí)現(xiàn)更快的傳送時(shí)間的方式。
受益于預(yù)處理和/或后處理的使用的系統(tǒng)的又一個(gè)示例包括使用無線電通信將△文件從駐留文件差異產(chǎn)生器的設(shè)備傳送到駐留文件更新產(chǎn)生器的設(shè)備的無線系統(tǒng)。在遭受與無線連接相關(guān)聯(lián)的低可靠性的同時(shí),這些系統(tǒng)還具有慢的傳送速率。在這些系統(tǒng)中使用更小的△文件提供幾個(gè)優(yōu)點(diǎn)。例如,更小的文件大小產(chǎn)生更快的△文件傳送時(shí)間。更快的傳送時(shí)間在為設(shè)備用戶節(jié)省時(shí)間的同時(shí),減少了將錯(cuò)誤引入△文件中的機(jī)會(huì),從而提高了系統(tǒng)可靠性。此外,使用蜂窩式通信,對于一般對服務(wù)按分鐘收費(fèi)的消費(fèi)者,減少了的傳送時(shí)間產(chǎn)生成本的節(jié)約。
作為另一個(gè)優(yōu)點(diǎn),更小的△文件減小了將△文件傳送到客戶設(shè)備所需的帶寬。減小的帶寬允許經(jīng)由分配的信道支持更多客戶設(shè)備。與減少的傳送時(shí)間相同,這也使無線服務(wù)供應(yīng)商的運(yùn)營成本降低。
本發(fā)明的各方面可以實(shí)現(xiàn)為被編程到各種電路中的任意一個(gè)中的功能,各種電路包括例如場可編程門陣列(FPGA,field programmable gatearray)、可編程陣列邏輯(PAL,programmable array logic)器件的可編程邏輯器件(PLD,programmalbe logic device)、電可編程邏輯和存儲(chǔ)器件及基于標(biāo)準(zhǔn)單元的器件以及專用集成電路(ASIC,application specificintegrated circuit)。用于實(shí)現(xiàn)本發(fā)明的各方面的一些其它可能包括具有存儲(chǔ)器(例如電可擦除可編程只讀存儲(chǔ)器(EEPROM,electronicallyerasable programmable read only memory))的微控制器、嵌入式微處理器、固件、軟件等等。此外,可以在具有基于軟件的電路仿真、離散邏輯(連續(xù)的和組合的)、定制器件、模糊(神經(jīng))邏輯、量子(quantum)器件和上述器件類型的任意組合的微處理器中實(shí)施本發(fā)明的各方面。當(dāng)然,可以以各種元件類型提供基本器件技術(shù),例如像互補(bǔ)金屬氧化物半導(dǎo)體(CMOS)的金屬氧化物半導(dǎo)體場效應(yīng)晶體管(MOSFET)技術(shù)、像射極耦合邏輯(ECL,emitter-coupled logic)的雙極技術(shù)、聚合技術(shù)(例如硅共軛聚合體(silicon-conjugated polymer)和金屬共軛聚合體金屬結(jié)構(gòu)(metal-conjugated polymer-metal structure))、混合模擬和數(shù)字(mixedanalog and digital)等等。
可以通過程序或者程序代碼的集合來執(zhí)行作為本發(fā)明在這里描述的功能,程序或者程序代碼的集合包括在一個(gè)或多個(gè)通用計(jì)算機(jī)或者基于處理器的系統(tǒng)上運(yùn)行或者由一個(gè)或多個(gè)通用計(jì)算機(jī)或基于處理器的系統(tǒng)執(zhí)行的軟件、固件、可執(zhí)行代碼或者指令。計(jì)算機(jī)或者其它基于處理器的系統(tǒng)可以包括用于執(zhí)行程序代碼的一個(gè)或多個(gè)中央處理器、例如用于在程序執(zhí)行過程中臨時(shí)存儲(chǔ)數(shù)據(jù)和數(shù)據(jù)結(jié)構(gòu)的RAM的易失性存儲(chǔ)器、用于存儲(chǔ)例如包括數(shù)據(jù)庫和其它數(shù)據(jù)存儲(chǔ)的程序和數(shù)據(jù)的硬盤驅(qū)動(dòng)或者光盤驅(qū)動(dòng)的非易失性存儲(chǔ)器、以及用于訪問企業(yè)內(nèi)部互聯(lián)網(wǎng)和/或因特網(wǎng)的網(wǎng)絡(luò)接口。然而,還可以使用專用計(jì)算機(jī)、無線計(jì)算機(jī)、狀態(tài)機(jī)和/或硬配線電子電路來實(shí)現(xiàn)這里描述的功能。
應(yīng)當(dāng)指出,按照其行為、寄存器傳送、邏輯組件、晶體管、布局幾何和/或其它特性,可以使用計(jì)算機(jī)輔助設(shè)計(jì)工具來描述這里公開的各種系統(tǒng)和方法的組件,并且將其表達(dá)(或者表示)為在各種計(jì)算機(jī)可讀介質(zhì)中實(shí)施的數(shù)據(jù)和/或指令。可以實(shí)現(xiàn)這種電路表達(dá)的文件和其它對象的格式包括但不限于支持例如C、Verilog和HLDL的行為語言的格式;支持例如RTL的寄存器級別描述語言的格式;以及支持例如GDSII、GDSIII、GDSIV、CIF、MEBES的幾何描述語言的格式以及任何其它合適的格式和語言。
可以實(shí)施這種格式化數(shù)據(jù)和/或指令的計(jì)算機(jī)可讀介質(zhì)包括但不限于各種形式的非易失性存儲(chǔ)介質(zhì)(例如光、磁或者半導(dǎo)體存儲(chǔ)介質(zhì))和可以用于通過無線、光和/或有線信令介質(zhì)傳送這種格式化數(shù)據(jù)和/或指令的載波。通過載波傳送這種格式化數(shù)據(jù)和/或指令的示例包括但不限于經(jīng)由一個(gè)或多個(gè)數(shù)據(jù)傳送協(xié)議(例如HTTP、FTP、SMTP等等)通過因特網(wǎng)和/或其它計(jì)算機(jī)網(wǎng)絡(luò)進(jìn)行傳送(上傳、下載、e-mail等等)。當(dāng)經(jīng)由一個(gè)或多個(gè)計(jì)算機(jī)可讀介質(zhì)在計(jì)算機(jī)系統(tǒng)內(nèi)接收到時(shí),可以由計(jì)算機(jī)系統(tǒng)內(nèi)的處理實(shí)體(例如一個(gè)或多個(gè)處理器)結(jié)合一個(gè)或多個(gè)其它計(jì)算機(jī)程序的執(zhí)行來處理上面描述的系統(tǒng)和方法的基于這種數(shù)據(jù)和/或指令的表達(dá)。
除非是上下文中清楚地需要,在說明書和權(quán)利要求書中,詞語“包括”、“包含”等被解釋為與排他或者窮盡的含義相對的包含的含義;也就是說,“包括但不限于”的含義。使用單數(shù)或者復(fù)數(shù)的詞語也分別包括復(fù)數(shù)或者單數(shù)。另外,詞語“這里”、“下面”、“以上”、“以下”以及類似意思的詞語是指本申請是一個(gè)整體,而不是指本申請的任何特定部分。當(dāng)使用詞語“或者”指兩個(gè)或者更多項(xiàng)的列表時(shí),該詞語覆蓋所有以下對該詞語的解釋列表中的項(xiàng)中的任意一個(gè)、列表中的所有項(xiàng)以及列表中的項(xiàng)的任意組合。
以上對本發(fā)明的說明性實(shí)施例的描述不旨在窮盡或者將本發(fā)明限制到所公開的具體形式。雖然這里為了說明描述了本發(fā)明的特定實(shí)施例和示例,但是如本領(lǐng)域技術(shù)人員意識到的,可以在本發(fā)明的范圍內(nèi)進(jìn)行各種等同變形。這里提供的本發(fā)明的原理可以應(yīng)用于其它處理系統(tǒng)和通信系統(tǒng),而不僅僅用于以上描述的文件求差系統(tǒng)。
可以組合上面描述的各種實(shí)施例的元件和動(dòng)作來提供其它實(shí)施例。可以按照上述詳細(xì)說明對本發(fā)明進(jìn)行這些和其它變化。如果需要,可以對本發(fā)明的各方面進(jìn)行修正來使用上面描述的各個(gè)專利和申請的系統(tǒng)、功能和概念以提供本發(fā)明的其它實(shí)施例。
總而言之,在所附權(quán)利要求中,使用的術(shù)語不應(yīng)當(dāng)被解釋為將本發(fā)明限制到在說明書和權(quán)利要求中公開的特定實(shí)施例,而應(yīng)當(dāng)被解釋為包括根據(jù)權(quán)利要求工作以提供文件求差的所有處理系統(tǒng)。因此,本發(fā)明不限于本公開,而是由權(quán)利要求整體確定本發(fā)明的范圍。
雖然下面以特定權(quán)利要求的形式呈現(xiàn)了本發(fā)明的特定方面,但是本發(fā)明人以任意數(shù)量的權(quán)利要求的形式預(yù)期本發(fā)明的各個(gè)方面。例如,雖然描述為僅在計(jì)算機(jī)可讀介質(zhì)中實(shí)施本發(fā)明的一個(gè)方面,但是同樣可以在計(jì)算機(jī)可讀介質(zhì)中實(shí)施其它方面。因此,本發(fā)明人保留在提交申請之后增加附加權(quán)利要求以針對本發(fā)明的其它方面追加這種附加權(quán)利要求形式的權(quán)利。
權(quán)利要求
1.一種用于更新電子文件的系統(tǒng),包括
產(chǎn)生組件,用于產(chǎn)生包括被編碼的電子文件的原始版本和新版本之間的差異的差異文件,其中產(chǎn)生組件通過如下所述來減小差異文件的大小
識別原始版本和新版本之間公共的第一和第二文本部分,其中原始版本中的第一文本部分包括具有第一起始地址和第一目標(biāo)地址的第一可計(jì)算指令,新版本中的第二文本部分包括具有第二起始地址和第二目標(biāo)地址的第二可計(jì)算指令;
基于第一和第二可計(jì)算指令的特性確定是延伸原始版本和新版本之間公共的已知文本部分還是創(chuàng)建原始版本和新版本之間公共的新文本部分中的至少一個(gè);以及
去除識別出的原始版本和新版本公共的文本部分中的差異;以及
傳送組件,用于傳送差異文件以在產(chǎn)生新版本時(shí)使用。
2.根據(jù)權(quán)利要求1所述的系統(tǒng),其中如果第一和第二可計(jì)算指令的第一和第二目標(biāo)地址不在一個(gè)或多個(gè)已知公共文本部分內(nèi),則產(chǎn)生組件通過延伸原始版本和新版本之間公共的已知文本部分以包括第一和第二可計(jì)算指令的第一和第二目標(biāo)地址來減小差異文件的大小。
3.根據(jù)權(quán)利要求2所述的系統(tǒng),其中如果第一和第二可計(jì)算指令的第一和第二起始地址從原始版本和新版本之間公共的第一和第二文本部分的起始地址偏移相等的量,則產(chǎn)生組件通過延伸原始版本和新版本之間公共的已知文本部分以包括第一和第二可計(jì)算指令的第一和第二目標(biāo)地址來進(jìn)一步減小差異文件的大小。
4.根據(jù)權(quán)利要求2所述的系統(tǒng),其中如果在原始版本和新版本之間公共的第一和第二文本部分內(nèi)第一和第二可計(jì)算指令的第一和第二起始地址從相應(yīng)的基準(zhǔn)偏移可計(jì)算的量,則產(chǎn)生組件通過延伸原始版本和新版本之間公共的一個(gè)或多個(gè)已知文本部分以包含第一和第二可計(jì)算指令的第一和第二目標(biāo)地址來減小差異文件的大小。
5.根據(jù)權(quán)利要求1所述的系統(tǒng),其中如果第一和第二可計(jì)算指令的第一和第二目標(biāo)地址不在原始版本和新版本之間公共的一個(gè)或多個(gè)已知文本部分內(nèi),則產(chǎn)生組件通過創(chuàng)建包括第一和第二可計(jì)算指令的第一和第二目標(biāo)地址的原始版本和新版本之間公共的一個(gè)或多個(gè)新文本部分來減小差異文件的大小。
6.根據(jù)權(quán)利要求5所述的系統(tǒng),其中產(chǎn)生組件基于一個(gè)或多個(gè)可計(jì)算指令的數(shù)量、頻率和間隔中的至少一個(gè)通過創(chuàng)建包括第一和第二可計(jì)算指令的第一和第二目標(biāo)地址的原始版本和新版本之間公共的一個(gè)或多個(gè)新文本部分來減小差異文件的大小。
7.根據(jù)權(quán)利要求5所述的系統(tǒng),其中如果第一和第二可計(jì)算指令的第一和第二起始地址沒有從原始版本和新版本之間公共的第一和第二文本部分的相應(yīng)基準(zhǔn)偏移相等的量,則產(chǎn)生組件通過創(chuàng)建包括第一和第二可計(jì)算指令的第一和第二目標(biāo)地址的原始版本和新版本之間公共的一個(gè)或多個(gè)新文本部分來減小差異文件的大小。
8.根據(jù)權(quán)利要求1所述的系統(tǒng),其中至少部分基于經(jīng)過正確預(yù)處理的可計(jì)算指令的數(shù)量來確定是延伸原始版本和新版本之間公共的已知文本部分還是創(chuàng)建原始版本和新版本之間公共的新文本部分中的至少一個(gè)。
9.根據(jù)權(quán)利要求1所述的系統(tǒng),其中傳送組件傳送差異文件以在第二設(shè)備上產(chǎn)生新文件版本時(shí)使用,其中第二設(shè)備是從個(gè)人計(jì)算機(jī)、便攜式計(jì)算設(shè)備、蜂窩式電話、便攜式通信設(shè)備和個(gè)人數(shù)字助理中選擇的至少一個(gè)基于處理器的設(shè)備。
10.一種用于產(chǎn)生差異文件的設(shè)備,包括
用于接收電子文件的原始版本和新版本的裝置;
用于識別原始版本和新版本公共的代碼單元的裝置;
用于識別代碼單元公共的指令的裝置,其中識別出的指令包括具有第一起始地址和第一目標(biāo)地址的原始版本中的第一指令以及具有第二起始地址和第二目標(biāo)地址的新版本中的第二指令;以及
用于延伸原始版本和新版本公共的代碼單元或者創(chuàng)建原始版本和新版本公共的新代碼單元的裝置。
11.根據(jù)權(quán)利要求10所述的設(shè)備,其中用于延伸代碼單元或者創(chuàng)建新代碼單元的裝置通過評價(jià)識別出的指令來延伸原始版本和新版本公共的代碼單元或者創(chuàng)建原始版本和新版本公共的新代碼單元。
12.根據(jù)權(quán)利要求11所述的設(shè)備,其中用于延伸代碼單元或者創(chuàng)建新代碼單元的裝置通過評價(jià)第一和第二識別出的指令的第一和第二目標(biāo)地址是否不在原始版本和新版本公共的一個(gè)或多個(gè)已知公共代碼單元內(nèi),來延伸原始版本和新版本公共的代碼單元或者創(chuàng)建原始版本和新版本公共的新代碼單元。
13.根據(jù)權(quán)利要求12所述的設(shè)備,其中用于延伸代碼單元或者創(chuàng)建新代碼單元的裝置通過評價(jià)第一和第二識別出的指令的第一和第二起始地址的特性來延伸原始版本和新版本公共的代碼單元或者創(chuàng)建原始版本和新版本公共的新代碼單元。
14.一種用于進(jìn)行文件求差的方法,包括
接收電子文件的原始版本和新版本;
識別原始版本和新版本公共的代碼單元,其中原始版本和新版本公共的代碼單元包括公共函數(shù)單元;
合并代碼單元的公共函數(shù)單元以形成原始版本和新版本之間的一個(gè)或多個(gè)公共函數(shù)塊;
識別一個(gè)或多個(gè)函數(shù)塊公共的指令,其中識別出的指令包括具有第一起始地址和第一目標(biāo)地址的原始版本中的第一指令以及具有第二起始地址和第二目標(biāo)地址的新版本中的第二指令;以及
基于對第一和第二識別出的指令的評價(jià)來延伸一個(gè)或多個(gè)公共函數(shù)塊中的至少一個(gè)或者創(chuàng)建一個(gè)或多個(gè)新公共函數(shù)塊。
15.根據(jù)權(quán)利要求14所述的方法,還包括如果第一和第二指令的第一和第二目標(biāo)地址不在一個(gè)或多個(gè)已知公共函數(shù)塊內(nèi),則延伸一個(gè)或多個(gè)公共函數(shù)塊中的至少一個(gè)或者創(chuàng)建一個(gè)或多個(gè)新公共函數(shù)塊。
16.根據(jù)權(quán)利要求15所述的方法,還包括如果第一和第二指令的第一和第二起始地址從一個(gè)或多個(gè)公共函數(shù)塊的公共基準(zhǔn)偏移相等的量,則延伸一個(gè)或多個(gè)公共函數(shù)塊中的至少一個(gè)以包括第一和第二指令的第一和第二目標(biāo)地址。
17.根據(jù)權(quán)利要求15所述的方法,還包括基于電子文件的原始版本和新版本之間公共的一個(gè)或多個(gè)指令的數(shù)量、頻率和間隔中的至少一個(gè)來創(chuàng)建包括第一和第二指令的第一和第二目標(biāo)地址的一個(gè)或多個(gè)新公共函數(shù)塊。
18.根據(jù)權(quán)利要求15所述的方法,還包括如果第一和第二指令的第一和第二起始地址沒有從第一和第二公共函數(shù)塊的相應(yīng)基準(zhǔn)偏移相等的量,則創(chuàng)建包括第一和第二指令的第一和第二目標(biāo)地址的一個(gè)或多個(gè)新公共函數(shù)塊。
19.根據(jù)權(quán)利要求14所述的方法,還包括至少部分基于經(jīng)過正確預(yù)處理的指令的數(shù)量來延伸一個(gè)或多個(gè)公共函數(shù)塊中的至少一個(gè)或者創(chuàng)建一個(gè)或多個(gè)新公共函數(shù)塊。
20.根據(jù)權(quán)利要求14所述的方法,還包括
產(chǎn)生差異文件;
將差異文件傳送到便攜式處理系統(tǒng);以及
使用差異文件在便攜式處理系統(tǒng)中產(chǎn)生新文件版本。
21.一種包括可執(zhí)行指令的計(jì)算機(jī)可讀介質(zhì),在處理系統(tǒng)中執(zhí)行時(shí),所述可執(zhí)行指令通過如下所述來減小包括電子文件的原始版本和新版本之間的被編碼的差異的差異文件的大小
識別原始版本和新版本公共的代碼單元,其中原始版本和新版本公共的代碼單元包括公共函數(shù)單元;
合并代碼單元的公共函數(shù)單元以形成原始版本和新版本之間的一個(gè)或多個(gè)公共函數(shù)塊;
識別一個(gè)或多個(gè)公共函數(shù)塊公共的指令,其中識別出的指令包括具有第一起始地址和第一目標(biāo)地址的原始版本中的第一指令以及具有第二起始地址和第二目標(biāo)地址的新版本中的第二指令;以及
基于對第一和第二識別出的指令的評價(jià)來延伸公共函數(shù)塊或者創(chuàng)建新公共函數(shù)塊。
全文摘要
本發(fā)明提供一種系統(tǒng)和方法,用于對文件的原始版本和新版本進(jìn)行預(yù)處理和后處理,作為例如字節(jié)級別的文件求差的原始文件版本和新文件版本之間的差異文件產(chǎn)生的一部分。文件版本之間的軟件/可執(zhí)行變化包括被定義為源代碼變化的初級變化/邏輯變化和次級變化。次級變化通常是由初級變化引起的并且由軟件編譯器/連接器產(chǎn)生。次級變化包括地址變化、指針目標(biāo)地址變化和地址偏移的變化。所提供的預(yù)處理和/或后處理系統(tǒng)和方法在文件版本之間使用近似規(guī)則以去除/減小次級變化,并對相應(yīng)的差異文件的信息中與這些變化的去除有關(guān)的信息進(jìn)行編碼。
文檔編號G06F12/00GK101297275SQ200680039466
公開日2008年10月29日 申請日期2006年9月22日 優(yōu)先權(quán)日2005年9月23日
發(fā)明者馬蒂亞斯·賴因施 申請人:創(chuàng)道軟件有限公司