技術(shù)領(lǐng)域
本發(fā)明涉及設(shè)備的軟件系統(tǒng)更新技術(shù),尤其涉及硬件設(shè)備的軟件補丁嵌入方法及裝置。
背景技術(shù):
直放站監(jiān)控系統(tǒng)屬于嵌入式系統(tǒng)的實際應(yīng)用,由硬件和軟件兩個部分組成,實現(xiàn)直放站系統(tǒng)的控制、監(jiān)視和管理。在直放站系列化產(chǎn)品中監(jiān)控系統(tǒng)具有軟硬件部分復(fù)用的特點,軟硬件均可實現(xiàn)平臺化管理。當(dāng)出現(xiàn)對各直放站軟件批量更新的需求時,如硬件芯片停產(chǎn)或供貨困難,市面上只有硬件兼容但軟件不兼容的芯片做替換,或某個公共的軟件功能需要修改,現(xiàn)有的解決方案只能通過更新軟件平臺,對各個直放站軟件逐個編譯并生成燒寫和下載文件,經(jīng)過質(zhì)量部門驗證后輸出到生產(chǎn)和工程。由于涉及直放站機型眾多,現(xiàn)有的技術(shù)方案存在耗用人力等各項資源大、周期長、效率低下等問題。同時,由于直放站是重要的通信設(shè)備,不能因軟件更新而長期處于停機狀態(tài),而現(xiàn)行方案對各個軟件進(jìn)行逐個修改和編譯,時間的緊急與歷史軟件狀態(tài)的復(fù)雜性產(chǎn)生了矛盾,若質(zhì)量控制不到位或其它原因產(chǎn)生了錯誤則可能發(fā)生軟件沖突的問題。
對于現(xiàn)有的嵌入補丁的技術(shù),只能應(yīng)用中高端嵌入式系統(tǒng),如大型通信交換機設(shè)備等,這類高端嵌入式操作系統(tǒng)能支持文件系統(tǒng)(如嵌入式LINUX、vxworks、windowsce操作系統(tǒng)等);但對于中低端的嵌入式系統(tǒng),如采用MCS51單片機、ARM7、CORTEX-M3等硬件平臺的嵌入式系統(tǒng)(內(nèi)存小、處理器速度較低、功能相對單一是其顯著特點),則現(xiàn)有打補丁技術(shù)不能適用。
技術(shù)實現(xiàn)要素:
為了解決上述技術(shù)問題,本發(fā)明提供了硬件設(shè)備的軟件補丁嵌入方法及裝置,能夠?qū)崿F(xiàn)簡單、高效地嵌入補丁,具有廣泛的適用性。
本發(fā)明提供了硬件設(shè)備的軟件補丁嵌入方法,包括:
根據(jù)軟件更新的需求建立補丁程序,為所述補丁程序配置編譯信息;
對所述補丁程序進(jìn)行編譯,獲取補丁目標(biāo)程序;
從所述補丁目標(biāo)程序中提取各個補丁函數(shù)的地址,并從原燒錄程序中分解出受影響的函數(shù)調(diào)用指令;
采用無條件跳轉(zhuǎn)到補丁函數(shù)的指令替換所述受影響的函數(shù)調(diào)用指令,獲取更新后的新應(yīng)用程序;
將所述新應(yīng)用程序、所述補丁目標(biāo)程序進(jìn)行合并,獲取新的燒錄文件或下載文件。
相應(yīng)地,本發(fā)明還提供了硬件設(shè)備的軟件補丁嵌入裝置,包括:
補丁程序建立單元,用于根據(jù)軟件更新的需求建立補丁程序,為所述補丁程序配置編譯信息;
與所述補丁程序建立單元相連的目標(biāo)程序獲取單元,用于對所述補丁程序進(jìn)行編譯,獲取補丁目標(biāo)程序;
與所述目標(biāo)程序獲取單元、原燒錄程序單元分別相連的指令提取單元,用于從所述補丁目標(biāo)程序中提取各個補丁函數(shù)的地址,并從原燒錄程序中分解出受影響的函數(shù)調(diào)用指令;
與所述原燒錄程序單元、所述指令提取單元分別相連的應(yīng)用程序獲取單元,用于采用無條件跳轉(zhuǎn)到補丁函數(shù)的指令替換所述受影響的函數(shù)調(diào)用指令,獲取更新后的新應(yīng)用程序;
與所述應(yīng)用程序獲取單元、所述目標(biāo)程序獲取單元分別相連的程序合并單元,用于將所述新應(yīng)用程序、所述補丁目標(biāo)程序進(jìn)行合并,獲取新的燒錄文件或下載文件。
相應(yīng)地,本發(fā)明還提供了硬件設(shè)備的軟件補丁嵌入系統(tǒng),包括如前項所述的硬件設(shè)備的軟件補丁嵌入裝置,以及與該硬件設(shè)備的軟件補丁嵌入裝置相連的文件燒錄裝置和/或軟件升級裝置;
所述文件燒錄裝置,用于應(yīng)用所述燒錄文件燒錄新的嵌入式系統(tǒng);
所述軟件升級裝置,用于應(yīng)用所述下載文件對現(xiàn)有的嵌入式系統(tǒng)進(jìn)行軟件升級。
實施本發(fā)明,具有如下有益效果:
本發(fā)明將補丁直接嵌入程序,不影響現(xiàn)有的軟件環(huán)境,具有很好的兼容性,能夠簡單、高效地對硬件設(shè)備進(jìn)行批量更新。另外,本發(fā)明不要求嵌入式系統(tǒng)具備文件系統(tǒng),廣泛適用于各類型的硬件設(shè)備。
附圖說明
圖1是本發(fā)明硬件設(shè)備的軟件補丁嵌入方法的流程圖;
圖2是本發(fā)明硬件設(shè)備的軟件補丁嵌入方法的實施例流程圖;
圖3是本發(fā)明硬件設(shè)備的軟件補丁嵌入方法的實施例示意圖;
圖4是本發(fā)明硬件設(shè)備的軟件補丁嵌入裝置的示意圖;
圖5是本發(fā)明硬件設(shè)備的軟件補丁嵌入裝置的實施例示意圖;
圖6是本發(fā)明硬件設(shè)備的軟件補丁嵌入系統(tǒng)的示意圖。
具體實施方式
為使本發(fā)明的目的、技術(shù)方案和優(yōu)點更加清楚,下面將結(jié)合附圖對本發(fā)明作進(jìn)一步地詳細(xì)描述。
圖1是本發(fā)明硬件設(shè)備的軟件補丁嵌入方法的流程圖,包括:
S101:根據(jù)軟件更新的需求建立補丁程序,為所述補丁程序配置編譯信息;
S102:對所述補丁程序進(jìn)行編譯,獲取補丁目標(biāo)程序;
S103:從所述補丁目標(biāo)程序中提取各個補丁函數(shù)的地址,并從原燒錄程序中分解出受影響的函數(shù)調(diào)用指令;
S104:采用無條件跳轉(zhuǎn)到補丁函數(shù)的指令替換所述受影響的函數(shù)調(diào)用指令,獲取更新后的新應(yīng)用程序;
S105:將所述新應(yīng)用程序、所述補丁目標(biāo)程序進(jìn)行合并,獲取新的燒錄文件或下載文件。
本發(fā)明適用于硬件設(shè)備的公共軟件部分的補丁嵌入,尤其適用于直放站設(shè)備的公共軟件。首先,根據(jù)公共部分軟件的更新需求建立補丁程序,為所述補丁程序配置編譯信息。該編譯信息的作用在于讓編譯器知道最終所用硬件存儲空間的大小、范圍和地址,也可以指定存儲規(guī)則。
通過編譯器將補丁程序和編譯信息進(jìn)行編譯,獲得補丁目標(biāo)程序。上述補丁程序為源代碼程序;補丁目標(biāo)程序為編譯鏈接后的目標(biāo)程序。
從所述補丁目標(biāo)程序中提取各個補丁函數(shù)的地址,并從原燒錄程序中分解出受影響的函數(shù)調(diào)用指令;采用無條件跳轉(zhuǎn)到補丁函數(shù)的指令替換所述受影響的函數(shù)調(diào)用指令,獲取更新后的新應(yīng)用程序。新應(yīng)用程序也是目標(biāo)程序,只不過是從舊燒錄文件中分離出來并做了必要的修改。
將所述新應(yīng)用程序、所述補丁目標(biāo)程序進(jìn)行合并,獲取新的燒錄文件或下載文件。采用本發(fā)明,不僅適用于高端嵌入式操作系統(tǒng)能支持文件系統(tǒng)(如嵌入式LINUX、vxworks、windowsce操作系統(tǒng)等);而且對于中低端的不支持文件系統(tǒng)的嵌入式系統(tǒng)也適用,如采用MCS51單片機、ARM7、CORTEX-M3等硬件平臺的嵌入式系統(tǒng)(內(nèi)存小、處理器速度較低、功能相對單一是其顯著特點)。
圖2是本發(fā)明硬件設(shè)備的軟件補丁嵌入方法的實施例流程圖。與圖1相比,圖2是優(yōu)選實施例的流程圖。
S201:根據(jù)軟件更新的需求建立補丁程序,為所述補丁程序配置編譯信息。
S202:對所述補丁程序進(jìn)行編譯,獲取補丁目標(biāo)程序。
步驟S201、S202與步驟S101、S102相同,在此不在贅述。需要補充說明的是,所述補丁目標(biāo)程序內(nèi)的新實現(xiàn)函數(shù),如圖3所示的function1_new新增代碼,用于替代原燒錄程序的部分自身實現(xiàn)代碼,故此,其接口定義必須與原燒錄程序完全相同;同時,代碼在實現(xiàn)上盡量減少使用全局變量或局部靜態(tài)變量,地址分配時可將其分配在空閑內(nèi)存的高端地址區(qū)域。這樣能使新舊程序相互兼容,涉及到變量內(nèi)存的地址分配也不會與舊系統(tǒng)有重疊。
S203:編譯加載程序,獲取加載目標(biāo)程序;當(dāng)所述補丁程序的加載地址和運行地址不一致時,所述加載程序為重構(gòu)的加載程序;當(dāng)所述補丁程序的加載地址和運行地址一致時,所述加載程序為所述原燒錄程序的加載程序。
所述加載程序其功能是指系統(tǒng)啟動后把程序數(shù)據(jù)拷貝到RAM中,然后初始化應(yīng)用程序運行所需環(huán)境,最后轉(zhuǎn)跳到應(yīng)用程序在RAM中的入口地址完成加載工作。在本發(fā)明中,首先在設(shè)備上電時執(zhí)行的一段程序,然后將加載地址處的程序搬運到運行地址處。如果目標(biāo)程序的加載和運行時域地址不同的話,就需要重構(gòu)加載程序,否則不需要。因為原來的原燒錄程序,可能有加載程序,也可能沒有加載程序。不管是地址一致不用修改的加載程序,還是地址不一致,修改了的重構(gòu)的加載程序,這里都需要編輯,以獲取加載目標(biāo)程序。
S204:從所述補丁目標(biāo)程序中提取各個補丁函數(shù)的地址,并從原燒錄程序中分解出受影響的函數(shù)調(diào)用指令。
補丁程序可能提供了不只一個新函數(shù),所以需將各個地址都提取出來,再從原燒錄程序中分解出受影響的函數(shù)調(diào)用指令,以便將新舊程序進(jìn)行合并。
S205:采用無條件跳轉(zhuǎn)到補丁函數(shù)的指令替換所述受影響的函數(shù)調(diào)用指令,獲取更新后的新應(yīng)用程序。
根據(jù)函數(shù)調(diào)用關(guān)系,生成無條件跳轉(zhuǎn)到新處理函數(shù)指令并翻譯為機器碼,改寫舊應(yīng)用程序受影響函數(shù)地址處的數(shù)據(jù),直接替換第一條指令即可。最后,根據(jù)要求修改軟件版本信息,產(chǎn)生新的應(yīng)用程序。
S206:當(dāng)所述補丁目標(biāo)程序調(diào)用原燒錄程序內(nèi)的原函數(shù)時,從所述原燒錄程序中獲取所述原函數(shù)的地址。
編譯器都是有一定的規(guī)則的,如ARM的ADS編譯器就遵循ATPCS規(guī)則。舊程序調(diào)用舊函數(shù)前已保存好了現(xiàn)場,且傳遞的參數(shù)和返回值處理也符合標(biāo)準(zhǔn)的規(guī)則,在舊函數(shù)入口的地方,此處直接通過無條件跳轉(zhuǎn)到補丁程序提供的新處理函數(shù)地址的指令,該指令替代原函數(shù)的第一條指令,寫入翻譯后的機器碼,即實現(xiàn)了功能的替換,即代碼執(zhí)行到此處,將無條件跳轉(zhuǎn)到新的處理函數(shù)中去運行,原函數(shù)內(nèi)后面的功能代碼實際上是不會運行的,無需做任何修改。
S207:計算調(diào)用所述原函數(shù)的新偏移地址,并修改所述補丁目標(biāo)程序中的調(diào)用該原函數(shù)的指令。
新函數(shù)調(diào)用了現(xiàn)有的舊函數(shù),對于調(diào)用處的地址需要提取出來,根據(jù)補丁程序調(diào)用其它函數(shù)的關(guān)系及其地址,計算出新偏移地址,合成調(diào)用指令的機器碼,并對調(diào)用處的程序數(shù)據(jù)進(jìn)行修改。
S208:將所述加載目標(biāo)程序、所述新應(yīng)用程序、所述補丁程序按照所述加載地址進(jìn)行合并,獲取新的燒錄文件或下載文件。
應(yīng)用所述燒錄文件燒錄新的嵌入式系統(tǒng);應(yīng)用所述下載文件對現(xiàn)有的嵌入式系統(tǒng)進(jìn)行軟件升級。
圖3是本發(fā)明硬件設(shè)備的軟件補丁嵌入方法的實施例示意圖。下面結(jié)合圖3對本發(fā)明實施例作具體說明。
現(xiàn)有技術(shù)中,需逐個對各直放站軟件進(jìn)行編譯并生成燒錄和下載文件。而本發(fā)明通過以下方式,實現(xiàn)硬件設(shè)備的公共軟件部分的批量更新升級。
如圖2、3所示,本直放站監(jiān)控系統(tǒng)軟件補丁的實現(xiàn)方法,包括如下步驟:根據(jù)公共軟件部分的需求分析結(jié)果,新建補丁程序,在該程序上重新編碼實現(xiàn)受影響需要修改的函數(shù)功能,如圖3所示的function1_new和function2_new。其次,修改配置信息,為該程序單獨分配加載和運行時域空間。最后,修改加載程序?qū)崿F(xiàn)啟動后的加載功能。
將加載程序、補丁程序輸入計算機,通過編譯器進(jìn)行統(tǒng)一編譯,輸出目標(biāo)加載程序和目標(biāo)補丁程序。通過編譯器從補丁程序中提取出各函數(shù)的地址,以及對補丁程序之外函數(shù)存在調(diào)用關(guān)系處的程序地址。再通過編譯器分析舊輸出的燒錄文件中的原燒錄程序,分解出受影響函數(shù)的地址和被補丁程序調(diào)用的函數(shù)的地址,一般舊的組合燒錄文件除程序數(shù)據(jù)外還帶有調(diào)試信息,可很容易分解出來。同時,通過編譯器從原燒錄程序中分解出舊應(yīng)用程序數(shù)據(jù)。
根據(jù)函數(shù)調(diào)用關(guān)系,生成無條件跳轉(zhuǎn)到新處理函數(shù)指令并翻譯為機器碼,改寫原應(yīng)用程序受影響函數(shù)地址處的數(shù)據(jù),直接替換第一條指令即可,如圖3所示,原應(yīng)用程序某一部分的自身實現(xiàn)代碼前嵌入了一條調(diào)用function_1new的指令。則程序運行到這里,可以直接跳轉(zhuǎn)到補丁程序,而且不影響原有的軟件環(huán)境。由于沒有替換到原應(yīng)用程序中的函數(shù),所以對于補丁程序,還可以調(diào)用原應(yīng)用程序中的函數(shù)。根據(jù)補丁程序調(diào)用其它函數(shù)的關(guān)系及其地址,計算出新偏移地址,合成調(diào)用指令的機器碼,并對調(diào)用處的程序數(shù)據(jù)進(jìn)行修改。最后,根據(jù)要求修改軟件版本信息,產(chǎn)生新的應(yīng)用程序。將加載程序、新應(yīng)用程序、補丁程序按照加載地址進(jìn)行合并,產(chǎn)生新的燒錄文件和下載文件。
為了更好得實現(xiàn)本發(fā)明,補丁程序中替代原舊函數(shù)的新實現(xiàn)函數(shù),其接口定義必須與舊函數(shù)完全相同。同時,源代碼在實現(xiàn)上不要使用全局變量或局部靜態(tài)變量。加載程序其功能是指系統(tǒng)啟動后把程序數(shù)據(jù)拷貝到RAM中,然后初始化應(yīng)用程序運行所需環(huán)境,最后轉(zhuǎn)跳到應(yīng)用程序在RAM中的入口地址完成加載工作。在舊程序調(diào)用舊處理函數(shù)前已保存好了現(xiàn)場,且傳遞的參數(shù)和返回值處理也符合標(biāo)準(zhǔn)的規(guī)則,在舊函數(shù)入口的地方,此處直接使用無條件跳轉(zhuǎn)到補丁程序提供的新處理函數(shù)地址的指令,該指令替代原函數(shù)的第一條指令,寫入翻譯后的機器碼,即實現(xiàn)了功能的替換,即代碼執(zhí)行到此處,將無條件跳轉(zhuǎn)到新的處理函數(shù)中去運行,原函數(shù)內(nèi)后面的功能代碼實際上是不會運行的,無需做任何修改。
圖4是本發(fā)明硬件設(shè)備的軟件補丁嵌入裝置的示意圖,包括:
補丁程序建立單元,用于根據(jù)軟件更新的需求建立補丁程序,為所述補丁程序配置編譯信息;
與所述補丁程序建立單元相連的目標(biāo)程序獲取單元,用于對所述補丁程序進(jìn)行編譯,獲取補丁目標(biāo)程序;
與所述目標(biāo)程序獲取單元、原燒錄程序單元分別相連的指令提取單元,用于從所述補丁目標(biāo)程序中提取各個補丁函數(shù)的地址,并從原燒錄程序中分解出受影響的函數(shù)調(diào)用指令;
與所述原燒錄程序單元、所述指令提取單元分別相連的應(yīng)用程序獲取單元,用于采用無條件跳轉(zhuǎn)到補丁函數(shù)的指令替換所述受影響的函數(shù)調(diào)用指令,獲取更新后的新應(yīng)用程序;
與所述應(yīng)用程序獲取單元、所述目標(biāo)程序獲取單元分別相連的程序合并單元,用于將所述新應(yīng)用程序、所述補丁目標(biāo)程序進(jìn)行合并,獲取新的燒錄文件或下載文件。
圖4與圖1相對應(yīng),上述各個單元的運行方式與方法中的相同。
圖5是本發(fā)明硬件設(shè)備的軟件補丁嵌入裝置的實施例示意圖,與圖4相比,圖5是具體實施例的實施例示意圖。
如圖5所示,還包括連接在所述目標(biāo)程序獲取單元與所述指令提取單元之間的加載程序構(gòu)建單元,所述加載程序構(gòu)建單元,用于編譯加載程序,獲取加載目標(biāo)程序。當(dāng)所述補丁程序的加載地址和運行地址不一致時,所述加載程序為重構(gòu)的加載程序;當(dāng)所述補丁程序的加載地址和運行地址一致時,所述加載程序為所述原燒錄程序的加載程序。
如圖5所示,所述程序合并單元還與所述加載程序構(gòu)建單元相連,用于將所述加載目標(biāo)程序、所述新應(yīng)用程序、所述補丁程序按照所述加載地址進(jìn)行合并。
所述應(yīng)用程序獲取單元包括:
原函數(shù)調(diào)用單元,用于所述補丁目標(biāo)程序調(diào)用原燒錄程序內(nèi)的原函數(shù),從所述原燒錄程序中獲取所述原函數(shù)的地址;
與所述原函數(shù)調(diào)用單元相連的偏移地址獲取單元,用于計算調(diào)用所述原函數(shù)的新偏移地址,并修改所述補丁目標(biāo)程序中的調(diào)用該原函數(shù)的指令。
圖5與圖2相對應(yīng),上述各個單元的運行方式與方法中的相同。
圖6是本發(fā)明硬件設(shè)備的軟件補丁嵌入系統(tǒng)的示意圖,包括如前項所述的硬件設(shè)備的軟件補丁嵌入裝置,以及與該硬件設(shè)備的軟件補丁嵌入裝置相連的文件燒錄裝置和/或軟件升級裝置;
所述文件燒錄裝置,用于應(yīng)用所述燒錄文件燒錄新的嵌入式系統(tǒng);
所述軟件升級裝置,用于應(yīng)用所述下載文件對現(xiàn)有的嵌入式系統(tǒng)進(jìn)行軟件升級。
如圖6所示,本發(fā)明不僅能應(yīng)用中高端嵌入式系統(tǒng)(如大型通信交換機設(shè)備),也能適用于中低端嵌入式系統(tǒng)。對于高端嵌入式系統(tǒng),此類產(chǎn)品所用操作系統(tǒng)能支持文件系統(tǒng),典型的包括如LINUX、vxworks、windowsce等操作系統(tǒng),本發(fā)明能實現(xiàn)設(shè)備在線打補丁和離線打補丁,所述離線打補丁是通過原設(shè)備軟件獲取下載文件,運行一個單獨的補丁任務(wù),由該任務(wù)完成打補丁過程。對于低端嵌入式系統(tǒng),此類產(chǎn)品所用操作系統(tǒng)不能支持文件系統(tǒng),典型的包括如采用MCS51單片機、ARM7、CORTEX-M3等硬件平臺的嵌入式系統(tǒng)(內(nèi)存小、處理器速度較低、功能相對單一是其顯著特點)。本發(fā)明能通過產(chǎn)品直接燒錄打補丁后的新程序來實現(xiàn)離線打補丁。另外,還有一些嵌入式產(chǎn)品無操作系統(tǒng),直接為前后臺程序控制。而本發(fā)明作用于應(yīng)用程序?qū)用妫⒉簧婕安僮飨到y(tǒng)層面,所以,也能對此類無操作系統(tǒng)的產(chǎn)品進(jìn)行軟件升級。
通過以上的實施方式的描述,本領(lǐng)域的技術(shù)人員可以清楚地了解到本發(fā)明可借助軟件加必需的硬件平臺的方式來實現(xiàn),當(dāng)然也可以全部通過硬件來實施?;谶@樣的理解,本發(fā)明的技術(shù)方案對背景技術(shù)做出貢獻(xiàn)的全部或者部分可以以軟件產(chǎn)品的形式體現(xiàn)出來,該計算機軟件產(chǎn)品可以存儲在存儲介質(zhì)中,如ROM/RAM、磁碟、光盤等,包括若干指令用以使得一臺計算機設(shè)備(可以是個人計算機,服務(wù)器,或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行本發(fā)明各個實施例或者實施例的某些部分所述的方法。
以上所述的本發(fā)明實施方式,并不構(gòu)成對本發(fā)明保護(hù)范圍的限定。任何在本發(fā)明的精神和原則之內(nèi)所作的修改、等同替換和改進(jìn)等,均應(yīng)包含在本發(fā)明的權(quán)利要求保護(hù)范圍之內(nèi)。