国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于迭代鏈接的C6000 DSP平臺在軌維護方法研究

2022-08-02 14:08杜建偉李振松
關(guān)鍵詞:鉤子代碼分配

杜建偉, 李振松, 關(guān) 健

北京控制工程研究所, 北京 100090

0 引 言

軟件在軌維護是有效保證航天器軟件在軌穩(wěn)定運行的重要手段.近年來,隨著DSP處理器應(yīng)用的逐步增多、產(chǎn)品覆蓋面越來越廣,面向DSP平臺的在軌維護方法變得越來越重要.文獻[1-2]針對DSP軟件的維護方法,采用的是全文替換方式,即將程序存儲器中的軟件整體替換;文獻[3]提出一種針對文件系統(tǒng)的在軌維護方法,基于多份文件映像,在系統(tǒng)引導(dǎo)階段,通過引導(dǎo)配置加載對應(yīng)的映像文件達到軟件替換的目的.文獻[4]設(shè)計了一種航天器軟件動態(tài)在軌維護方案,通過在DSP軟件中預(yù)埋鉤子,實現(xiàn)在軌軟件模塊級在軌維護,通過在軌函數(shù)鉤子使能,實現(xiàn)在軌模塊的替換與還原,確保航天器在軌維護過程中仍可連續(xù)運行.

航天器軟件由于運行資源受限,且運行過程有較強的連續(xù)性要求,上述方法在實際應(yīng)用中存在如下不適應(yīng)性:

(1)文獻[1-3]提到的方法,軟件替換過程復(fù)雜,并且需要中斷當前任務(wù)執(zhí)行,通過重新加載才能運行新程序,對于安全關(guān)鍵系統(tǒng)而言是難以容忍的.同時文獻[3]提到的在軌維護方法還需要操作系統(tǒng)具備文件系統(tǒng)的支持,系統(tǒng)運行開銷較大,對于資源受限的航天器嵌入式應(yīng)用環(huán)境而言也不適用;

(2)文獻[4]為了便于在軌維護代碼的生成和提取,在軌維護代碼與已固化代碼一起進行編譯,通過對新增在軌維護文件進行MEMORY和SECTIONS鏈接偽指令重定位,確保其不影響原固化代碼的編譯結(jié)果,這樣整體編譯鏈接后,在原固化編譯鏈接結(jié)果基礎(chǔ)之上,新增內(nèi)容即為在軌維護內(nèi)容.對于在軌維護程序,尤其涉及系統(tǒng)調(diào)用以及底層庫函數(shù)調(diào)用的,僅針對新增在軌維護文件進行鏈接偽指令重定位,不能夠保證編譯結(jié)果中已固化部分內(nèi)容地址分配的一致性.在軌維護代碼中的底層系統(tǒng)調(diào)用以及庫函數(shù)會被編譯器自動分配到原.text段中,同時這部分模塊所需的數(shù)據(jù),也會自動分配至原來的.cinit段和.far段等其他段中,與已固化軟件的各段交叉,導(dǎo)致原軟件的地址整體發(fā)生變化,在軌維護代碼中引用原軟件變量或函數(shù)的,其地址也將相應(yīng)發(fā)生變化,提取的注入代碼將不可用.

(3)在軌維護代碼所使用的空間,一般都是計算機存儲器中預(yù)留的區(qū)域,存儲器類別可能包括EEPROM、FLASH、MRAM以及SRAM等.對于加載至SRAM區(qū)運行的軟件,在軌維護一般首先在SRAM中進行實施,鉤子掛接的使能標志也在SRAM中,驗證充分后,再將注入代碼回寫至EEPROM或FLASH等存儲器中,永久保存.使用文獻[4]的在軌鉤子方式,軟件如果經(jīng)過斷電或重新加載,原SRAM區(qū)中的鉤子掛接標志已不存在,在軌維護軟件將無法恢復(fù)運行狀態(tài).

針對上述問題,本文提出一種基于迭代鏈接的在軌維護方法,可實現(xiàn)注入代碼的自動鏈接、段空間自動分配以及注入代碼的自動提取,同時改進原文獻[4]中的鉤子掛接方法,實現(xiàn)系統(tǒng)在重新加載后重新加電后,在軌維護代碼可正常得以運行.

1 迭代鏈接方法

DSP程序經(jīng)編譯鏈接后生成的目標文件是COFF(common object file format)格式,該文件格式引入了“段”的機制,不同的目標文件可以擁有不同數(shù)量及不同類型的“段”,通過鏈接指令,開發(fā)人員可以控制目標文件中段的構(gòu)成和空間分配.文獻[1]提出的DSP在軌維護方法,正是以此為前提設(shè)計,通過MEMORY和SECTIONS鏈接偽指令,將新增的在軌維護程序文件進行重新定位,以便于二進制注入代碼的生成和提取.

原軟件中功能模塊Func0入口處預(yù)埋了鉤子,如果Func0模塊在軌運行過程出現(xiàn)問題,需要在軌維護,可新建程序文件obsm.c,在該文件中對Func0模塊進行重新編寫,生成在軌注入模塊Func0_obsm,后續(xù)將通過鉤子ObsmHook對Func0_obsm模塊進行掛載,從而替換原模塊Func0.

將新文件obsm.c納入到原工程中,與其他文件進行聯(lián)合編譯.通過對原軟件的鏈接文件進行修改,增加對文件obsm.c生成目標文件的鏈接及空間分配,使其可執(zhí)行代碼映射到單獨的區(qū)域中.鏈接腳本文件如圖1所示.

圖1 鏈接腳本示例

但由于obsm.c在編寫時,其內(nèi)部邏輯可能會使用系統(tǒng)調(diào)用以及底層庫函數(shù)調(diào)用的,底層系統(tǒng)調(diào)用以及庫函數(shù)又往往帶有其他依賴性內(nèi)容,而且這部分內(nèi)容在正常在軌維護代碼編寫過程中,是不可預(yù)知的,只有經(jīng)過第一次編譯鏈接后,才能得到其確定性的依賴內(nèi)容.典型的如在軌注入模塊中增加了底層庫函數(shù)調(diào)用.

采用上述鏈接腳本,將Func0_obsm對應(yīng)的在軌注入文件,映射到OBSM_DRAM空間,直接編譯后,觀察內(nèi)存分配結(jié)果,發(fā)現(xiàn)除新增在軌修改函數(shù)Func0_obsm分配到OBSM_DRAM空間外,原軟件內(nèi)存分配結(jié)果出現(xiàn)變化,.text段中新增了底層庫函數(shù),導(dǎo)致原有函數(shù)調(diào)用地址與在軌修改前的狀態(tài)不一致,這種情況下,采用常規(guī)方式不能夠進行注入代碼的直接提取,因為所有的跳轉(zhuǎn)地址信息均已發(fā)生了變化,如圖2所示.

圖2 原軟件地址發(fā)生變化的在軌修改鏈接結(jié)果示例

迭代鏈接方法,就是通過將在軌維護軟件與原固化軟件進行第一次鏈接,之后通過自動比對鏈接后的內(nèi)存分配文件與原固化軟件的內(nèi)存分配文件,檢索各段中的內(nèi)容差異,提取內(nèi)存分配文件中的新增的目標文件內(nèi)容以及對應(yīng)分段,將新增目標文件重新進行分段和重定位,并根據(jù)分段結(jié)果進行迭代次鏈接,從而確保在軌注入程序內(nèi)存占用的確定性.迭代鏈接方法的流程圖如圖3所示.

圖3 迭代鏈接處理流程

在迭代鏈接過程中,要根據(jù)內(nèi)存分配比對結(jié)果,迭代修改鏈接腳本文件,將各段變化內(nèi)容逐步進行地址重定位,直至除在軌維護段之外,其他各段與原固化軟件狀態(tài)一致.地址重定位過程中,各段變化內(nèi)容原則上可以全部重定位至在軌維護段中.經(jīng)過迭代后,將每次鏈接后各段變化內(nèi)容進行了提取和重新分配,鏈接腳本也同步完成了更新,迭代后的鏈接腳本如圖4所示.

圖4 經(jīng)迭代鏈接后的腳本示例

經(jīng)過迭代鏈接,在軌維護程序與原固化軟件聯(lián)合編譯后,確保了原固化軟件中所有內(nèi)容的地址分配保持不變,新增在軌維護代碼編譯結(jié)果全部分配到單獨開辟的空間中,見圖5所示.在此基礎(chǔ)上,通過注入代碼提取工具,在LST文件中,從對應(yīng)的注入段,直接提取可用于在軌注入的可執(zhí)行代碼.

圖5 原軟件地址未發(fā)生變化的在軌維護鏈接結(jié)果示例

2 在軌維護程序重載機制

航天器軟件運行,包括兩種模式:

模式一,非加載方式運行,即軟件在其固化存儲的空間內(nèi)直接運行,這類方式下,軟件一般存儲于PROM、MRAM等芯片;

模式二,加載方式運行,即通過處理器本身或加載程序,將軟件從其固化空間搬家至SRAM中,之后再引導(dǎo)運行,這類方式下,軟件一般存儲于EEPROM、FLASH等芯片.

這兩種運行模式也決定了在軌維護軟件的加載和運行方式.通常情況無論哪種運行模式下,在軌維護軟件都可以重定位到SRAM區(qū),通過鉤子掛接方式,進行地址跳轉(zhuǎn)來運行,但考慮到SRAM在掉電或其他特殊情況下,會造成數(shù)據(jù)丟失,在軌維護軟件經(jīng)驗證后,都應(yīng)寫入EEPROM、FLASH、MRAM中(PROM只讀型芯片除外)進行永久存儲.非加載方式下,對在軌維護軟件進行迭代鏈接時,其地址可重定位到軟件固化存儲空間的空白區(qū)內(nèi)(PROM只讀型芯片除外);加載方式下,由于軟件最終要加載至SRAM區(qū)運行,因此其地址必須重定位到SRAM中的空白區(qū).

以加載方式為例,為確保軟件在軌程序在系統(tǒng)重啟、加斷電等異常情況下能夠繼續(xù)正常運行,需要滿足如下兩個條件:

(1)程序存儲芯片與SRAM中,要分別針對在軌維護程序預(yù)留足夠的空間,并且該空間盡可能與原軟件存儲空間保持連續(xù);原軟件中涉及加載功能,要確保軟件加載過程,能將原軟件可執(zhí)行代碼所在分區(qū)以及在軌維護所在分區(qū)的內(nèi)容實現(xiàn)整體搬家;避免軟件搬家長度不足,導(dǎo)致在軌維護程序無法正常運行.空間設(shè)計如圖6所示.在軌維護過程中,在軌注入程序?qū)?yīng)可執(zhí)行代碼、依賴數(shù)據(jù)及變量,全部分配在.OBSM段中,搬家過程才不會出現(xiàn)可執(zhí)行代碼和數(shù)據(jù)丟失的情況.

圖6 軟件存儲與加載空間分配

(2)在軌維護程序鉤子掛接方法,應(yīng)設(shè)計兩種狀態(tài),一種是掛接及使能標志等存儲于SRAM區(qū),便于指令更改和操作;一種是掛接及使能標志等存儲于EEPROM、FLASH、MRAM中.一般在軌注入程序首先注入至SRAM中運行,經(jīng)驗證后,即可回寫入EEPROM、FLASH、MRAM中進行永久存儲,同時掛接及使能標志也在EEPROM、FLASH、MRAM中建立三區(qū)存儲機制.系統(tǒng)運行過程中如果出現(xiàn)異常情況,重新對軟件進行加載并運行時,對應(yīng)的在軌程序也能夠被正常加載、掛接及使能,同時為確保注入地址的有效性,應(yīng)對注入地址范圍進行有效性判斷.

(2)在軌維護程序鉤子掛接方法,應(yīng)設(shè)計兩種狀態(tài),一種是掛接及使能標志等存儲于SRAM區(qū),便于指令更改和操作;一種是掛接及使能標志等存儲于EEPROM、FLASH、MRAM中.一般在軌注入程序首先注入至SRAM中運行,經(jīng)驗證后,即可回寫入EEPROM、FLASH、MRAM中進行永久存儲,同時掛接及使能標志也在EEPROM、FLASH、MRAM中建立三區(qū)存儲機制.系統(tǒng)運行過程中如果出現(xiàn)異常情況,重新對軟件進行加載并運行時,對應(yīng)的在軌程序也能夠被正常加載、掛接及使能,同時為確保注入地址的有效性,應(yīng)對注入地址范圍進行有效性判斷.

3 結(jié) 論

本文針對C6000 DSP處理器環(huán)境下的軟件,提出了一種基于迭代鏈接的在軌維護方法,并開發(fā)了配套工具,可實現(xiàn)注入代碼的自動鏈接、段空間自動分配以及注入代碼的自動提取,同時針對在軌注入代碼的連續(xù)運行,設(shè)計了在軌維護程序的重載機制,經(jīng)過了充分的地面試驗,并在某衛(wèi)星型號的微型星敏感器上,進行了多次實際在軌驗證,對星敏感器軟件進行了整體和局部功能的升級.結(jié)果表明,該方法大幅降低了C6000 DSP環(huán)境下軟件在軌維護的難度,簡化了注入代碼提取和確認的過程,在軌維護配套工具可靠實用,在DSP相似平臺軟件維護過程中也可推廣適用.

猜你喜歡
鉤子代碼分配
1種新型燃油分配方案設(shè)計
不拴鉤子的線也能把冰塊釣起來嗎?
Crying Foul
遺產(chǎn)的分配
誰和誰好
幸福的一家
神秘的代碼
一周機構(gòu)凈增(減)倉股前20名
一行代碼玩完19億元衛(wèi)星
精鉤子