一種控制流錯(cuò)誤檢測(cè)方法
【專(zhuān)利摘要】本發(fā)明提供了一種控制流錯(cuò)誤檢測(cè)方法,預(yù)先根據(jù)調(diào)用路徑集合生成各模塊校驗(yàn)碼集合,運(yùn)行時(shí)動(dòng)態(tài)生成軟件校驗(yàn)碼,與當(dāng)前模塊校驗(yàn)碼集合中各元素進(jìn)行比對(duì)。本發(fā)明的軟件控制流異常檢測(cè)方法,可以有效檢測(cè)和處理航天軟件因軟件代碼區(qū)單粒子翻轉(zhuǎn)、指令計(jì)數(shù)器異常等造成的控制流異常問(wèn)題,實(shí)現(xiàn)簡(jiǎn)單且不需要額外硬件支持。本發(fā)明實(shí)現(xiàn)方法簡(jiǎn)單易行,幾乎不需要任何額外的軟硬件支持??捎行z測(cè)軟件模塊一級(jí)的控制流異常。
【專(zhuān)利說(shuō)明】一種控制流錯(cuò)誤檢測(cè)方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及檢測(cè)方法,尤其涉及一種航天軟件控制流異常檢測(cè)方法。
【背景技術(shù)】
[0002]航天軟件經(jīng)常需要面對(duì)因單粒子等空間環(huán)境導(dǎo)致軟件代碼控制流執(zhí)行錯(cuò)亂的問(wèn)題。宇航專(zhuān)用的CPU和內(nèi)存普遍在硬件層面提供了針對(duì)單粒子事件的糾檢錯(cuò)手段,但隨著民用貨架產(chǎn)品和器件在航天領(lǐng)域越來(lái)越廣泛地獲得應(yīng)用,依靠純軟件手段來(lái)應(yīng)對(duì)空間環(huán)境造成的軟件異常越發(fā)必要。
[0003]傳統(tǒng)上應(yīng)對(duì)代碼控制流異常的辦法主要有硬件看門(mén)狗和EDAC (Error Detect1nAnd Correct1n,錯(cuò)誤檢測(cè)與糾正)技術(shù)等。
[0004]硬件看門(mén)狗是由計(jì)算機(jī)硬件提供的一種系統(tǒng)異常處理機(jī)制,通常包括一個(gè)看門(mén)狗計(jì)數(shù)器,該計(jì)數(shù)器在初始化之后其計(jì)數(shù)值會(huì)隨著時(shí)間不斷累加,一旦到達(dá)系統(tǒng)設(shè)定的最大值會(huì)導(dǎo)致計(jì)算機(jī)硬件復(fù)位(稱(chēng)為“狗咬”),應(yīng)用軟件代碼會(huì)周期性的對(duì)該計(jì)數(shù)器清零(稱(chēng)為“喂狗”操作),來(lái)防止狗咬發(fā)生。一旦因某些軟硬件異常導(dǎo)致軟件無(wú)法按時(shí)喂狗,計(jì)算機(jī)將會(huì)復(fù)位重啟,從而來(lái)令整個(gè)系統(tǒng)恢復(fù)正常。
[0005]EDAC錯(cuò)誤檢測(cè)與糾正技術(shù)是由航天專(zhuān)用星載計(jì)算機(jī)硬件提供的有效抵御單粒子的手段。計(jì)算機(jī)硬件會(huì)自動(dòng)為存儲(chǔ)器中的數(shù)據(jù)生成校驗(yàn)碼,當(dāng)這些數(shù)據(jù)內(nèi)容被改寫(xiě)時(shí)其對(duì)應(yīng)的校驗(yàn)碼也會(huì)被計(jì)算機(jī)硬件自動(dòng)改寫(xiě)。當(dāng)應(yīng)用軟件從存儲(chǔ)器中讀取數(shù)據(jù)時(shí),計(jì)算機(jī)硬件會(huì)自動(dòng)地將讀取出來(lái)的數(shù)據(jù)與其校驗(yàn)碼進(jìn)行匹配,一旦檢測(cè)到少量比特錯(cuò)誤(如Ibit或2bit錯(cuò)誤)則會(huì)自動(dòng)對(duì)數(shù)據(jù)進(jìn)行更正,若檢測(cè)到無(wú)法更正的多比特錯(cuò)誤,則會(huì)令星載計(jì)算機(jī)復(fù)位。該方法可對(duì)存儲(chǔ)軟件代碼的存儲(chǔ)器進(jìn)行保護(hù),從而有效防止軟件代碼異常變化造成的軟件控制流異常。
[0006]此外,近年來(lái)也有學(xué)者提出了一些僅依靠純軟件方法來(lái)進(jìn)行控制流異常檢測(cè)的方法,但普遍較為復(fù)雜,且需要對(duì)編譯器進(jìn)行改造,在編譯期間在特定代碼段自動(dòng)插入某些機(jī)器指令,其實(shí)現(xiàn)難度較大,一般企業(yè)很難具備改寫(xiě)編譯器這樣的能力。
[0007]看門(mén)狗的本質(zhì)作用是預(yù)防計(jì)算機(jī)死鎖或任務(wù)執(zhí)行超時(shí),能夠在指定時(shí)間內(nèi)執(zhí)行“喂狗”操作并不一定意味著軟件控制流未出現(xiàn)問(wèn)題。EDAC內(nèi)存校驗(yàn)效果雖好,但需要硬件支持,民用芯片通常無(wú)此功能。為降低微小衛(wèi)星研制成本和研制門(mén)檻,目前民用貨架器件已經(jīng)被大量應(yīng)用于衛(wèi)星之上,在不具備硬件EDAC功能的條件下提高軟件任務(wù)的可靠性無(wú)疑具有重要意義。
【發(fā)明內(nèi)容】
[0008]為了解決現(xiàn)有技術(shù)中問(wèn)題,本發(fā)明提供了一種控制流錯(cuò)誤檢測(cè)方法,步驟如下:
[0009]步驟1:列出所有軟件模塊之間的扇入、扇出關(guān)系,生成調(diào)用關(guān)系圖,其中Fl為最頂層模塊,它代表軟件的程序入口,被上一級(jí)軟件模塊調(diào)用稱(chēng)為扇入模塊,調(diào)用下一級(jí)軟件模塊稱(chēng)為扇出模塊;
[0010]步驟2:對(duì)每個(gè)軟件模塊編制相應(yīng)數(shù)字簽名,用S來(lái)表示,同一軟件內(nèi)各模塊的數(shù)字簽名不可重復(fù);
[0011]步驟3:對(duì)每個(gè)模塊自底向上遍歷所有扇入模塊,獲得由最頂層模塊到該模塊的所有可能的調(diào)用路徑,從而形成該模塊的調(diào)用路徑集合;
[0012]步驟4:利用最頂層模塊到本模塊調(diào)用路徑上各模塊的數(shù)字簽名,采用統(tǒng)一規(guī)則函數(shù)H生成各模塊校驗(yàn)碼集合并進(jìn)行預(yù)存儲(chǔ),校驗(yàn)碼集合中的每個(gè)校驗(yàn)碼與之前形成的校驗(yàn)路徑集合中的各路徑一一對(duì)應(yīng);規(guī)則函數(shù)H滿足如下性質(zhì):
[0013]性質(zhì)IH(H(Si,Sj),Sk) = H(Si,Sj, Sk);
[0014]步驟5:編寫(xiě)代碼時(shí),需將本模塊當(dāng)前校驗(yàn)碼傳入下一級(jí)調(diào)用模塊,并在每個(gè)模塊頭部進(jìn)行校驗(yàn)碼計(jì)算和比對(duì),如果當(dāng)前校驗(yàn)碼計(jì)算值不在預(yù)先存儲(chǔ)的本模塊校驗(yàn)碼集合之內(nèi),則調(diào)用異常處理;一旦發(fā)生校驗(yàn)碼計(jì)算值不在本模塊校驗(yàn)碼集合之內(nèi)的情況時(shí),則發(fā)現(xiàn)軟件控制流異常,此時(shí)可執(zhí)行異常處理程序。
[0015]作為本發(fā)明的進(jìn)一步改進(jìn),步驟I采用軟件靜態(tài)分析工具對(duì)軟件源文件掃描分析生成調(diào)用關(guān)系圖。
[0016]作為本發(fā)明的進(jìn)一步改進(jìn),步驟2中,數(shù)字簽名采用無(wú)符號(hào)數(shù)表示。
[0017]作為本發(fā)明的進(jìn)一步改進(jìn),步驟4中,F(xiàn)l因沒(méi)有扇入,其校驗(yàn)碼集合為{Cl},且有Cl = SI,即數(shù)字簽名與校驗(yàn)碼等值。
[0018]作為本發(fā)明的進(jìn)一步改進(jìn),規(guī)則函數(shù)H使用累加和、異或和、奇偶校驗(yàn)或CRC校驗(yàn)碼規(guī)則,只需滿足性質(zhì)I即可。CRC (Cyclic Redundancy Check)為循環(huán)冗余校驗(yàn)碼,是數(shù)據(jù)通信領(lǐng)域中最常用的一種差錯(cuò)校驗(yàn)碼
[0019]本發(fā)明的有益效果是:
[0020]本發(fā)明的軟件控制流異常檢測(cè)方法,可以有效檢測(cè)和處理航天軟件因軟件代碼區(qū)單粒子翻轉(zhuǎn)、指令計(jì)數(shù)器異常等造成的控制流異常問(wèn)題。本發(fā)明實(shí)現(xiàn)方法簡(jiǎn)單易行,幾乎不需要任何額外的軟硬件支持。可有效檢測(cè)軟件模塊一級(jí)的控制流異常。
【專(zhuān)利附圖】
【附圖說(shuō)明】
[0021]圖1是本發(fā)明控制流差錯(cuò)示意圖;
[0022]圖2是本發(fā)明調(diào)用關(guān)系圖示例。
【具體實(shí)施方式】
[0023]下面結(jié)合附圖對(duì)本發(fā)明做進(jìn)一步說(shuō)明。
[0024]如圖1所示,提供了控制流異常示意圖,F(xiàn)1、F2、F3三個(gè)軟件模塊為順序調(diào)用關(guān)系,因單粒子事件等異常導(dǎo)致程序代碼區(qū)異常改變,軟件控制流由F2錯(cuò)誤地跳轉(zhuǎn)到了無(wú)直接關(guān)聯(lián)的F6,即發(fā)生了控制流異常。如何不依賴(lài)于硬件而僅憑借軟件自身有效檢測(cè)此類(lèi)異常是本發(fā)明專(zhuān)利所要解決的問(wèn)題。
[0025]本方法的具體實(shí)現(xiàn)步驟如下:
[0026]步驟1:列出所有軟件模塊(函數(shù))之間的扇入、扇出關(guān)系,生成調(diào)用關(guān)系圖,這一步驟可采用諸如TestBed等軟件靜態(tài)分析工具對(duì)軟件源文件掃描分析來(lái)方便實(shí)現(xiàn),圖2給出了一個(gè)簡(jiǎn)單的調(diào)用關(guān)系圖示例。其中Fl為最頂層模塊,它代表軟件的程序入口,例如C語(yǔ)言中的main函數(shù),或航天軟件的主任務(wù)調(diào)度函數(shù)。被上一級(jí)軟件模塊調(diào)用稱(chēng)為扇入模塊,調(diào)用下一級(jí)軟件模塊稱(chēng)為扇出模塊,例如F3存在一個(gè)扇入模塊,即F1,同時(shí)存在三個(gè)扇出模塊,即F6、F7和F8。
[0027]步驟2:對(duì)每個(gè)軟件模塊編制相應(yīng)數(shù)字簽名(用S來(lái)表示,例如F3的數(shù)字簽名為S3),該數(shù)字簽名可以采用無(wú)符號(hào)表示,也可采用其它形式,同一軟件內(nèi)各模塊的數(shù)字簽名不可重復(fù)。
[0028]步驟3:對(duì)每個(gè)模塊自底向上遍歷所有扇入模塊,獲得由最頂層模塊到該模塊的所有可能的調(diào)用路徑,從而形成該模塊的調(diào)用路徑集合。例如由Fl到F6的可能調(diào)用路徑集合為{F1F2F6,F(xiàn)1F6,F(xiàn)1F3F6}。
[0029]步驟4:利用最頂層模塊到本模塊調(diào)用路徑上各模塊的數(shù)字簽名,采用統(tǒng)一規(guī)則函數(shù)H生成各模塊校驗(yàn)碼集合并進(jìn)行預(yù)存儲(chǔ),校驗(yàn)碼集合中的每個(gè)校驗(yàn)碼與之前形成的校驗(yàn)路徑集合中的各路徑一一對(duì)應(yīng)。例如F6的校驗(yàn)碼集合為{C126,C16,C136},其中C126=H(S1,S2,S6),C16 = H(S1,S6),C136 = H(S1,S3,S6),而 Fl 因沒(méi)有扇入,其校驗(yàn)碼集合為{Cl},且有Cl = SI,即數(shù)字簽名與校驗(yàn)碼等值。注意,規(guī)則函數(shù)H必須滿足如下性質(zhì):
[0030]性質(zhì)IH(H(Si,Sj),Sk) = H(Si,Sj, Sk)。
[0031]步驟5:編寫(xiě)代碼時(shí),需將本模塊當(dāng)前校驗(yàn)碼傳入下一級(jí)調(diào)用模塊,并在每個(gè)模塊頭部進(jìn)行校驗(yàn)碼計(jì)算和比對(duì),如果當(dāng)前校驗(yàn)碼計(jì)算值不在預(yù)先存儲(chǔ)的本模塊校驗(yàn)碼集合之內(nèi),則調(diào)用異常處理。例如由Fl調(diào)用F3再調(diào)用F6的這條路徑,F(xiàn)l先將自身校驗(yàn)碼Cl傳入F3中,F(xiàn)3在頭部根據(jù)傳入的校驗(yàn)碼Cl和自身數(shù)字簽名計(jì)算當(dāng)前校驗(yàn)碼,獲得校驗(yàn)碼計(jì)算值D 3 = H(C1,S3) =H(SI,S3) = C13。而F3的校驗(yàn)碼集合為{C13},計(jì)算值在該集合內(nèi),校驗(yàn)通過(guò);在?3調(diào)用F6時(shí),將當(dāng)前校驗(yàn)碼C13傳遞給F6,在F6的頭部計(jì)算校驗(yàn)碼當(dāng)前值,根據(jù)性質(zhì) I 有 D6 = H(C13, S6) = H (H (SI,S2),S6) = H(S1,S2,S6) = C126,亦在 F6 的校驗(yàn)碼集合之內(nèi),校驗(yàn)通過(guò)。后續(xù)調(diào)用模塊以此類(lèi)推,一旦發(fā)生校驗(yàn)碼計(jì)算值不在本模塊校驗(yàn)碼集合之內(nèi)的情況時(shí),則發(fā)現(xiàn)軟件控制流異常,此時(shí)可執(zhí)行異常處理程序。
[0032]實(shí)際使用中,規(guī)則函數(shù)H可使用累加和、異或和、奇偶校驗(yàn)、CRC校驗(yàn)碼等多種規(guī)貝1J,只需滿足性質(zhì)I即可,開(kāi)發(fā)人員可綜合分析軟件運(yùn)行效率和錯(cuò)誤檢出率來(lái)選擇最合適的校驗(yàn)碼生成規(guī)則。
[0033]以上內(nèi)容是結(jié)合具體的優(yōu)選實(shí)施方式對(duì)本發(fā)明所作的進(jìn)一步詳細(xì)說(shuō)明,不能認(rèn)定本發(fā)明的具體實(shí)施只局限于這些說(shuō)明。對(duì)于本發(fā)明所屬【技術(shù)領(lǐng)域】的普通技術(shù)人員來(lái)說(shuō),在不脫離本發(fā)明構(gòu)思的前提下,還可以做出若干簡(jiǎn)單推演或替換,都應(yīng)當(dāng)視為屬于本發(fā)明的保護(hù)范圍。
【權(quán)利要求】
1.一種控制流錯(cuò)誤檢測(cè)方法,其特征在于,步驟如下: 步驟1:列出所有軟件模塊之間的扇入、扇出關(guān)系,生成調(diào)用關(guān)系圖,其中Fl為最頂層模塊,它代表軟件的程序入口,被上一級(jí)軟件模塊調(diào)用稱(chēng)為扇入模塊,調(diào)用下一級(jí)軟件模塊稱(chēng)為扇出模塊; 步驟2:對(duì)每個(gè)軟件模塊編制相應(yīng)數(shù)字簽名,用S來(lái)表示,同一軟件內(nèi)各模塊的數(shù)字簽名不可重復(fù); 步驟3:對(duì)每個(gè)模塊自底向上遍歷所有扇入模塊,獲得由最頂層模塊到該模塊的所有可能的調(diào)用路徑,從而形成該模塊的調(diào)用路徑集合; 步驟4:利用最頂層模塊到本模塊調(diào)用路徑上各模塊的數(shù)字簽名,采用統(tǒng)一規(guī)則函數(shù)H生成各模塊校驗(yàn)碼集合并進(jìn)行預(yù)存儲(chǔ),校驗(yàn)碼集合中的每個(gè)校驗(yàn)碼與之前形成的校驗(yàn)路徑集合中的各路徑一一對(duì)應(yīng);規(guī)則函數(shù)H滿足如下性質(zhì): 性質(zhì) IH(H(Si,Sj),Sk) = H(Si,Sj, Sk); 步驟5:編寫(xiě)代碼時(shí),需將本模塊當(dāng)前校驗(yàn)碼傳入下一級(jí)調(diào)用模塊,并在每個(gè)模塊頭部進(jìn)行校驗(yàn)碼計(jì)算和比對(duì),如果當(dāng)前校驗(yàn)碼計(jì)算值不在預(yù)先存儲(chǔ)的本模塊校驗(yàn)碼集合之內(nèi),則調(diào)用異常處理;一旦發(fā)生校驗(yàn)碼計(jì)算值不在本模塊校驗(yàn)碼集合之內(nèi)的情況時(shí),則發(fā)現(xiàn)軟件控制流異常,此時(shí)可執(zhí)行異常處理程序。
2.根據(jù)權(quán)利要求1所述的一種控制流錯(cuò)誤檢測(cè)方法,其特征在于:步驟I采用軟件靜態(tài)分析工具對(duì)軟件源文件掃描分析生成調(diào)用關(guān)系圖。
3.根據(jù)權(quán)利要求1所述的一種控制流錯(cuò)誤檢測(cè)方法,其特征在于:步驟2中,數(shù)字簽名采用無(wú)符號(hào)數(shù)表示。
4.根據(jù)權(quán)利要求1所述的一種控制流錯(cuò)誤檢測(cè)方法,其特征在于:步驟4中,F(xiàn)l因沒(méi)有扇入,其校驗(yàn)碼集合為{Cl},且有Cl = SI,即數(shù)字簽名與校驗(yàn)碼等值。
5.根據(jù)權(quán)利要求1所述的一種控制流錯(cuò)誤檢測(cè)方法,其特征在于:規(guī)則函數(shù)H使用累加和、異或和、奇偶校驗(yàn)或CRC校驗(yàn)碼規(guī)則,只需滿足性質(zhì)I即可,CRC !Cyclic RedundancyCheck,為循環(huán)冗余校驗(yàn)碼。
【文檔編號(hào)】G06F11/10GK104461886SQ201410756465
【公開(kāi)日】2015年3月25日 申請(qǐng)日期:2014年12月10日 優(yōu)先權(quán)日:2014年12月10日
【發(fā)明者】寇義民, 李春, 劉寬俊, 潘樂(lè), 尚華, 于小龍, 商明森 申請(qǐng)人:深圳航天東方紅海特衛(wèi)星有限公司