杜建偉, 李振松, 關(guān) 健
北京控制工程研究所, 北京 100090
軟件在軌維護(hù)是有效保證航天器軟件在軌穩(wěn)定運(yùn)行的重要手段.近年來(lái),隨著DSP處理器應(yīng)用的逐步增多、產(chǎn)品覆蓋面越來(lái)越廣,面向DSP平臺(tái)的在軌維護(hù)方法變得越來(lái)越重要.文獻(xiàn)[1-2]針對(duì)DSP軟件的維護(hù)方法,采用的是全文替換方式,即將程序存儲(chǔ)器中的軟件整體替換;文獻(xiàn)[3]提出一種針對(duì)文件系統(tǒng)的在軌維護(hù)方法,基于多份文件映像,在系統(tǒng)引導(dǎo)階段,通過引導(dǎo)配置加載對(duì)應(yīng)的映像文件達(dá)到軟件替換的目的.文獻(xiàn)[4]設(shè)計(jì)了一種航天器軟件動(dòng)態(tài)在軌維護(hù)方案,通過在DSP軟件中預(yù)埋鉤子,實(shí)現(xiàn)在軌軟件模塊級(jí)在軌維護(hù),通過在軌函數(shù)鉤子使能,實(shí)現(xiàn)在軌模塊的替換與還原,確保航天器在軌維護(hù)過程中仍可連續(xù)運(yùn)行.
航天器軟件由于運(yùn)行資源受限,且運(yùn)行過程有較強(qiáng)的連續(xù)性要求,上述方法在實(shí)際應(yīng)用中存在如下不適應(yīng)性:
(1)文獻(xiàn)[1-3]提到的方法,軟件替換過程復(fù)雜,并且需要中斷當(dāng)前任務(wù)執(zhí)行,通過重新加載才能運(yùn)行新程序,對(duì)于安全關(guān)鍵系統(tǒng)而言是難以容忍的.同時(shí)文獻(xiàn)[3]提到的在軌維護(hù)方法還需要操作系統(tǒng)具備文件系統(tǒng)的支持,系統(tǒng)運(yùn)行開銷較大,對(duì)于資源受限的航天器嵌入式應(yīng)用環(huán)境而言也不適用;
(2)文獻(xiàn)[4]為了便于在軌維護(hù)代碼的生成和提取,在軌維護(hù)代碼與已固化代碼一起進(jìn)行編譯,通過對(duì)新增在軌維護(hù)文件進(jìn)行MEMORY和SECTIONS鏈接偽指令重定位,確保其不影響原固化代碼的編譯結(jié)果,這樣整體編譯鏈接后,在原固化編譯鏈接結(jié)果基礎(chǔ)之上,新增內(nèi)容即為在軌維護(hù)內(nèi)容.對(duì)于在軌維護(hù)程序,尤其涉及系統(tǒng)調(diào)用以及底層庫(kù)函數(shù)調(diào)用的,僅針對(duì)新增在軌維護(hù)文件進(jìn)行鏈接偽指令重定位,不能夠保證編譯結(jié)果中已固化部分內(nèi)容地址分配的一致性.在軌維護(hù)代碼中的底層系統(tǒng)調(diào)用以及庫(kù)函數(shù)會(huì)被編譯器自動(dòng)分配到原.text段中,同時(shí)這部分模塊所需的數(shù)據(jù),也會(huì)自動(dòng)分配至原來(lái)的.cinit段和.far段等其他段中,與已固化軟件的各段交叉,導(dǎo)致原軟件的地址整體發(fā)生變化,在軌維護(hù)代碼中引用原軟件變量或函數(shù)的,其地址也將相應(yīng)發(fā)生變化,提取的注入代碼將不可用.
(3)在軌維護(hù)代碼所使用的空間,一般都是計(jì)算機(jī)存儲(chǔ)器中預(yù)留的區(qū)域,存儲(chǔ)器類別可能包括EEPROM、FLASH、MRAM以及SRAM等.對(duì)于加載至SRAM區(qū)運(yùn)行的軟件,在軌維護(hù)一般首先在SRAM中進(jìn)行實(shí)施,鉤子掛接的使能標(biāo)志也在SRAM中,驗(yàn)證充分后,再將注入代碼回寫至EEPROM或FLASH等存儲(chǔ)器中,永久保存.使用文獻(xiàn)[4]的在軌鉤子方式,軟件如果經(jīng)過斷電或重新加載,原SRAM區(qū)中的鉤子掛接標(biāo)志已不存在,在軌維護(hù)軟件將無(wú)法恢復(fù)運(yùn)行狀態(tài).
針對(duì)上述問題,本文提出一種基于迭代鏈接的在軌維護(hù)方法,可實(shí)現(xiàn)注入代碼的自動(dòng)鏈接、段空間自動(dòng)分配以及注入代碼的自動(dòng)提取,同時(shí)改進(jìn)原文獻(xiàn)[4]中的鉤子掛接方法,實(shí)現(xiàn)系統(tǒng)在重新加載后重新加電后,在軌維護(hù)代碼可正常得以運(yùn)行.
DSP程序經(jīng)編譯鏈接后生成的目標(biāo)文件是COFF(common object file format)格式,該文件格式引入了“段”的機(jī)制,不同的目標(biāo)文件可以擁有不同數(shù)量及不同類型的“段”,通過鏈接指令,開發(fā)人員可以控制目標(biāo)文件中段的構(gòu)成和空間分配.文獻(xiàn)[1]提出的DSP在軌維護(hù)方法,正是以此為前提設(shè)計(jì),通過MEMORY和SECTIONS鏈接偽指令,將新增的在軌維護(hù)程序文件進(jìn)行重新定位,以便于二進(jìn)制注入代碼的生成和提取.
原軟件中功能模塊Func0入口處預(yù)埋了鉤子,如果Func0模塊在軌運(yùn)行過程出現(xiàn)問題,需要在軌維護(hù),可新建程序文件obsm.c,在該文件中對(duì)Func0模塊進(jìn)行重新編寫,生成在軌注入模塊Func0_obsm,后續(xù)將通過鉤子ObsmHook對(duì)Func0_obsm模塊進(jìn)行掛載,從而替換原模塊Func0.
將新文件obsm.c納入到原工程中,與其他文件進(jìn)行聯(lián)合編譯.通過對(duì)原軟件的鏈接文件進(jìn)行修改,增加對(duì)文件obsm.c生成目標(biāo)文件的鏈接及空間分配,使其可執(zhí)行代碼映射到單獨(dú)的區(qū)域中.鏈接腳本文件如圖1所示.
圖1 鏈接腳本示例
但由于obsm.c在編寫時(shí),其內(nèi)部邏輯可能會(huì)使用系統(tǒng)調(diào)用以及底層庫(kù)函數(shù)調(diào)用的,底層系統(tǒng)調(diào)用以及庫(kù)函數(shù)又往往帶有其他依賴性內(nèi)容,而且這部分內(nèi)容在正常在軌維護(hù)代碼編寫過程中,是不可預(yù)知的,只有經(jīng)過第一次編譯鏈接后,才能得到其確定性的依賴內(nèi)容.典型的如在軌注入模塊中增加了底層庫(kù)函數(shù)調(diào)用.
采用上述鏈接腳本,將Func0_obsm對(duì)應(yīng)的在軌注入文件,映射到OBSM_DRAM空間,直接編譯后,觀察內(nèi)存分配結(jié)果,發(fā)現(xiàn)除新增在軌修改函數(shù)Func0_obsm分配到OBSM_DRAM空間外,原軟件內(nèi)存分配結(jié)果出現(xiàn)變化,.text段中新增了底層庫(kù)函數(shù),導(dǎo)致原有函數(shù)調(diào)用地址與在軌修改前的狀態(tài)不一致,這種情況下,采用常規(guī)方式不能夠進(jìn)行注入代碼的直接提取,因?yàn)樗械奶D(zhuǎn)地址信息均已發(fā)生了變化,如圖2所示.
圖2 原軟件地址發(fā)生變化的在軌修改鏈接結(jié)果示例
迭代鏈接方法,就是通過將在軌維護(hù)軟件與原固化軟件進(jìn)行第一次鏈接,之后通過自動(dòng)比對(duì)鏈接后的內(nèi)存分配文件與原固化軟件的內(nèi)存分配文件,檢索各段中的內(nèi)容差異,提取內(nèi)存分配文件中的新增的目標(biāo)文件內(nèi)容以及對(duì)應(yīng)分段,將新增目標(biāo)文件重新進(jìn)行分段和重定位,并根據(jù)分段結(jié)果進(jìn)行迭代次鏈接,從而確保在軌注入程序內(nèi)存占用的確定性.迭代鏈接方法的流程圖如圖3所示.
圖3 迭代鏈接處理流程
在迭代鏈接過程中,要根據(jù)內(nèi)存分配比對(duì)結(jié)果,迭代修改鏈接腳本文件,將各段變化內(nèi)容逐步進(jìn)行地址重定位,直至除在軌維護(hù)段之外,其他各段與原固化軟件狀態(tài)一致.地址重定位過程中,各段變化內(nèi)容原則上可以全部重定位至在軌維護(hù)段中.經(jīng)過迭代后,將每次鏈接后各段變化內(nèi)容進(jìn)行了提取和重新分配,鏈接腳本也同步完成了更新,迭代后的鏈接腳本如圖4所示.
圖4 經(jīng)迭代鏈接后的腳本示例
經(jīng)過迭代鏈接,在軌維護(hù)程序與原固化軟件聯(lián)合編譯后,確保了原固化軟件中所有內(nèi)容的地址分配保持不變,新增在軌維護(hù)代碼編譯結(jié)果全部分配到單獨(dú)開辟的空間中,見圖5所示.在此基礎(chǔ)上,通過注入代碼提取工具,在LST文件中,從對(duì)應(yīng)的注入段,直接提取可用于在軌注入的可執(zhí)行代碼.
圖5 原軟件地址未發(fā)生變化的在軌維護(hù)鏈接結(jié)果示例
航天器軟件運(yùn)行,包括兩種模式:
模式一,非加載方式運(yùn)行,即軟件在其固化存儲(chǔ)的空間內(nèi)直接運(yùn)行,這類方式下,軟件一般存儲(chǔ)于PROM、MRAM等芯片;
模式二,加載方式運(yùn)行,即通過處理器本身或加載程序,將軟件從其固化空間搬家至SRAM中,之后再引導(dǎo)運(yùn)行,這類方式下,軟件一般存儲(chǔ)于EEPROM、FLASH等芯片.
這兩種運(yùn)行模式也決定了在軌維護(hù)軟件的加載和運(yùn)行方式.通常情況無(wú)論哪種運(yùn)行模式下,在軌維護(hù)軟件都可以重定位到SRAM區(qū),通過鉤子掛接方式,進(jìn)行地址跳轉(zhuǎn)來(lái)運(yùn)行,但考慮到SRAM在掉電或其他特殊情況下,會(huì)造成數(shù)據(jù)丟失,在軌維護(hù)軟件經(jīng)驗(yàn)證后,都應(yīng)寫入EEPROM、FLASH、MRAM中(PROM只讀型芯片除外)進(jìn)行永久存儲(chǔ).非加載方式下,對(duì)在軌維護(hù)軟件進(jìn)行迭代鏈接時(shí),其地址可重定位到軟件固化存儲(chǔ)空間的空白區(qū)內(nèi)(PROM只讀型芯片除外);加載方式下,由于軟件最終要加載至SRAM區(qū)運(yùn)行,因此其地址必須重定位到SRAM中的空白區(qū).
以加載方式為例,為確保軟件在軌程序在系統(tǒng)重啟、加斷電等異常情況下能夠繼續(xù)正常運(yùn)行,需要滿足如下兩個(gè)條件:
(1)程序存儲(chǔ)芯片與SRAM中,要分別針對(duì)在軌維護(hù)程序預(yù)留足夠的空間,并且該空間盡可能與原軟件存儲(chǔ)空間保持連續(xù);原軟件中涉及加載功能,要確保軟件加載過程,能將原軟件可執(zhí)行代碼所在分區(qū)以及在軌維護(hù)所在分區(qū)的內(nèi)容實(shí)現(xiàn)整體搬家;避免軟件搬家長(zhǎng)度不足,導(dǎo)致在軌維護(hù)程序無(wú)法正常運(yùn)行.空間設(shè)計(jì)如圖6所示.在軌維護(hù)過程中,在軌注入程序?qū)?yīng)可執(zhí)行代碼、依賴數(shù)據(jù)及變量,全部分配在.OBSM段中,搬家過程才不會(huì)出現(xiàn)可執(zhí)行代碼和數(shù)據(jù)丟失的情況.
圖6 軟件存儲(chǔ)與加載空間分配
(2)在軌維護(hù)程序鉤子掛接方法,應(yīng)設(shè)計(jì)兩種狀態(tài),一種是掛接及使能標(biāo)志等存儲(chǔ)于SRAM區(qū),便于指令更改和操作;一種是掛接及使能標(biāo)志等存儲(chǔ)于EEPROM、FLASH、MRAM中.一般在軌注入程序首先注入至SRAM中運(yùn)行,經(jīng)驗(yàn)證后,即可回寫入EEPROM、FLASH、MRAM中進(jìn)行永久存儲(chǔ),同時(shí)掛接及使能標(biāo)志也在EEPROM、FLASH、MRAM中建立三區(qū)存儲(chǔ)機(jī)制.系統(tǒng)運(yùn)行過程中如果出現(xiàn)異常情況,重新對(duì)軟件進(jìn)行加載并運(yùn)行時(shí),對(duì)應(yīng)的在軌程序也能夠被正常加載、掛接及使能,同時(shí)為確保注入地址的有效性,應(yīng)對(duì)注入地址范圍進(jìn)行有效性判斷.
(2)在軌維護(hù)程序鉤子掛接方法,應(yīng)設(shè)計(jì)兩種狀態(tài),一種是掛接及使能標(biāo)志等存儲(chǔ)于SRAM區(qū),便于指令更改和操作;一種是掛接及使能標(biāo)志等存儲(chǔ)于EEPROM、FLASH、MRAM中.一般在軌注入程序首先注入至SRAM中運(yùn)行,經(jīng)驗(yàn)證后,即可回寫入EEPROM、FLASH、MRAM中進(jìn)行永久存儲(chǔ),同時(shí)掛接及使能標(biāo)志也在EEPROM、FLASH、MRAM中建立三區(qū)存儲(chǔ)機(jī)制.系統(tǒng)運(yùn)行過程中如果出現(xiàn)異常情況,重新對(duì)軟件進(jìn)行加載并運(yùn)行時(shí),對(duì)應(yīng)的在軌程序也能夠被正常加載、掛接及使能,同時(shí)為確保注入地址的有效性,應(yīng)對(duì)注入地址范圍進(jìn)行有效性判斷.
本文針對(duì)C6000 DSP處理器環(huán)境下的軟件,提出了一種基于迭代鏈接的在軌維護(hù)方法,并開發(fā)了配套工具,可實(shí)現(xiàn)注入代碼的自動(dòng)鏈接、段空間自動(dòng)分配以及注入代碼的自動(dòng)提取,同時(shí)針對(duì)在軌注入代碼的連續(xù)運(yùn)行,設(shè)計(jì)了在軌維護(hù)程序的重載機(jī)制,經(jīng)過了充分的地面試驗(yàn),并在某衛(wèi)星型號(hào)的微型星敏感器上,進(jìn)行了多次實(shí)際在軌驗(yàn)證,對(duì)星敏感器軟件進(jìn)行了整體和局部功能的升級(jí).結(jié)果表明,該方法大幅降低了C6000 DSP環(huán)境下軟件在軌維護(hù)的難度,簡(jiǎn)化了注入代碼提取和確認(rèn)的過程,在軌維護(hù)配套工具可靠實(shí)用,在DSP相似平臺(tái)軟件維護(hù)過程中也可推廣適用.