白 亮,邱 源,韋 杰,孫逸帆,高 潔
(1.上海航天智能計(jì)算技術(shù)重點(diǎn)實(shí)驗(yàn)室,上海 201109;2.上海航天電子技術(shù)研究所,上海 201109)
星載嵌入式操作系統(tǒng)處于遠(yuǎn)程遙控的環(huán)境中,其軟件的維護(hù)與修復(fù)相較于本地系統(tǒng)故障恢復(fù)要困難許多,無(wú)法進(jìn)行手工維護(hù),只能依靠操作系統(tǒng)的自我維護(hù)功能,以及接受地面上傳的有限維護(hù)指令進(jìn)行運(yùn)行過(guò)程中的動(dòng)態(tài)自我修復(fù)和更新。
針對(duì)星載嵌入式操作系統(tǒng)上運(yùn)行的軟件在長(zhǎng)時(shí)間的運(yùn)行過(guò)程中不可避免出現(xiàn)“軟件衰老”現(xiàn)象[1],即伴隨著軟件的運(yùn)行,系統(tǒng)資源逐漸耗盡或運(yùn)行錯(cuò)誤逐漸積累所導(dǎo)致的系統(tǒng)性能持續(xù)下降甚至停機(jī)的現(xiàn)象,采取在軌可重構(gòu)措施來(lái)恢復(fù)軟件性能。
星載嵌入式操作系統(tǒng)工作于惡劣環(huán)境中,星上的設(shè)備暴露于外太空,易受到外部環(huán)境的影響,從而對(duì)系統(tǒng)產(chǎn)生影響。而操作系統(tǒng)負(fù)責(zé)管理平臺(tái)所有外部設(shè)備,系統(tǒng)的可靠性和安全性對(duì)操作系統(tǒng)的管理具有依賴性[2]。而且,操作系統(tǒng)在運(yùn)行過(guò)程中,也會(huì)暴露出一定的設(shè)計(jì)缺陷[3],或是測(cè)試過(guò)程中沒(méi)有發(fā)現(xiàn)和排除潛在設(shè)計(jì)缺陷。但是可以通過(guò)在軌可重構(gòu)技術(shù)對(duì)軟件進(jìn)行修正與完善,進(jìn)一步提高星載系統(tǒng)的安全性和可靠性。同時(shí),還可以針對(duì)在軌運(yùn)行衛(wèi)星,通過(guò)可重構(gòu)的方式,基于現(xiàn)有功能基礎(chǔ),實(shí)現(xiàn)衛(wèi)星功能的升級(jí)和擴(kuò)展,實(shí)現(xiàn)衛(wèi)星的“App”(應(yīng)用程序)式的快速開(kāi)發(fā)和快速集成。
隨著計(jì)算機(jī)技術(shù)的發(fā)展,基于動(dòng)態(tài)庫(kù)的可重構(gòu)技術(shù)被廣泛應(yīng)用于商業(yè)等各個(gè)領(lǐng)域,主要由于動(dòng)態(tài)鏈接庫(kù)與主程序之間通過(guò)接口調(diào)用產(chǎn)生依賴關(guān)系,只要保證動(dòng)態(tài)鏈接庫(kù)輸出接口不變,更換動(dòng)態(tài)庫(kù)不會(huì)對(duì)主程序造成任何影響,可以提高程序的可維護(hù)性和可擴(kuò)展性;而且不同編程語(yǔ)言編寫(xiě)的程序,只要遵守相同的應(yīng)用程序調(diào)用約定(Application Binary Interface,ABI),就可以調(diào)用同一個(gè)動(dòng)態(tài)鏈接庫(kù);使用動(dòng)態(tài)鏈接庫(kù),適用于大規(guī)模的軟件開(kāi)發(fā),使得開(kāi)發(fā)過(guò)程獨(dú)立、耦合度小,便于多人團(tuán)隊(duì)間進(jìn)行協(xié)同開(kāi)發(fā)和測(cè)試;同時(shí),多個(gè)應(yīng)用程序使用相同的動(dòng)態(tài)鏈接庫(kù)時(shí),在磁盤(pán)中可以只存在一份動(dòng)態(tài)鏈接庫(kù)文件,相比其他技術(shù),可以節(jié)約磁盤(pán)空間?;谏鲜鰞?yōu)點(diǎn),在現(xiàn)代化大型軟件開(kāi)發(fā)中,大量應(yīng)用動(dòng)態(tài)鏈接庫(kù)技術(shù)。而且利用動(dòng)態(tài)鏈接庫(kù)技術(shù)的一個(gè)最大優(yōu)點(diǎn)在于,針對(duì)動(dòng)態(tài)鏈接庫(kù)更新升級(jí)后不用重新啟動(dòng)主程序,只需將更新的動(dòng)態(tài)鏈接庫(kù)重新載入程序的內(nèi)存空間即可?;谠撎攸c(diǎn),將動(dòng)態(tài)鏈接庫(kù)技術(shù)應(yīng)用于星載嵌入式軟件的在軌重構(gòu)實(shí)現(xiàn)中,既可以達(dá)到上述所有優(yōu)勢(shì),又不需要星載系統(tǒng)軟件重新啟動(dòng),即在軌重構(gòu)的實(shí)現(xiàn)不會(huì)對(duì)既定星載任務(wù)(如程控、數(shù)傳、熱控等任務(wù))運(yùn)行產(chǎn)生影響?;趧?dòng)態(tài)鏈接庫(kù)技術(shù),在軌重構(gòu)包是以文件的形式存在,即使衛(wèi)星發(fā)生異常重啟后,前一次在軌重構(gòu)生成的補(bǔ)丁包仍然在,且重啟運(yùn)行后,直接使用重構(gòu)后的程序,使得在軌重構(gòu)技術(shù)對(duì)衛(wèi)星可靠安全在軌運(yùn)行提供支撐。
隨著星載系統(tǒng)的發(fā)展,星載嵌入式軟件在軌可重構(gòu)技術(shù)也在持續(xù)不斷發(fā)展。目前常用的在軌可重構(gòu)技術(shù)有基于RAM 型和微重啟等。隨著高性能處理器的發(fā)展,傳統(tǒng)在軌可重構(gòu)方式能否在高性能處理器平臺(tái)上繼續(xù)適用,需要作全面評(píng)估和驗(yàn)證測(cè)試。本文所提出的方案,以高性能處理器平臺(tái)為出發(fā)點(diǎn),進(jìn)行設(shè)計(jì)、實(shí)現(xiàn)和驗(yàn)證。針對(duì)在軌衛(wèi)星通過(guò)實(shí)際在軌可重構(gòu)操作后,進(jìn)一步驗(yàn)證本方案的有效性、安全性和可靠性。
本文中設(shè)計(jì)了一種基于星載嵌入式操作系統(tǒng)的可重構(gòu)軟件框架,嵌入式操作系統(tǒng)的層次如圖1所示。本軟件框架實(shí)現(xiàn)的硬件平臺(tái)基于國(guó)產(chǎn)化處理器國(guó)微SM750,操作系統(tǒng)為風(fēng)云翼輝(AIC-OS)嵌入式操作系統(tǒng)1.11.0,開(kāi)發(fā)環(huán)境為RealEvo-IDE 3.9.10。整個(gè)系統(tǒng)可分為4 個(gè)層次:處理器層、操作系統(tǒng)內(nèi)核服務(wù)及BSP 層、中間件層和應(yīng)用層。其中,在本系統(tǒng)中中間件層由動(dòng)態(tài)鏈接庫(kù)的形式來(lái)實(shí)現(xiàn)。應(yīng)用層由嵌入式軟件框架和各個(gè)應(yīng)用組件構(gòu)成,在不同時(shí)刻加載不同應(yīng)用組件時(shí),應(yīng)用層功能將可以隨之發(fā)生變化而無(wú)需重新加電或復(fù)位操作系統(tǒng),從而實(shí)現(xiàn)了嵌入式軟件的功能可重構(gòu)。而可重構(gòu)軟件框架作為一個(gè)中間層的形式運(yùn)行在操作系統(tǒng)與應(yīng)用組件之間。一方面通過(guò)對(duì)應(yīng)用組件的動(dòng)態(tài)加卸載、系統(tǒng)資源管理、多組件管理等功能實(shí)現(xiàn)了嵌入式軟件功能的可重構(gòu);另一方面它為應(yīng)用組件屏蔽了底層細(xì)節(jié),使之與硬件和操作系統(tǒng)隔離,從而可以實(shí)現(xiàn)組件的二進(jìn)制級(jí)復(fù)用。針對(duì)通用功能組件,無(wú)需重新修改和編譯,直接通過(guò)多組件動(dòng)態(tài)重構(gòu)即可完成應(yīng)用軟件功能的重新定義,降低開(kāi)發(fā)成本,同時(shí)縮短軟件開(kāi)發(fā)周期。
圖1 星載軟件可重構(gòu)框架層次圖Fig.1 Hierarchical diagram of reconfigurable framework for on-board software
嵌入式操作系統(tǒng)微重啟的可重構(gòu)方案采取可遞歸恢復(fù)框架實(shí)現(xiàn),具體由故障檢測(cè)代理、恢復(fù)管理器和恢復(fù)代理3 個(gè)模塊組成,如圖2 所示。故障監(jiān)測(cè)代理負(fù)責(zé)實(shí)時(shí)監(jiān)測(cè)系統(tǒng)的運(yùn)行狀態(tài),查找系統(tǒng)故障并將相關(guān)信息傳送給恢復(fù)管理器,故障監(jiān)測(cè)代理將所有系統(tǒng)運(yùn)行狀態(tài)的變化信息遞交給恢復(fù)管理器[4]。恢復(fù)管理器動(dòng)態(tài)地保存系統(tǒng)的故障傳播信息,當(dāng)它接收到從檢測(cè)代理發(fā)送過(guò)來(lái)的故障信息時(shí),采用自動(dòng)故障路徑推斷(Automatic Failure-Path Inference,AFPI)恢復(fù)策略,針對(duì)給定的遞歸重啟樹(shù),計(jì)算最優(yōu)的遞歸恢復(fù)路徑[5],并觸發(fā)恢復(fù)代理,實(shí)現(xiàn)組件或者嵌入式操作系統(tǒng)的微重啟操作。通過(guò)裁剪嵌入式操作系統(tǒng)內(nèi)核,將嵌入式操作系統(tǒng)原有功能模塊上移至用戶態(tài)組件層,同時(shí)確保裁剪后的嵌入式操作系統(tǒng)內(nèi)核能夠穩(wěn)定運(yùn)行。將微重啟功能組件置于內(nèi)核內(nèi),使微重啟功能組件的權(quán)限高于功能性組件,從而有效地控制功能性組件的微重啟動(dòng)作。
圖2 嵌入式操作系統(tǒng)微重啟的可重構(gòu)實(shí)現(xiàn)方案Fig.2 Reconfigurable scheme for embedded operating system micro-restart
基于RAM 型的軟件動(dòng)態(tài)升級(jí)主要過(guò)程如下:在軌運(yùn)行系統(tǒng)中發(fā)現(xiàn)軟件故障或軟件缺陷后,由開(kāi)發(fā)人員在軟件開(kāi)發(fā)機(jī)中修改軟件,將修改信息形成軟件補(bǔ)丁,通過(guò)在地面目標(biāo)機(jī)中進(jìn)行模擬運(yùn)行測(cè)試,驗(yàn)證本次形成的軟件補(bǔ)丁的有效性和正確性;然后提交到地面監(jiān)控系統(tǒng),由地面監(jiān)控系統(tǒng)發(fā)送至在軌設(shè)備上;接著在軌設(shè)備對(duì)在軌系統(tǒng)進(jìn)行動(dòng)態(tài)修改,通過(guò)反饋至地面監(jiān)控系統(tǒng)在軌可重構(gòu)的信息。
為了滿足上述需求,設(shè)計(jì)了在軌軟件維護(hù)系統(tǒng),其功能分解如圖3 所示,3 個(gè)功能模塊分別為:1)補(bǔ)丁生成模塊,包括補(bǔ)丁信息獲取、補(bǔ)丁創(chuàng)建和補(bǔ)丁發(fā)送等;2)在軌修改模塊,包括補(bǔ)丁接收、變量修改、代碼修改、任務(wù)處理等;3)維護(hù)監(jiān)控模塊,包括維護(hù)信息反饋、反饋信息接收與處理等。
圖3 基于RAM 型軟件動(dòng)態(tài)升級(jí)的可重構(gòu)方案Fig.3 Reconfigurable scheme based on the dynamic upgrade of RAM-type software
在圖3 中,基于RAM 型的軟件動(dòng)態(tài)升級(jí)實(shí)現(xiàn)可重構(gòu)方案由軟件開(kāi)發(fā)機(jī)和地面目標(biāo)機(jī)兩個(gè)子系統(tǒng)組成,整個(gè)系統(tǒng)各功能模塊分布于各個(gè)子系統(tǒng)之上,開(kāi)發(fā)機(jī)和地面目標(biāo)機(jī)之間通過(guò)以太網(wǎng)或者串口進(jìn)行通信。兩個(gè)子系統(tǒng)協(xié)同工作,共同完成基于RAM 型的軟件動(dòng)態(tài)升級(jí)可重構(gòu)驗(yàn)證[6]。
星載軟件在軌可重構(gòu)是通過(guò)遙控注數(shù)的方式,將軟件的可執(zhí)行代碼注入到星載計(jì)算機(jī)中,替換原有模塊實(shí)現(xiàn)。風(fēng)云翼輝嵌入式操作系統(tǒng)在SM750平臺(tái)實(shí)現(xiàn)了虛擬內(nèi)存管理技術(shù),支持應(yīng)用軟件以動(dòng)態(tài)加載的方式設(shè)計(jì)實(shí)現(xiàn)和運(yùn)行。
動(dòng)態(tài)加載意味著編譯生成的可執(zhí)行目標(biāo)文件與地址無(wú)關(guān),則可以利用動(dòng)態(tài)鏈接庫(kù)實(shí)現(xiàn)對(duì)星載應(yīng)用軟件中特定功能的封裝[7]。將具有相對(duì)獨(dú)立功能的模塊編寫(xiě)為動(dòng)態(tài)鏈接庫(kù),應(yīng)用軟件在實(shí)現(xiàn)需求中定義的功能時(shí),為滿足特定的功能,可將具有該功能的動(dòng)態(tài)庫(kù)鏈接進(jìn)來(lái),從而星載軟件最后的形態(tài)是以主程序加若干動(dòng)態(tài)鏈接庫(kù)呈現(xiàn)。
動(dòng)態(tài)庫(kù)中只實(shí)現(xiàn)特定功能,其規(guī)??梢宰龅幂^小,從而減輕每次在軌上注時(shí)信道的壓力。而且在功能升級(jí)或者缺陷修復(fù)實(shí)現(xiàn)可重構(gòu)時(shí),可以只針對(duì)單一模塊進(jìn)行,從而提高星載軟件在軌可重構(gòu)方案的安全性和可靠性。
基于動(dòng)態(tài)庫(kù)實(shí)現(xiàn)星載軟件可重構(gòu)流程主要包括重構(gòu)軟件準(zhǔn)備、重構(gòu)軟件分發(fā)、重構(gòu)軟件加載和重構(gòu)結(jié)果反饋4個(gè)步驟。軟件重構(gòu)流程如圖4所示。
圖4 基于動(dòng)態(tài)庫(kù)實(shí)現(xiàn)可重構(gòu)方案Fig.4 Reconfigurable scheme based on the dynamic library
相對(duì)于重啟整個(gè)系統(tǒng)而言,微重啟花費(fèi)的代價(jià)較小。同時(shí),重啟單個(gè)服務(wù)的速度遠(yuǎn)比重啟整個(gè)系統(tǒng)快得多,并且微重啟僅對(duì)重啟的服務(wù)和服務(wù)的進(jìn)程造成影響,而不會(huì)影響到系統(tǒng)中其他服務(wù)的正常運(yùn)行。但是該種方案僅適用于部分?jǐn)?shù)據(jù)不正常,重啟后修復(fù)原來(lái)錯(cuò)誤的數(shù)據(jù),而針對(duì)軟件缺陷或者軟件錯(cuò)誤,該方案無(wú)法徹底修復(fù)。
基于RAM 型的軟件動(dòng)態(tài)升級(jí)實(shí)現(xiàn)可重構(gòu)過(guò)程的可靠性和安全性要求極高,一旦出現(xiàn)失誤有可能導(dǎo)致整個(gè)系統(tǒng)軟件的失效。
與地面系統(tǒng)不同,受天地通信速率、入站頻率及過(guò)站時(shí)間等多方面因素的限制,星載軟件的在軌升級(jí)很難達(dá)到與地面軟件升級(jí)相同的實(shí)時(shí)性。而且,上注的星載軟件可重構(gòu)的內(nèi)容存儲(chǔ)于內(nèi)存中,軟件復(fù)位后,可重構(gòu)的內(nèi)容不復(fù)存在,還需要重新上傳。
基于動(dòng)態(tài)庫(kù)實(shí)現(xiàn)的可重構(gòu)方案,將已存在于在軌設(shè)備上的不同模塊進(jìn)行動(dòng)態(tài)的裝載與卸載,以提供不同功能,或提高系統(tǒng)運(yùn)行速度。借助文件系統(tǒng)隨時(shí)停止、加載、運(yùn)行某個(gè)或某幾個(gè)特定模塊,而不會(huì)影響系統(tǒng)當(dāng)前運(yùn)行的其他功能,且單個(gè)模塊編譯生成的目標(biāo)文件都比較小,狀態(tài)控制和維護(hù)相對(duì)比較容易。
通過(guò)上述分析可知:使用動(dòng)態(tài)庫(kù)中間件的形式應(yīng)用于目前星載系統(tǒng)中,具有較高的可靠性和安全性。而且采用此方法實(shí)現(xiàn)星載軟件可重構(gòu),具有較強(qiáng)的軟件可擴(kuò)展性,易于實(shí)現(xiàn)在軌星載軟件功能的全部替換和特定功能的可重構(gòu)。
3.1.1 方案設(shè)計(jì)
本設(shè)計(jì)中,采用基于動(dòng)態(tài)庫(kù)的形式實(shí)現(xiàn)星載軟件的可重構(gòu),利用嵌入式操作系統(tǒng)提供的動(dòng)態(tài)加載功能,對(duì)在軌星載軟件的特定功能實(shí)現(xiàn)可重構(gòu),修復(fù)已有的軟件缺陷或者漏洞。
星載軟件在設(shè)計(jì)初時(shí),已經(jīng)將部分功能相對(duì)獨(dú)立的部分編寫(xiě)成可鏈接的動(dòng)態(tài)庫(kù),后續(xù)在軌可重構(gòu)既可以針對(duì)每個(gè)獨(dú)立的動(dòng)態(tài)庫(kù),也可以針對(duì)主模塊進(jìn)行重構(gòu),設(shè)計(jì)方案如圖5 所示。
圖5 在軌可重構(gòu)設(shè)計(jì)方案Fig.5 On-orbit reconfigurable design scheme
3.1.2 數(shù)據(jù)包格式設(shè)計(jì)
根據(jù)3.1.1 節(jié)方案所述,針對(duì)需要實(shí)施在軌可重構(gòu)的模塊,編譯生成可執(zhí)行目標(biāo)文件后,需要將該文件中的二進(jìn)制數(shù)據(jù)按著標(biāo)準(zhǔn)國(guó)際空間數(shù)據(jù)系統(tǒng)咨詢委員會(huì)(Consultative Committee for Space Data Systems,CCSDS)協(xié)議封裝為遙控包。為可重構(gòu)設(shè)計(jì)了對(duì)應(yīng)的上注重構(gòu)數(shù)據(jù)包格式如圖6 所示。
圖6 可重構(gòu)上注數(shù)據(jù)包格式Fig.6 Reconfigurable upload packet format
在圖6 中,首包格式同后續(xù)包差異較大,將地面生成的可執(zhí)行目標(biāo)文件所屬的進(jìn)程編號(hào)、文件索引,以及文件的消息摘要算法(Message Digest Algorithm MD5,MD5)值打入首包。將這些信息上注給星載計(jì)算機(jī),作為后續(xù)文件完整性校驗(yàn)的依據(jù)。
引用該算法,是因?yàn)镸D5 算法可以將任意長(zhǎng)度的輸入串經(jīng)過(guò)計(jì)算得到固定長(zhǎng)度的輸出,而且只有在明文相同的情況下,才能等到相同的密文,并且這個(gè)算法是不可逆的,即便得到了加密以后的密文,也不可能通過(guò)解密算法反算出明文。針對(duì)文件完整性和安全性時(shí),具有突出的優(yōu)點(diǎn)。
在上注的每一個(gè)數(shù)據(jù)包中都有包序號(hào),作為后續(xù)文件完整性校驗(yàn)和接收結(jié)束的依據(jù)。當(dāng)接收結(jié)束后,通過(guò)逐一判斷接收到包序號(hào),當(dāng)發(fā)現(xiàn)有缺包的情況時(shí),會(huì)將缺少的包序號(hào)打入遙測(cè)量下傳,地面可以通過(guò)該遙測(cè)量確定補(bǔ)發(fā)動(dòng)作。
3.1.3 實(shí)施流程
可重構(gòu)數(shù)據(jù)包生成后,將這些數(shù)據(jù)包當(dāng)作正常的遙控注數(shù)包,當(dāng)衛(wèi)星在測(cè)控弧段內(nèi)時(shí),上注給需要重構(gòu)的在軌衛(wèi)星,具體的實(shí)施流程如圖7 所示。
圖7 可重構(gòu)實(shí)施流程Fig.7 Reconfigurable implementation flow chart
3.1.4 可靠性和安全性保證
衛(wèi)星在軌自主運(yùn)行時(shí),無(wú)法像地面測(cè)試階段實(shí)時(shí)監(jiān)視其運(yùn)行狀態(tài),只能通過(guò)有限的下行遙測(cè)量監(jiān)控其運(yùn)行狀態(tài)[8]。本方案設(shè)計(jì)中,設(shè)計(jì)了相應(yīng)的可重構(gòu)模塊的遙測(cè)量,包括正確包計(jì)數(shù)、錯(cuò)誤包計(jì)數(shù)、錯(cuò)誤包編號(hào)、可重構(gòu)的模塊編號(hào)等遙測(cè)量。在遙控上注過(guò)程中,可以通過(guò)實(shí)時(shí)遙測(cè)查看當(dāng)前在軌可重構(gòu)情況。當(dāng)有數(shù)據(jù)包校驗(yàn)錯(cuò)誤,會(huì)將錯(cuò)誤包的包號(hào)下傳,此時(shí),地面只需要補(bǔ)發(fā)錯(cuò)誤的單個(gè)數(shù)據(jù)包,即可修復(fù)上注錯(cuò)誤。
在上注的每包遙控包末尾都有相應(yīng)的CRC 值校驗(yàn),可以完成本包數(shù)據(jù)的正確性校驗(yàn)。上注的數(shù)據(jù)并不是立即寫(xiě)入文件系統(tǒng),而是暫存在內(nèi)存空間,當(dāng)接收完全部的數(shù)據(jù)包后,通過(guò)對(duì)整個(gè)文件的完整性校驗(yàn)通過(guò)后,再將全部數(shù)據(jù)寫(xiě)入文件系統(tǒng),形成對(duì)應(yīng)的文件,保證生成的文件的完整性。
每次實(shí)施在軌重構(gòu)時(shí),都會(huì)將之前的文件存儲(chǔ)為備份版本,并不會(huì)自主刪除。當(dāng)啟動(dòng)重構(gòu)后的模塊運(yùn)行后,通過(guò)下行遙測(cè)發(fā)現(xiàn)其功能不符合預(yù)期時(shí),可以進(jìn)行版本回退,保證星載系統(tǒng)軟件的安全。
在文件系統(tǒng)中,針對(duì)每一份可執(zhí)行目標(biāo)文件,都有相應(yīng)的出廠版本,當(dāng)某次可重構(gòu)實(shí)施過(guò)程中出現(xiàn)失誤,造成星載系統(tǒng)軟件損壞[9]。此時(shí),將整星進(jìn)行瞬時(shí)斷電一次,全部可執(zhí)行目標(biāo)文件回到出廠版本,保證整星的安全。運(yùn)行正常后,可以通過(guò)遙測(cè)上注,指定單個(gè)的應(yīng)用或者某個(gè)動(dòng)態(tài)庫(kù)使用最后可重構(gòu)后的版本,啟動(dòng)最新功能。
初始化時(shí),針對(duì)需要在重構(gòu)的模塊函數(shù)進(jìn)行注冊(cè),形成函數(shù)表[8]。在某一時(shí)刻,需要針對(duì)某一函數(shù)進(jìn)行重構(gòu)時(shí),通過(guò)遙控命令的方式,完成新的模塊函數(shù)編成動(dòng)態(tài)鏈接庫(kù)上載,星上系統(tǒng)根據(jù)相關(guān)信息打開(kāi)動(dòng)態(tài)鏈接庫(kù),映射對(duì)應(yīng)函數(shù),替換已經(jīng)創(chuàng)建函數(shù)表中對(duì)應(yīng)函數(shù)指針,完成可重構(gòu)。
為實(shí)現(xiàn)在AIC-OS 操作系統(tǒng)下的在軌可重構(gòu),需要把即將重構(gòu)的模塊編寫(xiě)到動(dòng)態(tài)鏈接庫(kù)中[10],生成一個(gè)動(dòng)態(tài)鏈接庫(kù)文件,通過(guò)上行通道,將生成的動(dòng)態(tài)鏈接庫(kù)文件上傳到星載計(jì)算機(jī)的文件系統(tǒng)中。當(dāng)計(jì)算機(jī)收到重構(gòu)遙控命令時(shí),將接收文件存儲(chǔ)到文件系統(tǒng)中,并根據(jù)遙控命令類型,分別通知相應(yīng)進(jìn)程,同時(shí)分別打開(kāi)動(dòng)態(tài)鏈接庫(kù),實(shí)現(xiàn)對(duì)應(yīng)函數(shù)的映射。
為實(shí)現(xiàn)將目前定義的確定函數(shù)調(diào)用同重構(gòu)后對(duì)應(yīng)的函數(shù)調(diào)用間的無(wú)縫銜接,特定義如圖8 所示的結(jié)構(gòu)體。其中,name 成員為該確定函數(shù)的名稱,名稱是實(shí)現(xiàn)正確映射的關(guān)鍵,所以名稱一定要保證正確;ready 標(biāo)志只是用來(lái)表示是否映射成功,可以忽略不用;com_ptr 為函數(shù)指針,用于表示在沒(méi)有可重構(gòu)之前的函數(shù)指針,類型為void*(*)(void*),即輸入?yún)?shù)為void*類型,返回類型為void*類型的函數(shù)指針,將輸入?yún)?shù)定義為void*類型的原因是為兼容不同函數(shù)對(duì)輸入?yún)?shù)類型的限定。當(dāng)有多個(gè)參數(shù)時(shí),可以定義為結(jié)構(gòu)體,調(diào)用函數(shù)時(shí),只需要將該結(jié)構(gòu)體傳入即可。new_ptr 類型同com_ptr,用于表示當(dāng)發(fā)生重構(gòu)時(shí)新映射的函數(shù)指針。
圖8 實(shí)現(xiàn)可重構(gòu)的結(jié)構(gòu)體Fig.8 Reconfigurable structure
這樣的結(jié)構(gòu)定義可以實(shí)現(xiàn)對(duì)多個(gè)模塊進(jìn)行重構(gòu)[11],將多個(gè)可重構(gòu)對(duì)象組成一個(gè)數(shù)組,根據(jù)索引進(jìn)行相應(yīng)的替換,如 onboard_func_obj_t onboard_func_obj[12]。當(dāng)然,這個(gè)索引和對(duì)應(yīng)的函數(shù)之前的關(guān)系需要自己定好??芍貥?gòu)模塊調(diào)用示例如圖9 所示。
圖9 實(shí)現(xiàn)可重構(gòu)的函數(shù)調(diào)用示例Fig.9 Example of implementing a reconfigurable function call
可重構(gòu)驗(yàn)證過(guò)程中,分別給對(duì)應(yīng)進(jìn)程使用了不同的動(dòng)態(tài)鏈接庫(kù),即各自使用一個(gè)動(dòng)態(tài)鏈接庫(kù)文件。其中,一個(gè)進(jìn)程中將要實(shí)現(xiàn)可重構(gòu)的函數(shù)定義如圖10 所示。
圖10 需要重構(gòu)進(jìn)程的原函數(shù)Fig.10 Original function of the reconstruction process
當(dāng)上位機(jī)發(fā)送完遙控?cái)?shù)據(jù)包后,嵌入式操作系統(tǒng)負(fù)責(zé)監(jiān)視遙控信息的線程將動(dòng)態(tài)鏈接庫(kù)文件寫(xiě)入文件系統(tǒng)中,主動(dòng)通知需要重構(gòu)的進(jìn)程,當(dāng)需要重構(gòu)的進(jìn)程收到該信號(hào)后,調(diào)用dlopen()打開(kāi)動(dòng)態(tài)鏈接庫(kù)文件[12],對(duì)相應(yīng)的函數(shù)進(jìn)行映射,運(yùn)行結(jié)果如圖11 所示。
圖11 實(shí)現(xiàn)可重構(gòu)后的運(yùn)行結(jié)果Fig.11 Results after reconfiguration
運(yùn)行結(jié)果顯示,利用動(dòng)態(tài)庫(kù)形式,能夠較便捷地實(shí)現(xiàn)星載軟件的可重構(gòu)。
星載軟件的可重構(gòu)機(jī)制對(duì)提高整星系統(tǒng)安全性和可靠性有著舉足輕重的作用,并為衛(wèi)星長(zhǎng)期在軌穩(wěn)定運(yùn)行和在軌任務(wù)的擴(kuò)展提供保障。本文對(duì)3種實(shí)現(xiàn)星載軟件可重構(gòu)方案的進(jìn)行優(yōu)缺點(diǎn)比較,選擇利用動(dòng)態(tài)庫(kù)形式實(shí)現(xiàn)。詳細(xì)闡述了基于動(dòng)態(tài)庫(kù)形式的星載軟件可重構(gòu)實(shí)現(xiàn)方案、數(shù)據(jù)包格式、實(shí)施流程及實(shí)施過(guò)程中可靠性和安全性的保證。通過(guò)具體的實(shí)例,完成基于動(dòng)態(tài)庫(kù)的星載軟件可重構(gòu)驗(yàn)證。結(jié)果表明:基于動(dòng)態(tài)庫(kù)形式的可重構(gòu)機(jī)制的運(yùn)用,可以有效豐富和擴(kuò)展星載軟件開(kāi)發(fā)模式和架構(gòu)設(shè)計(jì),為未來(lái)實(shí)現(xiàn)“App”式的星載軟件開(kāi)發(fā)奠定基礎(chǔ)。本重構(gòu)實(shí)現(xiàn)方案可以有效提升在軌衛(wèi)星實(shí)現(xiàn)星載軟件可重構(gòu)過(guò)程中的安全性和可靠性。