專利名稱:使用補丁對軟件進行動態(tài)升級與控制的方法和裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及補丁升級方法,更具體地,涉及使用補丁對軟件進行動態(tài)升級與控制 的方法和裝置。
背景技術(shù):
隨著軟件規(guī)模和維護復(fù)雜度的不斷增加,人們很難獲得一個零錯誤的軟件,這就 需要在發(fā)布版本之后,對可能存在的錯誤,采用提供新軟件或者通過發(fā)布軟件補丁的方式 進行修復(fù)。對于軟件運行穩(wěn)定性要求比較高的行業(yè),特別是電信行業(yè),需要在不影響原有業(yè) 務(wù)正常運行的情況下,完成對系統(tǒng)軟件錯誤修復(fù)的整個過程,即在軟件運行過程中,用補丁 模塊替換存在軟件錯誤的模塊,而不能打斷原有程序代碼的正常運行。這種動態(tài)補丁升級軟件的主要方法是采用函數(shù)替換的方法,來實現(xiàn)動態(tài)打補丁, 其工作原理是通過替換被補丁函數(shù)的第一條指令為跳轉(zhuǎn)到替換函數(shù)中的指令,使程序跳轉(zhuǎn) 到新函數(shù)所在位置處執(zhí)行,當(dāng)替換函數(shù)中的補丁代碼執(zhí)行完畢后,回到調(diào)用老函數(shù)的代碼 中,從而完成整個調(diào)用過程。在公開號為CN1475909的中國申請專利文件中,公開了一種嵌入式系統(tǒng)補丁軟件 的實現(xiàn)和控制方法。此方法分為兩步驟執(zhí)行1)用補丁制作工具分析補丁目標(biāo)文件的符號 段,并將補丁目標(biāo)文件的代碼段和數(shù)據(jù)段提取出來,聯(lián)同函數(shù)替換表以補丁單元的形式生 成補丁文件。2)補丁控制部分加載控制補丁軟件到希望被補丁修改的緩沖區(qū)中,根據(jù)函數(shù) 替換表構(gòu)造函數(shù)跳轉(zhuǎn)指令,將被補丁函數(shù)地址上的第一條指令替換為跳轉(zhuǎn)到補丁函數(shù)起始 地址的函數(shù)跳轉(zhuǎn)指令,使CPU執(zhí)行到被補丁函數(shù)時,跳轉(zhuǎn)到補丁函數(shù)地址,執(zhí)行補丁函數(shù)。該專利中關(guān)于動態(tài)補丁升級軟件實現(xiàn)與控制的方法,存在如下缺陷1)該專利在軟件補丁制作過程中,把整個目標(biāo)文件的代碼段和數(shù)據(jù)段都提取出 來,然后構(gòu)造成補丁文件,并在補丁加載時全部寫入內(nèi)存空間。這種方法會造成內(nèi)存空間的 浪費,也會增加加載過程的復(fù)雜度,甚至同一個函數(shù)或變量在內(nèi)存中有多個拷貝,可能會造 成函數(shù)調(diào)用或變量引用的不一致,嚴(yán)重的會導(dǎo)致系統(tǒng)崩潰。2)該專利在補丁控制模塊加載補丁文件到緩沖區(qū)中后,根據(jù)函數(shù)替換表構(gòu)造函數(shù) 跳轉(zhuǎn)指令,動態(tài)的構(gòu)造從被補丁函數(shù)跳轉(zhuǎn)到替換函數(shù)的跳轉(zhuǎn)指令。這種在目標(biāo)機上構(gòu)造跳 轉(zhuǎn)指令的做法會增加目標(biāo)機側(cè)代碼維護的難度,并降低代碼可移植性。3)該專利沒有提供完整的補丁控制方法,即沒有提供打補丁失敗后,恢復(fù)到原先 狀態(tài)的實現(xiàn)方法以及顯示補丁是否升級成功等。
發(fā)明內(nèi)容
為解決上述缺陷,本發(fā)明提出了使用補丁對軟件進行動態(tài)升級的方法,包括以下 步驟將替換函數(shù)的預(yù)定參數(shù)從目標(biāo)文件中提取出來,組成僅包含替換函數(shù)的新目標(biāo)文件; 以及根據(jù)新目標(biāo)文件和內(nèi)核鏡像原文件生成補丁。其中,預(yù)定參數(shù)包括代碼段、數(shù)據(jù)段、重定位表和符號表中的至少一個。
其中,所述的提取預(yù)定參數(shù)的步驟包括讀取目標(biāo)文件的頭部信息,并根據(jù)頭部信 息將每個節(jié)頭讀取到內(nèi)存中;以及提取替換函數(shù)的代碼段,收集替換函數(shù)的重定位的信息, 并提取替換函數(shù)的只讀數(shù)據(jù),其中,將只讀數(shù)據(jù)節(jié)合并為新只讀數(shù)據(jù)節(jié)。其中,使用驗證模塊讀取新目標(biāo)文件,以驗證新目標(biāo)文件的正確性。其中,所述的生成補丁的步驟還包括讀取新目標(biāo)文件的頭部信息,并根據(jù)頭部信 息將每個節(jié)頭讀取到內(nèi)存中;合并新目標(biāo)文件的代碼段和只讀數(shù)據(jù)節(jié);讀取內(nèi)核鏡像原文件 的預(yù)留補丁區(qū)域地址和符號地址表;根據(jù)符號地址表對新目標(biāo)文件的符號進行重定位;根據(jù) 預(yù)留補丁區(qū)域地址構(gòu)造函數(shù)替換指令表,用于指示對替換函數(shù)進行替換;以及生成補丁。此外,本發(fā)明還提出了使用補丁對軟件進行動態(tài)升級與控制的裝置包括替換函 數(shù)提取模塊,設(shè)置在主機側(cè),用于將替換函數(shù)的預(yù)定參數(shù)從目標(biāo)文件中提取出來,組成僅包 含替換函數(shù)的新目標(biāo)文件;補丁生成模塊,設(shè)置在主機側(cè),用于根據(jù)新目標(biāo)文件和內(nèi)核鏡像 原文件生成補丁 ;以及補丁控制模塊,設(shè)置在目標(biāo)機側(cè),用于控制補丁的狀態(tài)的轉(zhuǎn)換,并用 于查詢補丁的狀態(tài)。其中,替換函數(shù)提取模塊包括頭部信息讀取子模塊,用于讀取目標(biāo)文件的頭部信 息,并根據(jù)頭部信息將每個節(jié)頭讀取到內(nèi)存中;預(yù)定參數(shù)提取子模塊,用于提取預(yù)定參數(shù); 以及文件重組子模塊,用于組成僅包含替換函數(shù)的新目標(biāo)文件。其中,補丁生成模塊在生成補丁的過程中,根據(jù)從內(nèi)核鏡像原文件讀取的預(yù)留補 丁區(qū)域地址構(gòu)造函數(shù)替換指令表。其中,補丁控制模塊包括補丁加載子模塊,讀取函數(shù)替換指令表,根據(jù)預(yù)留補丁 區(qū)域地址加載補丁,并將補丁的非激活狀態(tài)寫入配置文件中;補丁激活子模塊,根據(jù)函數(shù)替 換指令表,從原函數(shù)跳轉(zhuǎn)至替換函數(shù),并將補丁的激活狀態(tài)寫入配置文件中;補丁自動激活 子模塊,使補丁自動生效,并將補丁的自動運行狀態(tài)寫入配置文件中;補丁去激活子模塊, 根據(jù)函數(shù)替換指令表,從替換函數(shù)跳轉(zhuǎn)回原函數(shù),并將補丁的非激活狀態(tài)寫入配置文件;補 丁卸載子模塊,釋放補丁的存儲空間,從替換函數(shù)跳轉(zhuǎn)回原函數(shù),并將補丁的初始狀態(tài)寫入 配置文件;以及補丁狀態(tài)查詢子模塊,用于讀取配置文件以查看補丁的狀態(tài)。其中,補丁包含如下信息中的至少一個補丁的版本信息、目標(biāo)機的信息、用于對 替換函數(shù)進行替換的指令表以及替換函數(shù)的預(yù)定參數(shù)在目標(biāo)機中的加載地址。本發(fā)明的技術(shù)效果在于1)在制作軟件補丁時,根據(jù)需要打補丁的函數(shù),把代碼段的提取細(xì)化到函數(shù)級,這 樣可以減少補丁的尺寸,以及加載補丁所需要的預(yù)留內(nèi)存空間,并且便于管理,避免函數(shù)調(diào) 用的不一致性。2)從補丁函數(shù)跳轉(zhuǎn)到替換函數(shù)的跳轉(zhuǎn)指令在制作補丁的時候完成,并存儲在補丁 文件中。這樣可以把與平臺相關(guān)的處理全部放在主機側(cè)制作補丁時實現(xiàn),而目標(biāo)機上只要 做加載的動作,這樣可避免由于目標(biāo)機上處理器的不同而增加編碼的復(fù)雜度,降低移植性。3)提供完整的目標(biāo)機側(cè)補丁控制模塊功能,可以根據(jù)要求加載,激活,去激活,卸 載,顯示補丁信息等。
此處所說明的附圖用來提供對本發(fā)明的進一步理解,構(gòu)成本申請的一部分,本發(fā)明的示意性實施例及其說明用于解釋本發(fā)明,并不構(gòu)成對本發(fā)明的限定。在附圖中圖1是根據(jù)本發(fā)明示例性實施例的嵌入式系統(tǒng)動態(tài)補丁升級軟件總體框圖;圖2是根據(jù)本發(fā)明示例性實施例的替換函數(shù)提取過程的流程圖;圖3是根據(jù)本發(fā)明示例性實施例的補丁生成過程的流程圖;以及圖4示出了根據(jù)本發(fā)明示例性實施例的補丁狀態(tài)轉(zhuǎn)化的示意圖。
具體實施例方式下面結(jié)合附圖對使用補丁對軟件進行動態(tài)升級與控制的方法和裝置進行說明。嵌入式系統(tǒng)動態(tài)補丁升級軟件分為主機側(cè)和目標(biāo)機側(cè)兩個部分,一共包括3個模 塊替換函數(shù)提取模塊,補丁生成模塊,補丁控制模塊。其中替換函數(shù)提取模塊,補丁生成模 塊運行在主機側(cè),補丁控制模塊運行在目標(biāo)機側(cè),如圖1。(一)替換函數(shù)提取模塊為動態(tài)補丁升級軟件的第一個模塊,用來在ELF格式目標(biāo) 文件中提取替換函數(shù)的代碼段,重定位表,符號表等,并重構(gòu)成新的ELF格式目標(biāo)文件。該模塊的輸入為ELF格式的目標(biāo)文件和需要提取的替換函數(shù)名列表,輸出為只含 有單個替換函數(shù)代碼段,只讀數(shù)據(jù)節(jié),符號表等的ELF格式目標(biāo)文件。在構(gòu)造的過程中,需根據(jù)重定位的類型,把以.text (程序代碼)、.bss (全局變 量)、.rodata (只讀數(shù)據(jù))、.data (定值數(shù)據(jù))作為基地址的偏移量addend的重定位方法, 替換為直接查找符號的方式。這樣在下一個模塊補丁制作模塊中,只需要通過查找鏡像文 件中符號的真實地址,去替換ELF目標(biāo)文件中符號,就可以完成重定位的工作,把函數(shù)調(diào)用 和變量引用鏈接起來。該模塊的實施步驟為(可參考圖2)1.讀取ELF結(jié)構(gòu)目標(biāo)文件中的頭部,并根據(jù)ELF頭部信息提供的節(jié)頭addr (地址) 和size (尺寸),讀取各節(jié)頭。2.根據(jù)節(jié)頭信息,讀取各節(jié)到內(nèi)存中3.在.text節(jié)中抽取替換函數(shù)的代碼段4.在.rodata節(jié)中抽取替換函數(shù)引用到的只讀數(shù)據(jù),并合并成一個新的rodata 節(jié)。5.在替換函數(shù)代碼所在的地址空間,收集所有需要重定位的信息。6.根據(jù)重定位的類型,符號的屬性以及尺寸大小等著手,把替換函數(shù)代碼中所有 以.text、.bss,. rodata,. data作為基地址的偏移量addend的重定位方法,替換為直接查 找符號的方法7.重新構(gòu)造只包含替換函數(shù)代碼段,rodata節(jié),符號節(jié)的ELF結(jié)構(gòu)目標(biāo)文件,并設(shè) 置重新各節(jié)頭部的addr以及size8.用readelf或者objdump工具讀取新構(gòu)造出的ELF結(jié)構(gòu)目標(biāo)文件,驗證其重 構(gòu)是否正確,如果代碼段,只讀數(shù)據(jù)和原目標(biāo)文件的一致,且所有引用方法都是符號直接引 用,則可判斷其是正確的輸出。( 二)補丁制作模塊的輸入為替換函數(shù)提取模塊生成的目標(biāo)文件以及內(nèi)核鏡象原 文件,輸出為補丁文件。該模塊需根據(jù)補丁加載的預(yù)留地址空間,重定位輸入目標(biāo)文件中的 替換函數(shù)所引用的符號地址,并把多個輸入目標(biāo)文件的.text、. rodata節(jié)進行合并,最后生成的補丁文件中需包含1)版本信息,目標(biāo)機信息以及補丁文件信息2)函數(shù)替換表,含 有從補丁函數(shù)跳轉(zhuǎn)到替換函數(shù)的跳轉(zhuǎn)指令表以及替換函數(shù)的數(shù)據(jù)段,代碼段以及BSS段在 目標(biāo)機內(nèi)存中加載地址表3)替換函數(shù)的只讀數(shù)據(jù)段以及代碼段4)校驗和5)創(chuàng)建日期等 fn息該模塊的實施步驟為(可參考圖3)1.根據(jù)輸入目標(biāo)文件的ELF文件頭部信息,讀取各節(jié)頭。2.根據(jù)節(jié)頭信息,讀取各節(jié)到內(nèi)存中3.合并多個輸入目標(biāo)文件的text節(jié)以及rodata節(jié)4.讀取內(nèi)核鏡像原文件中的預(yù)留補丁區(qū)域,符號表以及對應(yīng)的符號地址表5.根據(jù)符號地址表,把輸入目標(biāo)文件中所引用的符號地址重定位成真實的內(nèi)存調(diào) 用地址6.根據(jù)預(yù)留補丁區(qū)域地址,在主機側(cè)構(gòu)造函數(shù)替換指令表7.構(gòu)造整個補丁文件,包含版本信息,目標(biāo)機信息,補丁信息,函數(shù)替換表,以及代 碼段,只讀數(shù)據(jù)段,創(chuàng)建日期等,并最后增加檢驗和字段,用以檢查補丁加載到目標(biāo)機的正 確性。(三)補丁控制模塊本模塊主要控制補丁的狀態(tài)轉(zhuǎn)換,并提供對補丁狀態(tài)的查詢功能等。為了實現(xiàn)運 行時動態(tài)升級,同時考慮到升級后有恢復(fù),因此補丁需要五個基本狀態(tài)加載,激活,補丁自 動激活,去激活,卸載。其狀態(tài)轉(zhuǎn)化圖如下所示。補丁狀態(tài)轉(zhuǎn)換控制采用命令驅(qū)動的方式運 行,其處理流程如下圖4所示。具體實現(xiàn)中,每個補丁的狀態(tài)轉(zhuǎn)換可以用狀態(tài)機來控制,保證狀態(tài)遷移正確性。該模塊的具體實施步驟為1.補丁加載流程首先判斷補丁和系統(tǒng)軟件的版本號是否符合一致,如果不一致 直接退出;如果一致,則將補丁文件加載寫入到flash中,然后讀取該文件中函數(shù)替換表, 根據(jù)需要加載補丁預(yù)留區(qū)域的地址,把替換函數(shù)的代碼段,只讀數(shù)據(jù)段寫入到內(nèi)存中。補丁 加載后,補丁的狀態(tài)為非激活狀態(tài),并把補丁的狀態(tài)寫入到相應(yīng)的配置文件中。2.補丁激活根據(jù)指令替換表,將被補丁函數(shù)地址處的指令改成跳轉(zhuǎn)到替換函數(shù) 的指令,并把補丁的狀態(tài)寫入到配置文件中。3.補丁自動激活將補丁狀態(tài)修改為自動激活狀態(tài),保存在補丁配置文件中,下 次重起時會加載補丁繼續(xù)生效,并把補丁的狀態(tài)寫入到配置文件中。4.補丁去激活根據(jù)指令替換表,將被補丁函數(shù)地址處的跳轉(zhuǎn)指令替換為原來的 指令。成功后,補丁狀態(tài)修改為非激活狀態(tài),并把補丁的狀態(tài)寫入到配置文件中。5.補丁卸載釋放補丁文件所占用的flash空間,以及內(nèi)存空間,并把補丁函數(shù) 地址處的跳轉(zhuǎn)指令替換為原來的指令,并把補丁的狀態(tài)寫入到配置文件中。6.補丁狀態(tài)查詢通過讀取配置文件,可以查看當(dāng)前補丁所處的狀態(tài)。以上所述僅為本發(fā)明的優(yōu)選實施例而已,并不用于限制本發(fā)明,對于本領(lǐng)域的技 術(shù)人員來說,本發(fā)明可以有各種更改和變化。凡在本發(fā)明的精神和原則之內(nèi),所作的任何修 改、等同替換、改進等,均應(yīng)包含在本發(fā)明的保護范圍之內(nèi)。
權(quán)利要求
一種使用補丁對軟件進行動態(tài)升級的方法,其特征在于,包括以下步驟將替換函數(shù)的預(yù)定參數(shù)從目標(biāo)文件中提取出來,組成包含所述替換函數(shù)的新目標(biāo)文件;以及根據(jù)所述新目標(biāo)文件和所述替換函數(shù)的內(nèi)核鏡像原文件生成補丁。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述預(yù)定參數(shù)包括代碼段、數(shù)據(jù)段、重定 位表和符號表中的至少一個。
3.根據(jù)權(quán)利要求2所述的方法,其特征在于,所述的提取預(yù)定參數(shù)包括讀取所述目標(biāo)文件的頭部信息,并根據(jù)所述頭部信息將每個節(jié)頭讀取到內(nèi)存中;以及 提取所述替換函數(shù)的代碼段,收集所述替換函數(shù)的重定位的信息,并提取所述替換函 數(shù)的只讀數(shù)據(jù)節(jié),其中,將所述只讀數(shù)據(jù)節(jié)合并為新只讀數(shù)據(jù)節(jié)。
4.根據(jù)權(quán)利要求3所述的方法,其特征在于,還包括以下步驟使用驗證模塊讀取所述 新目標(biāo)文件,以驗證所述新目標(biāo)文件的正確性。
5.根據(jù)權(quán)利要求3所述的方法,其特征在于,所述的生成補丁的步驟包括 讀取所述新目標(biāo)文件的頭部信息,并根據(jù)所述頭部信息將每個節(jié)頭讀取到內(nèi)存中; 合并所述新目標(biāo)文件的代碼段和只讀數(shù)據(jù)節(jié);讀取所述內(nèi)核鏡像原文件的預(yù)留補丁區(qū)域地址和符號地址表; 根據(jù)所述符號地址表對所述新目標(biāo)文件的符號進行所述重定位; 根據(jù)所述預(yù)留補丁區(qū)域地址構(gòu)造函數(shù)替換指令表,用于指示對所述替換函數(shù)進行替 換;以及生成所述補丁。
6.一種使用補丁對軟件進行動態(tài)升級與控制的裝置,其特征在于,包括替換函數(shù)提取模塊,設(shè)置在主機側(cè),用于將替換函數(shù)的預(yù)定參數(shù)從目標(biāo)文件中提取出 來,組成包含所述替換函數(shù)的新目標(biāo)文件;補丁生成模塊,設(shè)置在主機側(cè),用于根據(jù)所述新目標(biāo)文件和內(nèi)核鏡像原文件生成補丁;以及補丁控制模塊,設(shè)置在目標(biāo)機側(cè),用于控制所述補丁的狀態(tài)的轉(zhuǎn)換,并用于查詢所述補 丁的狀態(tài)。
7.根據(jù)權(quán)利要求6所述的裝置,其特征在于,所述替換函數(shù)提取模塊包括頭部信息讀取子模塊,用于讀取所述目標(biāo)文件的頭部信息,并根據(jù)所述頭部信息將每 個節(jié)頭讀取到內(nèi)存中;預(yù)定參數(shù)提取子模塊,用于提取所述預(yù)定參數(shù);以及 文件重組子模塊,用于組成僅包含所述替換函數(shù)的新目標(biāo)文件。
8.根據(jù)權(quán)利要求6所述的裝置,其特征在于,所述補丁生成模塊在生成補丁的過程中, 根據(jù)從所述內(nèi)核鏡像原文件讀取的預(yù)留補丁區(qū)域地址構(gòu)造函數(shù)替換指令表。
9.根據(jù)權(quán)利要求8所述的裝置,其特征在于,所述補丁控制模塊包括補丁加載子模塊,讀取所述函數(shù)替換指令表,根據(jù)所述預(yù)留補丁區(qū)域地址加載補丁,并 將所述補丁的非激活狀態(tài)寫入配置文件中;補丁激活子模塊,根據(jù)所述函數(shù)替換指令表,從原函數(shù)跳轉(zhuǎn)至所述替換函數(shù),并將所述 補丁的激活狀態(tài)寫入所述配置文件中;補丁自動激活子模塊,使所述補丁自動生效,并將所述補丁的自動運行狀態(tài)寫入所述 配置文件中;補丁去激活子模塊,根據(jù)所述函數(shù)替換指令表,從所述替換函數(shù)跳轉(zhuǎn)回所述原函數(shù),并 將所述補丁的非激活狀態(tài)寫入所述配置文件;補丁卸載子模塊,釋放所述補丁的存儲空間,從所述替換函數(shù)跳轉(zhuǎn)回所述原函數(shù),并將 所述補丁的初始狀態(tài)寫入所述配置文件;以及補丁狀態(tài)查詢子模塊,用于讀取所述配置文件以查看所述補丁的狀態(tài)。
10.根據(jù)權(quán)利要求6至9中任一項所述的裝置,其特征在于,所述補丁包含如下信息中 的至少一個所述補丁的版本信息、所述目標(biāo)機的信息、用于對所述替換函數(shù)進行替換的指 令表以及所述替換函數(shù)的所述預(yù)定參數(shù)在所述目標(biāo)機中的加載地址。
全文摘要
本發(fā)明提出了使用補丁對軟件進行動態(tài)升級的方法,包括以下步驟將替換函數(shù)的預(yù)定參數(shù)從目標(biāo)文件中提取出來,組成僅包含替換函數(shù)的新目標(biāo)文件;以及根據(jù)新目標(biāo)文件和內(nèi)核鏡像原文件生成補丁。此外,本發(fā)明還提出了使用補丁對軟件進行動態(tài)升級與控制的裝置。通過實施本發(fā)明,可以大大減少加載補丁時所需的內(nèi)存空間。
文檔編號G06F9/445GK101937340SQ200910151508
公開日2011年1月5日 申請日期2009年6月29日 優(yōu)先權(quán)日2009年6月29日
發(fā)明者朱懷云, 李進波, 邱靜, 黃忠華 申請人:中興通訊股份有限公司