本發(fā)明涉及一種基于二次鏈接的航天器在軌維護(hù)注入碼生成方法,屬于航天器在軌維護(hù)領(lǐng)域。
背景技術(shù):
航天器軟件的在軌維護(hù)能力是保證航天器長壽命不可或缺的手段,與硬件的冗余備份相比,這種方法更經(jīng)濟(jì)更靈活。通過軟件在軌維護(hù)來提高航天器的長壽命和高可靠性的方法越來越受到重視。
當(dāng)前我國航天器在軌運(yùn)行的處理器平臺主體是sparc系列體系架構(gòu)。航天器在軌運(yùn)行維護(hù)的主要手段是實(shí)施軟件的在軌維護(hù)。航天器在軌軟件的維護(hù),主要是基于鉤子函數(shù)的方法。在可寫存儲注入?yún)^(qū)上注一段可執(zhí)行指令碼,當(dāng)在軌維護(hù)使能時(shí),鉤子函數(shù)通過指定的地址跳轉(zhuǎn)到注入?yún)^(qū)執(zhí)行,執(zhí)行完畢后再返回或退出原函數(shù)繼續(xù)執(zhí)行。在這種應(yīng)用場景下,在軌維護(hù)注入碼的生成是軟件在軌維護(hù)的關(guān)鍵環(huán)節(jié),同時(shí)也是一件比較困難的工作。之前在軌維護(hù)注入碼的生成主要是通過對原在軌軟件和在軌維護(hù)軟件編譯結(jié)果文件進(jìn)行解析,梳理出在軌維護(hù)指令碼中所有需要重定位的信息,并完成重定位。該過程一方面要求熟練掌握編譯結(jié)果文件格式,能夠梳理出所有的重定位信息;另一方面要求對指令規(guī)則集有較深入的了解,能夠?qū)υ谲壘S護(hù)指令碼實(shí)現(xiàn)重定位。并且當(dāng)在軌維護(hù)軟件的編寫需要使用原在軌運(yùn)行軟件中未用到的庫函數(shù)時(shí),原有通過文件解析實(shí)現(xiàn)指令碼重定位的方法實(shí)現(xiàn)起來比較麻煩。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明解決的技術(shù)問題是:克服現(xiàn)有技術(shù)的不足,提出一種基于二次鏈接的航天器在軌維護(hù)注入碼生成方法,在保證原在軌軟件二進(jìn)制碼不發(fā)生變化的前提下,自動實(shí)現(xiàn)在軌維護(hù)軟件中各個(gè)地址相關(guān)項(xiàng)的重定位過程,從而大大提高了航天器在軌維護(hù)注入碼的生成效率和正確性。
本發(fā)明的技術(shù)方案是:
一種基于二次鏈接的航天器在軌維護(hù)注入碼生成方法,步驟如下:
(1)還原航天器在軌運(yùn)行軟件的狀態(tài),生成新的在軌狀態(tài)目標(biāo)文件;
(2)編寫在軌維護(hù)源代碼;
(3)使用編譯器對步驟(2)中編寫的在軌維護(hù)源代碼進(jìn)行單獨(dú)編譯,生成待上傳目標(biāo)文件;
(4)新建二次鏈接的腳本文件;
(5)基于步驟(4)建立的二次鏈接腳本文件,使用編譯器,對所述在軌狀態(tài)目標(biāo)文件和待上傳目標(biāo)文件進(jìn)行鏈接,生成新的可執(zhí)行文件;
(6)通過編譯器將所述新的可執(zhí)行文件轉(zhuǎn)換成鏈接指令文件或bin文件,從鏈接指令文件或bin文件中直接提取指定起始地址的注入碼指令,從而完成航天器在軌維護(hù)注入碼的生成。
所述步驟(1)還原航天器在軌運(yùn)行軟件的狀態(tài),生成新的在軌狀態(tài)目標(biāo)文件,具體為:使用航天器原在軌軟件的源文件編譯目錄進(jìn)行編譯并實(shí)現(xiàn)一次鏈接,將第一次鏈接后生成的可執(zhí)行文件進(jìn)行文件格式轉(zhuǎn)換,生成新的在軌狀態(tài)目標(biāo)文件。
所述步驟(2)編寫在軌維護(hù)源代碼,具體為:在航天器原在軌軟件的源文件編譯目錄下,新建在軌維護(hù)的注入代碼源文件,并編寫好相應(yīng)的在軌維護(hù)源代碼。
所述步驟(4)新建二次鏈接的腳本文件,具體為:在腳本文件sections一節(jié)中,依據(jù)原在軌軟件的輸出段的地址設(shè)置,新建第一輸出段空間,將所述新建的第一輸出段空間的起始地址設(shè)置為原在軌軟件的輸出段的起始地址,將所述新建的第一輸出段空間的輸入段元素設(shè)置為第一次鏈接后生成的在軌狀態(tài)目標(biāo)文件,再依據(jù)預(yù)先設(shè)定的注入?yún)^(qū)起始地址,新建第二輸出段空間,將所述第二輸出段空間的起始地址設(shè)置為預(yù)先設(shè)定的注入?yún)^(qū)起始地址,將所述第二輸出段空間的輸入段元素設(shè)置為在軌維護(hù)軟件編譯后生成的待上傳目標(biāo)文件。
本發(fā)明與現(xiàn)有技術(shù)相比的有益成果是:
(1)本發(fā)明技術(shù)方案通過二次鏈接實(shí)現(xiàn)航天器在軌維護(hù)注入碼的生成,通過編譯器的兩次鏈接,自動實(shí)現(xiàn)在軌維護(hù)軟件注入碼相對原在軌軟件的地址信息重定位,大大提高了在軌維護(hù)注入碼生成的效率和正確性。
(2)通過二次鏈接方式,相較于原有文件解析方式生成注入碼的方法,消除了新增全局變量、新增庫函數(shù)調(diào)用等多方面的在軌維護(hù)代碼編寫限制要求,大大提高了在軌維護(hù)源代碼的實(shí)現(xiàn)效率。
(3)本發(fā)明方法已經(jīng)在多個(gè)sparc平臺航天器軟件在軌維護(hù)設(shè)計(jì)中得到了驗(yàn)證,提高了在軌航天器軟件的可維護(hù)性,為后續(xù)航天器星上軟件的研制,提供了新的在軌維護(hù)設(shè)計(jì)方法。
附圖說明
圖1為本發(fā)明方法流程圖。
具體實(shí)施方式
如圖1所示,本發(fā)明提出了一種基于二次鏈接的航天器在軌維護(hù)注入碼生成方法,主要是面向但不限于sparc處理器平臺的航天器軟件,依據(jù)航天器軟件在軌維護(hù)任務(wù)需求,編寫相應(yīng)的在軌維護(hù)源代碼(c語言),通過新建鏈接腳本文件,與原在軌軟件編譯后的可執(zhí)行文件實(shí)現(xiàn)二次鏈接,從而完成航天器在軌維護(hù)注入碼的生成。
本發(fā)明具體步驟如下:
(1)還原航天器在軌運(yùn)行軟件的狀態(tài),生成新的在軌狀態(tài)目標(biāo)文件;
具體為:使用航天器在軌軟件的源文件編譯目錄進(jìn)行編譯并實(shí)現(xiàn)一次鏈接,所述航天器在軌軟件的源文件編譯目錄要與航天器在軌軟件可執(zhí)行代碼生成時(shí)的狀態(tài)保持一致。將第一次鏈接后生成的可執(zhí)行文件a.out進(jìn)行文件格式轉(zhuǎn)換,生成新的在軌狀態(tài)目標(biāo)文件,新的在軌狀態(tài)目標(biāo)文件是擴(kuò)展名為.o的elf目標(biāo)文件格式。
進(jìn)行文件格式轉(zhuǎn)換可以利用編譯器自帶工具objcopy實(shí)現(xiàn)。
(2)編寫在軌維護(hù)源代碼;
具體為:在航天器在軌軟件的源文件編譯目錄下,新建擴(kuò)展名為.c的在軌維護(hù)代碼源文件,并編寫好相應(yīng)的在軌維護(hù)源代碼及所需頭文件。
(3)使用編譯器對步驟(2)中編寫的在軌維護(hù)源代碼進(jìn)行單獨(dú)編譯,生成待上傳目標(biāo)文件,待上傳目標(biāo)文件是擴(kuò)展名為.o的elf目標(biāo)文件格式;
(4)新建二次鏈接的腳本文件;
具體為:新建一個(gè)新的鏈接腳本文件,在新的鏈接腳本文件sections一節(jié)中,依據(jù)航天器原在軌軟件的輸出段的地址設(shè)置,新建第一輸出段空間,將所述新建的第一輸出段空間的起始地址設(shè)置為航天器原在軌軟件的輸出段的起始地址,將所述新建的第一輸出段空間的輸入段元素設(shè)置為第一次鏈接后生成的在軌狀態(tài)目標(biāo)文件,再依據(jù)預(yù)先設(shè)定的注入?yún)^(qū)起始地址,新建第二輸出段空間,將所述第二輸出段空間的起始地址設(shè)置為預(yù)先設(shè)定的注入?yún)^(qū)起始地址,將所述第二輸出段空間的輸入段元素設(shè)置為在軌維護(hù)軟件編譯后生成的待上傳目標(biāo)文件。
(5)基于步驟(4)建立的二次鏈接腳本文件,使用編譯器,對所述在軌狀態(tài)目標(biāo)文件和待上傳目標(biāo)文件進(jìn)行鏈接,生成新的可執(zhí)行文件a.out;
(6)通過編譯器,使用objdump命令將所述新的可執(zhí)行文件a.out轉(zhuǎn)換成擴(kuò)展名為.lst的鏈接指令文件,或者使用objcopy命令將所述新的可執(zhí)行文件a.out轉(zhuǎn)換成擴(kuò)展名為.bin的bin文件,從上述生成的鏈接指令文件或bin文件中直接提取指定起始地址的注入碼指令,從而完成航天器在軌維護(hù)注入碼的生成。
實(shí)施例:
(1)在確保航天器在軌軟件的源文件編譯目錄與航天器在軌軟件可執(zhí)行代碼生成時(shí)狀態(tài)一致的前提下,使用編譯器sparc-rtems-gcc,通過makefile文件,對航天器在軌軟件的源文件編譯目錄進(jìn)行編譯并實(shí)現(xiàn)一次鏈接,生成一次鏈接的可執(zhí)行文件a.out,然后使用sparc-rtems-objcopy命令將一次鏈接的可執(zhí)行文件a.out進(jìn)行文件格式轉(zhuǎn)換,生成elf格式的在軌狀態(tài)目標(biāo)文件a.o。
(2)在航天器在軌軟件的源文件編譯目錄下,新建在軌維護(hù)的注入代碼源文件task_inject.c,并在task_inject.c源文件中編寫在軌維護(hù)源代碼,如表1所示:
表1在軌維護(hù)源代碼示例
(3)使用編譯器sparc-rtems-gcc對在軌維護(hù)源代碼task_inject.c進(jìn)行單獨(dú)編譯,生成目標(biāo)文件task_inject.o。
(4)新建鏈接腳本文件linkobsm作為二次鏈接的腳本文件,如表2所示:
表2二次鏈接腳本文件示例
(5)基于二次鏈接腳本文件linkobsm,使用編譯器sparc-rtems-gcc,對在軌狀態(tài)目標(biāo)文件a.o和待上傳目標(biāo)文件task_inject.o進(jìn)行鏈接,生成新的二次鏈接后的可執(zhí)行文件a.out;
(6)使用編譯器的sparc-rtems-objdump命令將步驟(5)生成的新的二次鏈接后的可執(zhí)行文件a.out轉(zhuǎn)換成擴(kuò)展名為.lst的鏈接指令文件boot.lst,或者使用sparc-rtems-objcopy命令將步驟(5)生成的新的二次鏈接后的可執(zhí)行文件a.out轉(zhuǎn)換成擴(kuò)展名為.bin的bin文件boot.bin。從上述生成的文件boot.lst或boot.bin文件中直接提取起始地址為0x21a0000的注入碼指令,從而完成航天器在軌維護(hù)注入碼的生成。
本實(shí)施例技術(shù)方案通過編譯器的兩次鏈接,自動實(shí)現(xiàn)在軌維護(hù)軟件注入碼相對原在軌軟件的地址信息重定位,大大提高了在軌維護(hù)注入碼生成的效率和正確性。相較于原有文件解析方式生成注入碼的方法,消除了新增全局變量、新增庫函數(shù)調(diào)用等多方面的在軌維護(hù)代碼編寫限制要求,大大提高了在軌維護(hù)源代碼的實(shí)現(xiàn)效率。
本發(fā)明未詳細(xì)說明部分屬本領(lǐng)域技術(shù)人員公知常識。