, ,,,
(中科院 微小衛(wèi)星創(chuàng)新研究院,上海 201210)
當今航天領(lǐng)域發(fā)展迅速,在軌、在研航天器型號數(shù)量急劇增加,航天器性能、功能不斷增強,星載軟件的復雜度越來越高,用戶需求更新頻率越來越快。隨之帶來軟件開發(fā)工作也變得更加復雜,軟件版本更迭頻率也越來越快,在軌航天器的日常維護管理工作日益艱巨。
在軌軟件重構(gòu)作為星上軟件更改的唯一方式變得尤為重要,一方面可以修正已知的軟件設(shè)計缺陷和錯誤,最大程度的減少損失;另一方面還可通過注入新程序來適應用戶新需求的變化,延長了在軌航天器的服役時間[1]。受航天器運行的特殊環(huán)境限制,在軌航天器的軟件重構(gòu)對安全性、可靠性有了更高的要求,而對于星上某些特殊設(shè)備,還需要充分考慮軟件更新后的快速恢復能力,以期最大程度的減少系統(tǒng)中斷時間。綜上所述,研究可靠的、安全的軟件在軌重構(gòu)方法有很大的實用價值。
本文以在航天領(lǐng)域應用廣泛、高可靠性的VxWorks操作系統(tǒng)為研究對象,分析現(xiàn)有星載軟件的重構(gòu)方式的弊端,提出了基于模塊加載機制的軟件重構(gòu)方案,并借助龍芯硬件平臺對該方案的合理性加以例證。
VxWorks操作系統(tǒng)是美國風河公司(Wind River Systems Inc)設(shè)計開發(fā)的嵌入式實時操作系統(tǒng)(RTOS),以其良好的可靠性和卓越的實時性被廣泛應用于航空、航天、軍事及通訊領(lǐng)域。
VxWorks操作系統(tǒng)基于優(yōu)先級的搶占式任務調(diào)度模式,采用資源共享和優(yōu)先級繼承機制,以微內(nèi)核為核心,擴展網(wǎng)絡系統(tǒng)、I/O系統(tǒng)、文件系統(tǒng)以及其他功能庫,用戶可以根據(jù)需求進行功能組件的增添和裁剪,其中動態(tài)加載器組件(Loader Components)是VxWorks操作系統(tǒng)實現(xiàn)模塊動態(tài)加載的核心和基礎(chǔ)。
VxWorks操作系統(tǒng)提供了兩種將目標模塊加載到內(nèi)核中的方式,兩種方式均能夠在不中斷系統(tǒng)當前進程的情況下,對指定的部分軟件實施維護和更新,來完成對目標模塊的動態(tài)加載和卸載。一種是在目標機(Target)與主機(Host)建立關(guān)聯(lián)(一般為Target Server/Agent方式)的前提下,在主機端端向目標機動態(tài)加載目標模塊,這種方式一般用來前期軟件功能調(diào)試,可以有效加快軟件開發(fā)進度;還有一種為目標機自身借助文件系統(tǒng)、FTP等方式,動態(tài)加載某一特定模塊到內(nèi)核中,這種方式可以有效增加軟件目標機使用和維護的靈活性。本文研究的便是第二種模塊加載方式[2]。
對于嵌入式操作系統(tǒng),軟件設(shè)計人員通常在程序設(shè)計的最后階段,將操作系統(tǒng)和應用軟件鏈接編譯成一個鏡像,并將其固化在ROM中。當后續(xù)測試、使用過程中,發(fā)現(xiàn)程序設(shè)計錯誤或者需求更改時,需要修改代碼,重新編譯,然后更新ROM中存儲的目標文件,重新加載程序才能完成軟件更新。在此過程中,勢必會對中斷系統(tǒng)的運行狀態(tài)。
基于上述開發(fā)方式生成的目標文件都相對較大,受星地通訊速率限制,在軌更新程序時費時費力,安全性也不好。除此之外,軟件重構(gòu)時還需要停止當前系統(tǒng)進程,完成固化后需重新啟用新程序,對系統(tǒng)恢復正常運轉(zhuǎn)也帶來不小的麻煩,上述開發(fā)方式的軟件層次架構(gòu)如圖1所示。
圖1 常規(guī)嵌入式軟件架構(gòu)圖
而如果在程序設(shè)計之初時,按照軟件功能劃分模塊,建立多個子模塊過程,編譯形成多個目標文件。借助文件系統(tǒng)隨時停止、加載、運行某個或某幾個特定模塊,而不會影響系統(tǒng)當前運行的其他功能,這便是動態(tài)加載的核心原理,且單個模塊編譯生成的目標文件都比較小,維護起來也比較容易[3-6]。
如圖2所示,基于模塊加載機制的軟件架構(gòu)由驅(qū)動層、操作系統(tǒng)層、應用層組成,其中操作系統(tǒng)層和驅(qū)動層是相對固定,設(shè)計人員在對操作系統(tǒng)各個組件完成剪裁、驗證后,便相對固定下來,后期改動也較小。為了實現(xiàn)模塊的動態(tài)加載功能,還必須在操作系統(tǒng)中增加相應的模塊加載、管理相關(guān)的程序,借助文件系統(tǒng),根據(jù)實際需要,將特定功能模塊加載至內(nèi)核中,更新全局符號表,查找函數(shù)符號,運行相應進程。
圖2 基于模塊加載機制的嵌入式軟件架構(gòu)圖
應用層部分是用戶自定義部分,是各個項目的特定部分,需要根據(jù)需求變化,隨時更新代碼。而對于航天器的軟件,在軌重構(gòu)也主要是更換這部分程序。
VxWorks操作系統(tǒng)的模塊加載組件僅支持ELF(Executable and Linking Format)文件格式目標文件,這是一種在可執(zhí)行文件和共享庫中都廣泛使用的格式,ELF文件中將執(zhí)行代碼分為代碼段(text)、數(shù)據(jù)段(data)和初值為0的數(shù)據(jù)段(bss)3個部分,分散的存儲在目標文件中,目標文件還包括符號表和重定位信息段信息[7-8]。
對于VxWorks操作系統(tǒng),編譯生成的目標文件都是以“.o”或者“.out”(這兩種都是ELF對象文件)的文件形式存儲在ROM中,文件中的有些信息,必須通過文件系統(tǒng)才能加載到內(nèi)核中。在使用文件系統(tǒng)加載符號文件時,首先分析目標文件的文件頭表(ELF Header),根據(jù)這些信息得到text、data和bss相關(guān)信息,然后在內(nèi)存映像中建立該模塊的信息,然后根據(jù)符號信息,對模塊符號進行重定位并更新系統(tǒng)符號表,從而完成整個加載過程。
VxWorks操作系統(tǒng)提供了多種文件系統(tǒng),包括VRFS、HRFS、dosFs、rawFS、cdromFs、ROMFS、TSFS等[9-10]。在VxWorks操作系統(tǒng)中的文件系統(tǒng)的架構(gòu)圖如圖3所示,涉及硬件層、驅(qū)動層、應用層等。其中圖中方框部分即為文件系統(tǒng)的驅(qū)動部分,由其完成對底層硬件資源的分配,并提供相應的接口來供上層I/O系統(tǒng)來調(diào)用,即VxWorks的文件系統(tǒng)和設(shè)備驅(qū)動程序通過標準的I/O操作接口來進行連接。
由于本次例程中涉及的文件規(guī)模都相對較小,這里選用了相對簡單的dosFs文件系統(tǒng)來進行實驗驗證。VxWorks操作系統(tǒng)的dosFs文件系統(tǒng)是一種與MS_DOS文件系統(tǒng)兼容的文件系統(tǒng)[11],能夠滿足實時應用的多種要求,其與老版本的dosFs文件系統(tǒng)相比,有如下新特點:
1)支持層次化的文件和目錄結(jié)構(gòu),能夠在一個磁盤上建立一定數(shù)目的文件并進行有效的管理;
2)可以將每一個文件指定為連續(xù)存儲或非連續(xù)存儲;
3)支持Microsoft風格的長文件格式(VFAT);
4)支持FAT12,F(xiàn)AT16和FAT32文件分配表格式;
一個簡單dosFs文件系統(tǒng)可通過建立RAM Disk來實現(xiàn),即分配CPU內(nèi)存的一段存儲空間建立軟磁盤卷,并將其初始化成dosFs文件系統(tǒng)。需要注意的是在分配RAM Disk的存儲空間時,既可以由操作系統(tǒng)動態(tài)分配空間,也可以由用戶指定空間位置。而文件系統(tǒng)一旦建立成功,便可以使用通用I/O函數(shù)(open、close、write、read等)來訪問文件系統(tǒng),用來新建、打開、關(guān)閉以及讀寫文件了。
基于上述理論,我們在龍芯CPU硬件平臺上加以驗證,龍芯1E是龍芯中科技術(shù)有限公司研制的基于MIPS架構(gòu)的高性能抗輻照宇航級CPU芯片,提供了通用的處理器部件和對外接口,包含中斷控制器、定時器、RS232串口控制器、浮點處理器、PCI和存儲器接口(存儲器接口支持SDRAM和FLASH ROM)等,龍芯1E芯片的外部時鐘頻率不低于66 MHz,功耗3 W[12]。操作系統(tǒng)為VxWork6.8,開發(fā)環(huán)境為WindRiver Workbench3.2。具體配置如表1所示。
表1 驗證平臺資源配置表
為了充分驗證上述方案,需依次驗證模塊的固化存儲、加載、執(zhí)行、刪除等過程。在驗證時還設(shè)計了多個模塊文件同時加載以及目標文件壓縮、解壓的過程,驗證該方案的可拓展性。
1) 首先分別建立操作系統(tǒng)工程和子模塊工程,在此次驗證實驗中,建立了一個VxWorks Image Project (VIP)和兩個Downloadable Kernel Module Project (DKM),建立兩個子模塊工程的目的在于驗證存在多個模塊條件下,函數(shù)模塊相互調(diào)用情況。其中對于兩個DKM工程,其中一個DKM工程僅含有一個函數(shù):
void Hello1(void)
{
printf("--- this is Hello1 DKM example --- ");
}
另外一個DKM工程包含兩個函數(shù):
void Hello2(void)
{
printf("--- this is Hello2 DKM example --- ");
}
void Hello3(void)
{
printf("--- this is Hello3 DKM example --- ");
}
而對于操作系統(tǒng)工程,除了必要組件之外還需要在其中完成模塊管理的相關(guān)操作,包括建立文件系統(tǒng),新建模塊文件,加載模塊,執(zhí)行模塊,刪除模塊等操作,其中涉及的用戶自定義函數(shù)有“usrRamDiskInit”、“deleteModule”、“runModule”、“runModule1”等,其中涉及的函數(shù)作用和調(diào)用的系統(tǒng)函數(shù)如表2所示。
2) 在Workbench開發(fā)環(huán)境中,逐個編譯上述工程,分別生成 “vxWorks”、“Example1.o”、“Example2.o”等目標文件,其中目標文件“Example2.o”利用VxWorks操作系統(tǒng)自帶的壓縮算法(deflate)生成壓縮文件“Example2.z”。將上述目標代碼依次固化到NOR FLASH中,通過壓縮算法可以有效減小目標代碼占用。制作壓縮文件時可直接在Workbench中通過shell命令來完成,可采用以下示例:deflate
系統(tǒng)上電后,引導程序首先將操作系統(tǒng)文件從FLASH加載到SDRAM中,之后便開始可以使用用戶保留空間建立RAM Disk,并在其中搭建dosFs文件系統(tǒng)。
文件系統(tǒng)建立成功后,依次在其中新建“Example1.o”、“Example2.o”兩個文件,文件內(nèi)容分別從FLASH存儲的“Example1.o”、“Example2.z”拷貝得到。在處理壓縮文件“Example2.z”時,必須先解壓存儲的目標代碼后再進行數(shù)據(jù)拷貝,解壓文件可以使用函數(shù)“inflate”來完成,這樣包含模塊的兩個文件已經(jīng)存在文件系統(tǒng)中了。
3) 最后利用VxWorks操作系統(tǒng)提供的符號加載函數(shù)將其加載到內(nèi)核之中,操作系統(tǒng)提供了“symLib”、“l(fā)oadLib”兩個函數(shù)庫可供用戶調(diào)用。一旦加載完畢,用戶就可以調(diào)用當前文件中包含的所有函數(shù)了。
上述幾個過程涉及的目標代碼存儲及轉(zhuǎn)移的信息流如圖4所示。
圖4 目標代碼存儲及轉(zhuǎn)移信息流圖
4) 在上述軟件架構(gòu)下,當需要進行軟件重構(gòu)時,只需要停止該進程,將特定的目標文件替換,然后重新加載該符號至內(nèi)核,重新啟用該進程,即可完成軟件重構(gòu)整個過程。以上述例程為例,當需要替換“Example1.o”模塊時,首先需要在把內(nèi)核中該模塊停止,然后替換該文件,加載該模塊到內(nèi)核中,重新該進程即可。
由于單個目標文件都相對比較小,并且重構(gòu)時也不需要中斷系統(tǒng)的其他進程,可以將對整個系統(tǒng)的影響做到最小,以上過程涉及到的自定義函數(shù)如表2所示。
表2 涉及的自定義函數(shù)列表
為了直觀顯示出模塊加載的全過程,可以利用VxWorks操作系統(tǒng)的shell工具,通過命令的方式依次調(diào)用各個函數(shù)模塊,執(zhí)行上述過程。
1)系統(tǒng)上電后,操作系統(tǒng)首先被加載起來,正常運行后,可以從輸出信息中得到操作系統(tǒng)及硬件的啟動信息,如圖5所示,從中可以看到,例程使用的操作系統(tǒng)版本為VxWorks 6.8,硬件平臺為Loongson1E。
圖5 VxWorks操作系統(tǒng)啟動信息
2)系統(tǒng)初始加載后,此時文件系統(tǒng)還未建立,因此通過“devs”命令查詢當前系統(tǒng)設(shè)備信息,如圖6所示,可以看出設(shè)備列表中還沒有磁盤卷信息;
圖6 dosFs文件系統(tǒng)輸出信息
通過命令行調(diào)用函數(shù)“usrRamDiskInit”,函數(shù)執(zhí)行后,操作系統(tǒng)建立了512 KB大小的磁盤卷并將其格式化成“dosFs”格式,與此同時文件“Example1.o”、“Example2.o”也被建立起來。
通過命令行輸入命令“devs”后,看以看出系統(tǒng)設(shè)備目錄下新增了“/ram0”設(shè)備。輸入命令“l(fā)s”可以查看到當前目錄下的文件列表,可以看到當前目錄下已經(jīng)存在文件“Example1.o”和“ Example2.o”了,這說明文件系統(tǒng)以及文件都被成功建立。
3)雖然文件系統(tǒng)已經(jīng)建立起來,但依然還未將文件“Example1.o”、“Example2.o”中的模塊加載到內(nèi)核中,此時通過命令行調(diào)用函數(shù)“Hello1”、“Hello2”、“Hello3”時,系統(tǒng)輸出錯誤信息。
通過命令行調(diào)用函數(shù)“runModule”和“runModule1”后,兩個文件包含的所有函數(shù)模塊均被加載至內(nèi)核中,此時可以通過命令行正常調(diào)用相關(guān)函數(shù),運行結(jié)果如圖7所示,其中在“runModule”函數(shù)中在加載成功后同時也調(diào)用了函數(shù)“Hello1”。
圖7 子函數(shù)調(diào)用執(zhí)行信息
5) 當模塊需要更改時,應先停止相應的線程,并將該模塊從內(nèi)核中刪除。通過命令行輸入命令“moduleShow”可以查看當前目錄下的模塊信息,可以看出當前內(nèi)核中存在“example1.o”、“example2.o”模塊。通過命令調(diào)用“deleteModule”函數(shù)將模塊“example1.o”從內(nèi)核中刪除,此時再調(diào)用函數(shù)“Hello1”,操作系統(tǒng)輸出錯誤調(diào)用信息,當通過調(diào)用函數(shù)“runModule”又重新將模塊加載到內(nèi)存中,可以繼續(xù)調(diào)用
圖8 模塊刪除與重加載信息
該函數(shù)。需要注意的是,由于我們這次省去了文件更新替換的過程。
本文從當前常規(guī)在軌航天器軟件重構(gòu)角度出發(fā),分析傳統(tǒng)星載軟件重構(gòu)方式,并從模塊加載的角度驗證了一種新型在軌航天器軟件重構(gòu)方案,還從實例的角度驗證了這一方案可行性和可操作性。
基于該架構(gòu)的星載軟件會使航天器的軟件在軌更新變得更加可靠、簡便、安全,也能極大程度地減小對系統(tǒng)的影響,減小了系統(tǒng)在軌維護難度,對于其他嵌入式系統(tǒng)的軟件在線更新也有一定的借鑒意義。
參考文獻:
[1] 劉 贇,左小川.嵌入式軟件在線升級系統(tǒng)的設(shè)計與實現(xiàn)[J].計算機測量與控制, 2015,23(04):1425-1427.
[2] 王 鵬,張友根,李永剛.一種改進的VxWorks模塊卸載方法研究[J].裝備指揮技術(shù)學院學報,2010,21(5):83-87.
[3] 朱海江.星載軟件模塊化設(shè)計方法研究[D].哈爾濱:哈爾濱工業(yè)大學,2007.
[4] 石 煒,鄧 偉.基于VxWorks的星載控制計算機動態(tài)可重構(gòu)研究[J].電子設(shè)計工程,2013,21(6):30-33.
[5] 廖崇琦,文 臣,鄧 文,等. 一種基于VxWorks的可重構(gòu)軟件框架設(shè)計[J]. 電子技術(shù)應用,2013,39(12):22-24.
[6] 于 康,寧 洪,鄧勝蘭,等.基于VxWorks的模塊自動加載機制[J].計算機工程,2010,36(18): 264-266.
[7] 寧 濤. 面向嵌入式應用的動態(tài)加載機制研究[D].重慶:重慶大學,2008.
[8] 于 康.基于動態(tài)加載機制的星載計算機可靠性增強技術(shù)研究[D].長沙:國防科學技術(shù)大學,2009.
[9] Wind River,Kernel Programmer's Guide: Local File Systems[Z].Wind River,2009.
[10] Wind River,Vxworks Application Programmers Guide[Z].Wind River,2009.
[11] 王晉東,黃 海,王 坤,等. 基于VxWorks的dosFs文件系統(tǒng)分析與實現(xiàn)[J]. 微計算機信息,2008:85-87.
[12] 龍芯中科技術(shù)有限公司,龍芯1E1F開發(fā)手冊[R].北京:龍芯中科技術(shù)有限公司,2017.