靳 鑫,徐清華,王慧泉,金仲和
(1.浙江大學(xué) 微小衛(wèi)星研究中心,杭州 310000; 2.上海宇航系統(tǒng)工程研究所,上海 201109)
隨著微小衛(wèi)星功能的軟件化快速發(fā)展[1-2]及任務(wù)難度的升級(jí),星載軟件功能出現(xiàn)異常的風(fēng)險(xiǎn)越來(lái)越高,軟件在軌更新已發(fā)展成為星載軟件的基礎(chǔ)功能之一[3]。此外,對(duì)在軌衛(wèi)星進(jìn)行軟件更新,還可實(shí)現(xiàn)硬件故障隔離和應(yīng)用功能擴(kuò)展,是提高衛(wèi)星運(yùn)行安全與經(jīng)濟(jì)價(jià)值的重要手段[4]。
由于微小衛(wèi)星星地測(cè)控鏈路(特別是S頻段測(cè)控)通信速率小、通信時(shí)間有限,因此大型星載軟件更新通常采用低數(shù)據(jù)量的差異更新[5],常用的星載軟件差異更新方法主要可分為兩種[6]:1)模塊級(jí)更新。模塊級(jí)更新通過(guò)將更新模塊的目標(biāo)文件上注,利用星上操作系統(tǒng)動(dòng)態(tài)加載技術(shù)進(jìn)行目標(biāo)文件替換,達(dá)到星載軟件更新的目的[7-8];2)語(yǔ)句級(jí)更新。其基本原理是對(duì)比更新版與參考版的加載文件,將不同之處生成補(bǔ)丁上注,星上將上注的差異內(nèi)容覆蓋參考版對(duì)應(yīng)位置內(nèi)容,完成更新[9]。相較模塊級(jí)更新,語(yǔ)句級(jí)更新無(wú)需操作系統(tǒng)環(huán)境,因此在微小衛(wèi)星中廣泛應(yīng)用。 然而,由于代碼修改通常會(huì)影響程序空間布局,使得加載文件內(nèi)容發(fā)生大幅變動(dòng),進(jìn)而出現(xiàn)更新數(shù)據(jù)量激增的現(xiàn)象[5]。為降低更新數(shù)據(jù)量,朱虹等[10]提出了將可更新子程序獨(dú)立存儲(chǔ),通過(guò)地址表進(jìn)行子程序調(diào)用的方法,使得子程序內(nèi)部修改不影響外部?jī)?nèi)容。李雁斌等[11]提出可以將可更新函數(shù)進(jìn)行獨(dú)立存儲(chǔ),利用鉤子函數(shù)進(jìn)行可更新函數(shù)尋址調(diào)用。這兩種預(yù)設(shè)可更新對(duì)象的方法雖易實(shí)施,但限制了軟件更新范圍。李振松等[12]提出將每個(gè)函數(shù)看成可更新對(duì)象,并逐個(gè)分配固定存儲(chǔ)區(qū)。該方法的優(yōu)點(diǎn)在于最大程度地限制了代碼修改對(duì)程序空間的影響,然而該方法不僅難以應(yīng)對(duì)函數(shù)新增情況,而且采用的函數(shù)級(jí)修改方法極易導(dǎo)致存儲(chǔ)空間需求激增,需為每個(gè)函數(shù)預(yù)留充足的存儲(chǔ)空間,增加內(nèi)存容量負(fù)擔(dān),并使得內(nèi)存空間嚴(yán)重碎片化。
上述語(yǔ)句級(jí)更新方法只強(qiáng)調(diào)如何通過(guò)約束程序空間的方式來(lái)降低代碼修改對(duì)加載文件的影響,卻忽略了加載文件的差異生成過(guò)程對(duì)最終更新數(shù)據(jù)量的影響。傳統(tǒng)的差異提取方式可稱為同地址比較法,即比較參考版與更新版加載文件在相同程序空間地址上的內(nèi)容,二者不同則認(rèn)為是差異內(nèi)容。這種差異提取方式放大了處于低地址空間的更新對(duì)整個(gè)更新數(shù)據(jù)量的影響。只約束程序空間而不改進(jìn)差異提取方式的語(yǔ)句級(jí)更新方法,在追求更低更新數(shù)據(jù)量同時(shí),會(huì)極大地限制更新范圍或帶來(lái)嚴(yán)重的內(nèi)存負(fù)擔(dān),難以實(shí)現(xiàn)星載大規(guī)模軟件的靈活更新。
為了克服傳統(tǒng)語(yǔ)句級(jí)更新方法存在的問(wèn)題,本文在約束程序空間布局的基礎(chǔ)上,進(jìn)一步考慮差異生成過(guò)程對(duì)更新數(shù)據(jù)量的影響,提出了一種利用序列間匹配路徑進(jìn)行差異補(bǔ)丁制作的方法。同時(shí)本文為了保證星載軟件狀態(tài)可回滾,設(shè)計(jì)了版本引導(dǎo)程序。實(shí)驗(yàn)結(jié)果表明,利用本文提出的方法進(jìn)行軟件在軌更新時(shí),更新上注數(shù)據(jù)量少、過(guò)程可靠,且軟件狀態(tài)可回滾。
一次完整的星載軟件語(yǔ)句級(jí)更新通常包含地面過(guò)程和星上過(guò)程兩部分,如圖1所示。
圖1 語(yǔ)句級(jí)星載軟件在軌更新過(guò)程
地面過(guò)程包含4個(gè)步驟,分別為:1)開(kāi)發(fā)新版本軟件。利用開(kāi)發(fā)工具對(duì)軟件源碼進(jìn)行修改、編譯和鏈接,生成新版目標(biāo)可執(zhí)行文件,并從中提取加載依賴項(xiàng)形成加載文件;2)制作差異補(bǔ)丁。將新版與參考版加載文件按照一定規(guī)則進(jìn)行比對(duì),提取差異內(nèi)容并制作成補(bǔ)丁文件;3)制作注數(shù)塊。對(duì)補(bǔ)丁文件進(jìn)行分割與封裝,將其轉(zhuǎn)換為滿足星地遙控?cái)?shù)據(jù)格式約束的注入數(shù)據(jù)塊序列;4)遙控上注。通過(guò)星地遙控鏈路,將更新數(shù)據(jù)塊逐塊上注至衛(wèi)星。星上過(guò)程包含3個(gè)步驟,分別為:1)解析注數(shù)塊。解析并拼接更新數(shù)據(jù)塊,恢復(fù)出補(bǔ)丁文件;2)在軌合成。根據(jù)補(bǔ)丁文件內(nèi)容對(duì)參考版加載文件進(jìn)行修改,形成新版加載文件;3)重加載。對(duì)采用非在線更新的星載計(jì)算機(jī),還需通過(guò)重加載操作實(shí)現(xiàn)軟件版本切換。
加載文件服務(wù)于衛(wèi)星程序裝載過(guò)程,由可執(zhí)行文件裁剪而來(lái)。在DSP軟件開(kāi)發(fā)環(huán)境CCS(code composer studio)中,可執(zhí)行文件又稱.out文件,該文件中除包含軟件獨(dú)立運(yùn)行的所有信息外,還包含用于保持通用性的內(nèi)容。對(duì)采用靜態(tài)加載的星載計(jì)算機(jī),程序裝載只關(guān)心入口地址和各初始化段內(nèi)容,因此可將.out文件裁剪成圖2所示文件格式。
圖2 加載文件格式
圖2中“入口地址”(4 Byte)表示程序運(yùn)行時(shí)的起始地址;“段總數(shù)”(4 Byte)表示程序加載時(shí)所需的代碼段及初始化數(shù)據(jù)段總數(shù),該值記為K;“段地址”(4 Byte)、“段大小”(4 Byte)及“段內(nèi)容”分別為該數(shù)據(jù)段/代碼段在程序空間中的起始地址、占用量及具體內(nèi)容。默認(rèn)設(shè)置下,CCS開(kāi)發(fā)平臺(tái)生成的初始化段有5個(gè):text、switch、vectors、cinit及const段。開(kāi)發(fā)者可以根據(jù)實(shí)際應(yīng)用需求,利用MEMORY和SECTIONS偽指令對(duì)鏈接命令文件(.cmd文件)重新編輯來(lái)自定義程序空間分配情況,然后利用預(yù)編譯指令pragma在源文件和頭文件中用設(shè)置函數(shù)和全局/靜態(tài)變量的歸屬段。
在本文提出的更新方法中,要求軟件更新時(shí)不改變程序空間劃分情況,因此參考版加載文件和更新版加載文件中“段總數(shù)”和各對(duì)應(yīng)“段地址”相同。
語(yǔ)句級(jí)更新方法的核心在于獲取參考版加載文件和更新版加載文件之間的差異內(nèi)容。從圖2所示的加載文件格式可知,兩版加載文件之間的差異主要來(lái)自各“段內(nèi)容”字段,因此高效提取該字段的差異是降低更新數(shù)據(jù)量的關(guān)鍵。
參考段序列與更新段序列分別設(shè)為T(mén)=t1,t2,…,tn、S=s1,s2,…,sm,其中n、m分別為參考段和更新段的大小。利用同地址比較法進(jìn)行差異內(nèi)容提取時(shí),差異內(nèi)容規(guī)模表示為
F(T,S)=F({ti1≤i≤n},{si1≤i≤m})=
(1)
式中f(x,y)為差異函數(shù),定義為
對(duì)星載軟件在軌更新而言,差異內(nèi)容的規(guī)模直接決定了更新上注的數(shù)據(jù)量。若進(jìn)一步將T表示為T(mén)=t1,…,tk,tk+1,…,tk+w,tk+w+1,…,tn,那么利用同地址比較方法得到的差異內(nèi)容規(guī)模與更新方式之間存在如下關(guān)系:
1)替換內(nèi)容。當(dāng)更新時(shí)將T的第k+1~k+w字節(jié)內(nèi)容替換成x1,…,xw,(tk+i≠xi,1≤i≤w),形成的更新段S=t1,…,tk,x1,…,xw,tk+w+1,…,tn。此時(shí)T和S之間的差異內(nèi)容規(guī)模F(T,S)為
F(T,S)=F({ti1≤i≤k},{ti1≤i≤k})+
F({tik+1≤i≤k+w},{xi1≤i≤w})+
F({tik+w+1≤i≤n},{tik+w+
(2)
可知以內(nèi)容替換的方式進(jìn)行更新時(shí),差異內(nèi)容規(guī)模即為替換內(nèi)容規(guī)模。
2)新增內(nèi)容。當(dāng)更新時(shí)在T的第k字節(jié)內(nèi)容后插入w個(gè)字節(jié)x1,…,xw,形成的更新段S=t1,…,tk,x1,…,xw,tk+1,…,tk+w,tk+w+1,…,tn。此時(shí)T和S之間的差異內(nèi)容規(guī)模F(T,S)為
F(T,S)=F({ti1≤i≤k},{ti1≤i≤k})+
F({tik+1≤i≤k+w},{xi1≤i≤w})+
F({tik+w+1≤i≤n},{tik+1≤i≤n})=
F({tik+1≤i≤k+w},{xi1≤i≤w})+
F({tik+w+1≤i≤n},{tik+1≤i≤n-w})+
F(?,{tin-w+1≤i≤n})=
(3)
由于
故有w≤F(T,S)≤n-k+w。當(dāng)以內(nèi)容新增的方式更新時(shí),差異內(nèi)容規(guī)模不小于新增內(nèi)容規(guī)模,規(guī)模最大值與參考段內(nèi)容的長(zhǎng)度n及新增內(nèi)容規(guī)模w成正線性關(guān)系,與新增位置偏移k成負(fù)線性關(guān)系。
3)刪除內(nèi)容。當(dāng)更新時(shí)將T的第k字節(jié)內(nèi)容后刪除w個(gè)字節(jié),形成更新段S,表示為S=t1,…,tk,tk+w+1,…,tn。此時(shí)T和S之間的差異內(nèi)容規(guī)模F(T,S)為
F(T,S)=F({ti1≤i≤k},{ti1≤i≤k})+
F({tik+1≤i≤n-w},{tik+w+1≤i≤n})=
(4)
可得0≤F(T,S)≤n-k-w,即當(dāng)以內(nèi)容刪除的方式更新時(shí),差異內(nèi)容規(guī)模最小值為0,最大值與參考段內(nèi)容的長(zhǎng)度n成正線性關(guān)系,與刪除位置偏移k和刪除內(nèi)容規(guī)模w成負(fù)線性關(guān)系。
根據(jù)上述分析可知,利用同地址比較方法進(jìn)行差異內(nèi)容提取時(shí),若更新出現(xiàn)內(nèi)容新增或刪除,提取出的差異內(nèi)容規(guī)模受到參考段大小、新增/刪除位置偏移及規(guī)模相關(guān),易發(fā)生數(shù)據(jù)量激增的現(xiàn)象,不利于星載軟件的在軌更新應(yīng)用。為了克服該缺點(diǎn),本文引入能夠表示序列間相互轉(zhuǎn)換所需的最少編輯操作次數(shù)的編輯距離理論[13],通過(guò)計(jì)算參考段與序列段間的匹配路徑,進(jìn)行差異內(nèi)容提取。具體過(guò)程如下所述。
序列T和S之間的編輯距離值Lev(T,S)表示為
(5)
式中tail(T)、tail(S)分別為序列T和S除首元素外的尾序列。本文基于動(dòng)態(tài)規(guī)劃方法計(jì)算Lev(T,S)[14],按如下3個(gè)步驟進(jìn)行:
步驟1建立(n+1)×(m+1)大小的編輯距離矩陣D(m+1)×(n+1)={di,j}(0≤i≤m,0≤j≤n)。
步驟2設(shè)置初項(xiàng)d0,j=j(0≤j≤n)和di,0=i(0≤i≤m)。
步驟3根據(jù)式(6)所示的狀態(tài)轉(zhuǎn)移公式,迭代出矩陣D中余下元素di,j(0
(6)
式中dm,n的值即表示從序列T到S所需的編輯次數(shù)Lev(T,S),算法時(shí)間復(fù)雜為O(mn),空間復(fù)雜度可優(yōu)化至O(min(m,n))[14]。相比同地址比較法,基于匹配路徑的方法雖然時(shí)間復(fù)雜度較高,但該過(guò)程只在地面進(jìn)行,實(shí)際并不影響星載軟件的在軌更新應(yīng)用。此外根據(jù)編輯距離的定義可知,無(wú)論更新時(shí)發(fā)生內(nèi)容替換、新增還是刪除,所需執(zhí)行的編輯操作次數(shù)均等于更新的字節(jié)數(shù),而編輯操作次數(shù)即為差異內(nèi)容規(guī)模,故本文提出的差異提取方法不會(huì)出現(xiàn)更新數(shù)據(jù)量激增的現(xiàn)象。
為了確定具體編輯位置和編輯方式,需從矩陣D的dm,n元素向d0,0元素出發(fā),回溯出序列T和S的匹配路徑[14],然后根據(jù)匹配路徑d0,0->dm,n上各元素的坐標(biāo)和取值變化特點(diǎn)生成編輯過(guò)程:1)當(dāng)匹配路徑呈水平狀(行坐標(biāo)不變)時(shí),刪除序列T的當(dāng)前字節(jié);2)當(dāng)匹配路徑呈豎直狀(列坐標(biāo)不變)時(shí),在序列T的當(dāng)前字節(jié)之后插入序列S的當(dāng)前字節(jié);3)當(dāng)匹配路徑呈對(duì)角狀(行、列坐標(biāo)均變)時(shí),如果編輯距離值不變,則無(wú)需進(jìn)行編輯操作,否則將序列T的當(dāng)前字節(jié)改寫(xiě)成序列S的當(dāng)前字節(jié)。如圖3所示展示了序列T={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10},S={0x03,0x04,0x06,0x36,0x07,0x09,0x10,0x11,0x12,0x13}時(shí)的編輯距離矩陣D、匹配路徑以及T到S的編輯過(guò)程。
由圖3可知將序列T轉(zhuǎn)換為序列S需要進(jìn)行8個(gè)字節(jié)的編輯,具體編輯過(guò)程為:將序列T的第1、2、5字節(jié)刪除,將第7、8字節(jié)分別改寫(xiě)成序列S的第4、5字節(jié),在第10字節(jié)之后依次插入序列S的第8、9和10字節(jié)。為了保證該編輯過(guò)程能夠被準(zhǔn)確解析,需在差異補(bǔ)丁中體現(xiàn)對(duì)參考內(nèi)容的編輯位置、編輯方式及編輯后內(nèi)容;同時(shí)為了減小差異補(bǔ)丁大小,可將對(duì)連續(xù)字節(jié)進(jìn)行同類(lèi)型編輯操作的編輯過(guò)程進(jìn)行合并。因此本文提出的差異補(bǔ)丁的具體格式如圖4所示。
圖3 序列T和S的編輯矩陣與編輯過(guò)程
圖4 差異補(bǔ)丁格式
“地址偏移”和“編輯長(zhǎng)度”分別表示本次編輯的起始地址偏移及編輯字節(jié)數(shù),考慮到編輯距離矩陣求解過(guò)程的時(shí)間和空間復(fù)雜度分別為O(nm)和O(m),段內(nèi)容過(guò)長(zhǎng)時(shí)易出現(xiàn)運(yùn)行時(shí)間過(guò)長(zhǎng)和程序內(nèi)存不足的問(wèn)題,故本文推薦這兩個(gè)字段均采用2字節(jié)表示,對(duì)應(yīng)要求加載文件中各段內(nèi)容的長(zhǎng)度不超過(guò)64 KByte;“編輯類(lèi)型”(1 Byte)可取值為0x11、0x22或0x33,分別對(duì)應(yīng)“刪除”、“插入”和“改寫(xiě)”操作;“更新后內(nèi)容”表示插入和改寫(xiě)后的內(nèi)容。根據(jù)該差異補(bǔ)丁格式,圖3所示的編輯過(guò)程對(duì)應(yīng)的十六進(jìn)制碼流為:{0x0000,0x11,0x0002;0x0004,0x11;0x0001;0x0006,0x33;0x0002,0x36,0x07;0x000A,0x22,0x0003,0x11,0x12,0x13}。
上述內(nèi)容描述了參考版與更新版加載文件中,段內(nèi)差異補(bǔ)丁制作方法與過(guò)程,而加載文件間可能的差異字段還包括“入口地址”和各“段大小”;此外為了兼容回滾操作,補(bǔ)丁文件中需指明補(bǔ)丁類(lèi)型,回滾補(bǔ)丁中需給出回滾版本號(hào),更新補(bǔ)丁中需給出參考版本號(hào)和更新版本號(hào)。綜合上述字段需求,本文提出的完整補(bǔ)丁文件格式如圖5所示。
圖5中“補(bǔ)丁類(lèi)型”(1 Byte)指明是回滾補(bǔ)丁或更新補(bǔ)丁:如果是回滾補(bǔ)丁,則“版本號(hào)1”(1 Byte)表示回滾操作的目標(biāo)版本號(hào),補(bǔ)丁文件中無(wú)可選字段;如果是更新補(bǔ)丁,則“版本號(hào)1”表示參考版本號(hào),且補(bǔ)丁文件中包含可選字段??蛇x字段中:“版本號(hào)2”(1 Byte)表示更新版本號(hào);“入口地址”(4 Byte)表示新版程序運(yùn)行時(shí)的起始地址;“段k地址”(4 Byte)表示存在內(nèi)容差異的段地址,k(1≤k≤K)為段序號(hào);“段k長(zhǎng)度”(4 Byte)表示新版加載文件中第k段的長(zhǎng)度;“段k差異補(bǔ)丁集合”表示第k段的差異補(bǔ)丁集合,該集合由若干個(gè)按圖4格式生成的差異補(bǔ)丁組成。
圖5 補(bǔ)丁文件格式
補(bǔ)丁文件字節(jié)數(shù)較多,需地面以注入數(shù)據(jù)形式上注至衛(wèi)星。以ZDPS-3A衛(wèi)星為例,該衛(wèi)星是針對(duì)中國(guó)衛(wèi)星測(cè)控網(wǎng)測(cè)控設(shè)備和遠(yuǎn)程雷達(dá)精度標(biāo)校需求而設(shè)計(jì)的納衛(wèi)星,已于2020年6月17發(fā)射入軌。該衛(wèi)星上行數(shù)據(jù)采用PCM遙控體制,除去幀控制域、幀校驗(yàn)域等標(biāo)準(zhǔn)字段外,實(shí)際用于放置應(yīng)用數(shù)據(jù)的字段長(zhǎng)度為249 Byte,因此一個(gè)更新補(bǔ)丁文件通常需要多個(gè)注數(shù)幀才能上注完畢。為了保證星上能夠按序還原更新補(bǔ)丁文件,需要在更新數(shù)據(jù)塊中增加塊總數(shù)和塊序號(hào)信息。如圖6所示給出了本文設(shè)計(jì)的在軌更新注入數(shù)據(jù)幀格式,I、i分別為數(shù)據(jù)塊總數(shù)和當(dāng)前數(shù)據(jù)塊編號(hào),均占2字節(jié)。
圖6 在軌更新注入數(shù)據(jù)幀格式
從圖6中可以看出,各數(shù)據(jù)塊幀數(shù)據(jù)域中前2字節(jié)均為“數(shù)據(jù)塊編號(hào)”,表示數(shù)據(jù)塊在補(bǔ)丁文件中的順序,用于保證星上能夠?qū)κ盏降难a(bǔ)丁文件進(jìn)行有序重組。對(duì)首條數(shù)據(jù)塊,幀數(shù)據(jù)域第3~4字節(jié)為“數(shù)據(jù)塊總數(shù)”,表示本次更新所需上注數(shù)據(jù)塊總數(shù),星上用該值進(jìn)行數(shù)據(jù)塊檢驗(yàn),并據(jù)此提示地面所缺數(shù)據(jù)塊編號(hào);數(shù)據(jù)塊幀數(shù)據(jù)域余下空間均填充補(bǔ)丁文件內(nèi)容,當(dāng)補(bǔ)丁文件內(nèi)容無(wú)法填滿數(shù)據(jù)域時(shí),不足空間填充0xAA。
為了實(shí)現(xiàn)圖1所示的在軌更新星上過(guò)程步驟1)、2),即數(shù)據(jù)塊解析和新版加載文件在軌合成,本文設(shè)計(jì)了如圖7所示的在軌更新監(jiān)視程序。
圖7 在軌更新監(jiān)視程序執(zhí)行流程
根據(jù)圖7所示,在軌更新監(jiān)視程序會(huì)對(duì)通過(guò)合法性判斷的數(shù)據(jù)塊進(jìn)行“補(bǔ)丁類(lèi)型”判斷,如果是回滾操作,則根據(jù)補(bǔ)丁中的“版本號(hào)1”字段設(shè)置下次軟件加載版本號(hào);如果是更新操作,則進(jìn)行更新補(bǔ)丁拼接直至獲取完整補(bǔ)丁文件,并據(jù)此對(duì)補(bǔ)丁中“版本號(hào)1”字段指明的參考版加載文件進(jìn)行修改,生成新版加載文件寫(xiě)入存儲(chǔ)器,最后根據(jù)補(bǔ)丁中“版本號(hào)2”字段設(shè)置下次軟件加載版本號(hào)。
在軌更新監(jiān)視程序的可靠性設(shè)計(jì)主要包括數(shù)據(jù)塊合法性檢查、數(shù)據(jù)存儲(chǔ)和過(guò)程狀態(tài)監(jiān)視等3方面內(nèi)容。
1)合法性檢查方面。設(shè)計(jì)檢查對(duì)象除CRC(cyclic redundancy check)校驗(yàn)碼外,還包括補(bǔ)丁中的特殊字段。首先要求星上收到的第1條數(shù)據(jù)塊必須為編號(hào)0的數(shù)據(jù)塊,原因在于只有編號(hào)0的數(shù)據(jù)塊中包含補(bǔ)丁類(lèi)型、版本號(hào)和數(shù)據(jù)塊總數(shù)等信息;其次要求當(dāng)前數(shù)據(jù)塊序號(hào)i應(yīng)小于總數(shù)據(jù)塊個(gè)數(shù)I;最后還要求補(bǔ)丁文件中“版本號(hào)1”字段(即回滾版本號(hào)或參考版本號(hào))在星上已存版本號(hào)范圍之內(nèi),“版本號(hào)2”字段(即更新版本號(hào))等于星上已存最新版本號(hào)加1。
2)數(shù)據(jù)存儲(chǔ)方面。設(shè)計(jì)使用NAND Flash循環(huán)存儲(chǔ)各版本加載文件,并使用ReRAM存儲(chǔ)版本管理信息,包括NAND Flash中已存各版本加載文件的地址和對(duì)應(yīng)的版本號(hào),以及下次軟件加載的版本號(hào)。由于差異更新需要基準(zhǔn)版本,因此將NAND Flash的代碼存儲(chǔ)區(qū)分為不可擦除區(qū)和可擦除區(qū),不可擦除區(qū)在地面階段燒入第0版本加載文件作為差異更新的可用基準(zhǔn),可擦除區(qū)采用循環(huán)模式存儲(chǔ)在軌生成的各版加載文件。NAND Flash和ReRAM中數(shù)據(jù)均采用三模冗余存儲(chǔ)方式。
3)過(guò)程狀態(tài)監(jiān)視方面。設(shè)計(jì)了8個(gè)遙測(cè)量共18字節(jié),用于保證地面能夠?qū)崟r(shí)掌握在軌更新進(jìn)度和程序執(zhí)行狀態(tài),進(jìn)而配合星上過(guò)程順利完成軟件更新或回滾。這8個(gè)遙測(cè)量依次為:
a)合法性檢查結(jié)果(1 Byte):0x00合法;0x11校驗(yàn)碼異常;0x22關(guān)鍵字段提取異常;0x33版本號(hào)1異常;0x44版本號(hào)2異常;0x55序號(hào)字段異常。
b)在軌更新運(yùn)行狀態(tài)(1 Byte):0x00,完成;0x11,未完成;0x22,數(shù)據(jù)塊非法;0x33,參考版加載文件讀取失??;0x44,新版加載文件寫(xiě)入失敗。
c)已存最舊版本號(hào)(1 Byte)。
d)已存最新版本號(hào)(1 Byte)。
e)下次加載版本號(hào)(1 Byte)。
f)所缺數(shù)據(jù)塊條數(shù)(2 Byte)。
g)所缺前5個(gè)數(shù)據(jù)塊ID(10 Byte)。
為了實(shí)現(xiàn)圖1所示的在軌更新星上過(guò)程步驟3),即軟件版本切換,本文中設(shè)計(jì)了版本引導(dǎo)程序,整體流程如圖8所示。
根據(jù)圖8所示,執(zhí)行版本引導(dǎo)程序時(shí),首先進(jìn)行DSP和存儲(chǔ)器(NAND Flash和FeRAM)的初始化;接著從FeRAM中讀取軟件版本管理信息和目標(biāo)版本號(hào)信息,如果這兩種信息任一獲取失敗,則從NAND Flash中讀取版本0的加載文件,否則讀取目標(biāo)版本的加載文件;最后將加載文件內(nèi)容分段裝載至程序空間,并將程序入口地址裝載至程序計(jì)數(shù)器,開(kāi)始運(yùn)行衛(wèi)星程序。
版本引導(dǎo)程序的可靠性設(shè)計(jì)主要體現(xiàn)為讀取NAND Flash和FeRAM中數(shù)據(jù)時(shí)采用三模冗余操作,且任意數(shù)據(jù)獲取異常時(shí),星上能夠加載版本0代碼回到默認(rèn)穩(wěn)定狀態(tài)。
圖8 版本引導(dǎo)程序執(zhí)行流程
本文實(shí)驗(yàn)基于ZDPS-3A衛(wèi)星星載計(jì)算機(jī)平臺(tái),對(duì)所提出的軟件在軌更新方法進(jìn)行試驗(yàn),主要針對(duì)更新/回滾操作執(zhí)行情況,以及更新數(shù)據(jù)量等項(xiàng)目進(jìn)行測(cè)試。雖然實(shí)驗(yàn)在地面進(jìn)行,但過(guò)程模擬實(shí)際在軌狀態(tài),數(shù)據(jù)塊均通過(guò)地面站以2 000 bps的PCM遙控模式上注,并在實(shí)驗(yàn)開(kāi)始前將版本0的加載文件燒入NAND Flash不可擦除區(qū)。
實(shí)驗(yàn)在版本0的基礎(chǔ)上進(jìn)行15次修改,形成編號(hào)為1~15的更新版本。表1顯示了24次更新與回滾操作的實(shí)驗(yàn)結(jié)果,其中列“Id”為滾回版本號(hào)或更新版本號(hào),列“Idr”為參考版本號(hào),列“Idc”、“Idc’”分別為操作前和操作后星上運(yùn)行的版本號(hào),列“Ido”、“Idn”分別為操作之前NAND Flash中可擦除區(qū)保存的最舊和最新加載文件版本號(hào)。
表1數(shù)據(jù)顯示經(jīng)過(guò)24次更新/回滾操作實(shí)驗(yàn),更新成功與失敗次數(shù)分別為15次和2次,回滾成功與失敗次數(shù)分別為5次和2次。進(jìn)一步分析各次操作結(jié)果可知:
1)當(dāng)更新/回滾操作滿足在軌更新監(jiān)視程序的合法性設(shè)計(jì)時(shí),操作能正常執(zhí)行;
2)執(zhí)行更新操作時(shí),如果新版加載文件版本號(hào)不連續(xù),或參考版本號(hào)不在星上存儲(chǔ)范圍時(shí),星上不執(zhí)行更新操作,而保持當(dāng)前版本運(yùn)行,該現(xiàn)象符合在軌監(jiān)視程序的可靠性設(shè)計(jì);
3)執(zhí)行回滾操作時(shí),如果回滾版本號(hào)不在星上存儲(chǔ)范圍時(shí),星上會(huì)自動(dòng)加載版本0程序以保證軟件安全,該現(xiàn)象符合版本引導(dǎo)程序的可靠性設(shè)計(jì)。
表1 軟件更新操作執(zhí)行結(jié)果
上述實(shí)驗(yàn)結(jié)果表明本文提出的軟件更新方法能夠可靠地實(shí)現(xiàn)軟件更新和回滾。
由于回滾操作僅需要1條注數(shù)塊,因此本實(shí)驗(yàn)僅針對(duì)更新操作。實(shí)驗(yàn)以傳統(tǒng)的同地址比較法為比較對(duì)象,分析了本文提出的利用匹配路徑進(jìn)行差異提取的方法在更新數(shù)據(jù)量方面的優(yōu)勢(shì)。
實(shí)驗(yàn)時(shí)首先在版本0的基礎(chǔ)上進(jìn)行修改,逐步生成5個(gè)新版本加載文件;然后以版本0為參考對(duì)象,進(jìn)行版本1~5的更新。如圖9所示顯示了傳統(tǒng)差異提取方法和本文差異提取方法在不同版本更新過(guò)程中所生成的補(bǔ)丁文件規(guī)模。
圖9表明利用版本0進(jìn)行版本1~5的更新時(shí),相比傳統(tǒng)差異提取方法,本文方法能夠顯著減少補(bǔ)丁文件規(guī)模。表2列出了以不同版本為參考進(jìn)行版本1~5更新時(shí),傳統(tǒng)方法與本文方法在更新數(shù)據(jù)量、注入數(shù)據(jù)塊數(shù)量及測(cè)控資源需求等3個(gè)項(xiàng)目上的實(shí)驗(yàn)結(jié)果。表2在計(jì)算測(cè)控資源需求量時(shí),參考ZDPS-3A衛(wèi)星平均每個(gè)測(cè)控圈的實(shí)際發(fā)令情況,設(shè)置每個(gè)測(cè)控圈中可用于上注在軌更新數(shù)據(jù)塊的時(shí)長(zhǎng)和發(fā)令間隔分別為6 min和8 s,因此每圈可上注約45條在軌更數(shù)據(jù)塊,當(dāng)需求量不足整圈時(shí),按整圈向上取整。
圖9 更新補(bǔ)丁規(guī)模
表2 不同更新方法實(shí)驗(yàn)結(jié)果
表2實(shí)驗(yàn)數(shù)據(jù)表明,兩種差異更新方法得到的補(bǔ)丁文件規(guī)模都遠(yuǎn)小于加載文件規(guī)模,因此上注差異補(bǔ)丁比上注完整的加載文件更適合用于星載軟件在軌更新。兩種差異更新方法比對(duì)來(lái)看,相比使用傳統(tǒng)的同地址比較法進(jìn)行差異內(nèi)容提取的方式,使用本文提出的基于匹配路徑的差異內(nèi)容提取方式,平均可降低53.00%的補(bǔ)丁規(guī)模、52.95%的數(shù)據(jù)塊上注量和50.74%的測(cè)控圈需求量,因此本文提出的差異內(nèi)容提取方法更適合應(yīng)用于語(yǔ)句級(jí)差異更新。
1)本文提出的星載軟件更新方法在程序空間優(yōu)化的基礎(chǔ)上,利用匹配路徑進(jìn)行差異內(nèi)容提取,達(dá)到了降低更新數(shù)據(jù)量的目的。實(shí)驗(yàn)結(jié)果表明與傳統(tǒng)語(yǔ)句級(jí)更新方法相比,本文方法可降低超過(guò)50.00%更新上注數(shù)據(jù)量,進(jìn)而降低超過(guò)50.00%的測(cè)控資源需求量,大大縮短了更新上注時(shí)間。
2)通過(guò)版本引導(dǎo)程序設(shè)計(jì),可實(shí)現(xiàn)星載軟件版本靈活控制。
3)文件及程序的可靠性設(shè)計(jì),使得更新過(guò)程能夠屏蔽非法操作,保證了更新過(guò)程的安全性。