劉憲忠,趙昶宇
(1.海軍裝備部駐天津地區(qū)第二軍事代表室,天津 300308;2.天津津航計算技術(shù)研究所,天津 300308)
由于嵌入式系統(tǒng)需要軟件和硬件協(xié)同工作,因此,嵌入式系統(tǒng)的測試難度比傳統(tǒng)的純軟件測試要高得多。對于嵌入式系統(tǒng)來說,測試難度最大同時也是最容易出問題的部位在于對異常和故障的測試。這其中不僅包括軟件異常,還包括硬件故障,這些異常和故障通常在測試時很難被測試覆蓋到,這就會給嵌入式系統(tǒng)測試帶來不確定的隱患因素。
為了消除嵌入式系統(tǒng)測試中不穩(wěn)定的隱患因素,進(jìn)一步提高測試的覆蓋性,尤其是提高對軟件異常和硬件故障處理的測試覆蓋性,可以采用故障注入的方法來模擬真實的軟件異常和硬件故障情況。在嵌入式系統(tǒng)中通過硬件或者軟件的手段,對被測試對象“注入”提前設(shè)計好的異常和故障測試用例,通過運行這些測試用例來測試和評估被測試軟件代碼的容錯性和異常處理能力。
本文對故障注入的原理進(jìn)行了闡述,并列舉了幾種常用的基于故障注入測試方法。采用了故障注入的方法對嵌入式系統(tǒng)進(jìn)行測試,能夠極大地提高測試效率和測試覆蓋率,從而有效提高系統(tǒng)可靠性。
故障注入是指向被測試系統(tǒng)注入某些特定的故障樣本或用例,使得被測系統(tǒng)產(chǎn)生預(yù)期的故障現(xiàn)象的過程,它是驗證被測系統(tǒng)測試性水平的關(guān)鍵技術(shù)。
故障注入技術(shù)主要用于進(jìn)行系統(tǒng)可靠性驗證,它根據(jù)建立的故障注入模型,通常采用人為的向待測系統(tǒng)輸入故障信息,加速待測系統(tǒng)故障或失效,并通過觀察和分析待測系統(tǒng)對輸入故障信息的反饋結(jié)果,對待測系統(tǒng)進(jìn)行定量和定性的驗證和評價[1]。
故障注入技術(shù)的驗證過程通常需要依賴整個系統(tǒng)的原理、功能、特性,F(xiàn)MEA和FMECA的結(jié)果,領(lǐng)域?qū)<业南嚓P(guān)經(jīng)驗以及以往故障率數(shù)據(jù)等信息。在進(jìn)行故障注入時,首先需要執(zhí)行故障注入者選擇故障模型,然后基于選擇的故障模型對被測試系統(tǒng)執(zhí)行故障注入活動,通過運行工作負(fù)載的目標(biāo)系統(tǒng),獲取系統(tǒng)的運行狀態(tài),并對被測系統(tǒng)的反饋結(jié)果進(jìn)行驗證評估。故障注入的原理如圖1所示。
圖1 故障注入原理
嵌入式系統(tǒng)故障注入的輸入包括整個系統(tǒng)的原理、功能、特性,F(xiàn)MEA和FMECA的結(jié)果,領(lǐng)域?qū)<业南嚓P(guān)經(jīng)驗以及以往故障率數(shù)據(jù)等信息。執(zhí)行故障注入的測試人員不僅要提供故障注入模型和注入結(jié)果分析的度量,還要采取措施保證每次故障注入過程的完整。運行工作負(fù)載的目標(biāo)系統(tǒng)可以是系統(tǒng)模擬模型,也可以是真實系統(tǒng)原型。
選擇故障模型的主要功能是確定產(chǎn)生故障的屬性,并將選擇的故障模型作為“執(zhí)行故障注入”環(huán)節(jié)的輸入。如果被選中的故障模型能夠最大限度覆蓋真實系統(tǒng)運行時的故障,則被測系統(tǒng)的反饋結(jié)果就會越精確。
故障模型的建立通常與目標(biāo)系統(tǒng)類型、故障注入方式以及驗證評估的結(jié)果相關(guān)。其中,硬件故障模型的屬性分為故障類型、故障發(fā)生時間、故障持續(xù)時間以及故障位置等,故障發(fā)生時間可以根據(jù)給定的分布或者按照工作負(fù)載的運行狀態(tài)確定,故障持續(xù)時間包括瞬時、間歇和永久3種,故障位置與目標(biāo)系統(tǒng)有關(guān)。軟件故障模型的建立主要依賴于專家的經(jīng)驗和測試結(jié)果,軟件故障注入用于測試被測系統(tǒng)的容錯機制。
由于測試是無止境的,因此必須采取策略從龐大的故障測試用例中選取一個測試子集完成故障注入,一般采用多級抽樣、分層抽樣或者典型抽樣的方法來進(jìn)行故障測試用例的篩選。
在當(dāng)前步驟中需要將上一步驟中選擇的故障模型轉(zhuǎn)變?yōu)榭勺⑷氲墓收闲问?,并選擇適當(dāng)?shù)姆椒▽⒐收霞⑷肽繕?biāo)系統(tǒng)中。故障注入方法的選擇與目標(biāo)系統(tǒng)的類型密切相關(guān),若目標(biāo)系統(tǒng)是系統(tǒng)模擬模型,可針對目標(biāo)系統(tǒng)模擬層次的不同選用不同級別的注入方法,這種模擬注入的方式能夠測試到真實系統(tǒng)原型無法覆蓋的內(nèi)部功能,實現(xiàn)對被測系統(tǒng)的精確注入監(jiān)控。若目標(biāo)系統(tǒng)是真實系統(tǒng)原型,可采取基于軟硬件的物理故障注入方法,用來評估系統(tǒng)原型的可信性和驗證被測系統(tǒng)的容錯性。
獲取系統(tǒng)狀態(tài)和驗證評估結(jié)果是一次完整的故障注入活動中向測試人員提供被測系統(tǒng)反饋結(jié)果的最后步驟。在該步驟中需要測試人員判斷是否終止驗證評估,其判斷依據(jù)包括是否滿足置信區(qū)間、測試得到的概率分布是否穩(wěn)定以及測試參數(shù)是否超過設(shè)定閾值等。若終止驗證評估,則需驗證評估分析所有的測試結(jié)果,反饋被測系統(tǒng)測試結(jié)果。通常采用概率統(tǒng)計的方法進(jìn)行測試結(jié)果的驗證評估和分析。
按照故障注入方法的不同將故障注入技術(shù)分為基于硬件的故障注入、基于模擬的故障注入和基于軟件的故障注入。故障注入技術(shù)分類如圖2所示。
圖2 故障注入技術(shù)分類圖
基于硬件的故障注入是指在被測系統(tǒng)的硬件中加入額外的硬件電路。該方法適用于對某些原型系統(tǒng)的可信性進(jìn)行研究?;谟布收献⑷氲奈恢脤⒃摲椒ǚ譃榻佑|式和非接觸式2種。接觸式故障注入方法可采取直接與被測系統(tǒng)電路的引腳相連接的方式,或是在被測系統(tǒng)芯片內(nèi)部植入對應(yīng)的故障模塊。該方法的優(yōu)點在于無需對被測系統(tǒng)進(jìn)行修改和建模驗證,即可實現(xiàn)對被測系統(tǒng)的永久性故障注入。缺點是容易造成系統(tǒng)硬件損壞,增加了硬件設(shè)計的結(jié)構(gòu)復(fù)雜性和芯片設(shè)計難度。非接觸式故障注入方法中故障注入器和被測系統(tǒng)之間沒有物理連接,因此,它無法準(zhǔn)確把握故障注入的時間和位置。
基于模擬的故障注入是指在被測系統(tǒng)開發(fā)設(shè)計階段通過建立解析和模擬模型來獲取被測系統(tǒng)中大多數(shù)可信性度量信息,通常在功能級別測試系統(tǒng)的各種性能是否滿足要求。模擬模型可實現(xiàn)對被測系統(tǒng)的細(xì)節(jié)設(shè)計的模擬,這樣便于對注入故障進(jìn)行精確監(jiān)控?;诠δ芗墑e的模擬故障注入可將故障注入到被測系統(tǒng)的CPU、通信部件、存儲部件或軟件模塊上,因此,需要對被注入的部件或模塊分別建立不同的故障模型。該方法一般應(yīng)用于系統(tǒng)早期設(shè)計階段,能夠較好地模擬內(nèi)存Bit位翻轉(zhuǎn)和硬件寄存器故障,缺點是建模難度和工作量較大,且容易產(chǎn)生“組合爆炸”問題。
基于軟件的故障注入是指在無需額外硬件設(shè)備輔助的情況下,通過設(shè)置程序指令或修改被測系統(tǒng)的內(nèi)存來模擬被測系統(tǒng)CPU、內(nèi)存、寄存器或網(wǎng)絡(luò)硬件故障,通過在軟件編譯前調(diào)整軟件結(jié)構(gòu)或是運行時改變程序變量或狀態(tài)來模擬系統(tǒng)軟件故障[2]。該方法可以在被測系統(tǒng)的操作系統(tǒng)中設(shè)計故障注入層,或者直接將故障注入到應(yīng)用程序中,它既能模擬部分硬件故障,也能設(shè)計軟件方面的故障。該方法的最大優(yōu)點是故障注入成本低,易于實現(xiàn),并且不會破壞被測系統(tǒng)的硬件環(huán)境。但是也存在著缺點,比如只能對軟件能夠訪問的位置或部件進(jìn)行故障注入,有時會改變被測系統(tǒng)原始軟件結(jié)構(gòu),干擾被測系統(tǒng)軟件運行,還有就是時間精度和分辨率較小,導(dǎo)致無法準(zhǔn)確捕捉到異常和錯誤情況等。根據(jù)故障注入的時機將將基于軟件的故障注入方法分為編譯時故障注入和運行時故障注入2種。編譯時故障注入是指在被測系統(tǒng)的程序目標(biāo)碼被加載執(zhí)行前,將軟件故障注入到程序源代碼中以模擬被測系統(tǒng)軟硬件故障。它需修改被測系統(tǒng)的軟件源代碼,當(dāng)被測系統(tǒng)的軟件運行后,則不會受到外界干擾,缺點是無法實現(xiàn)故障的實時模擬。運行時故障是指當(dāng)被測系統(tǒng)中的軟件運行后,采用特定方式將故障注入被測系統(tǒng)中。它無需修改被測系統(tǒng)的軟件源代碼,可以實時模擬軟硬件故障,缺點是無法模擬永久性故障。
本文重點闡述基于軟件的故障注入方法及其在工程中的實際應(yīng)用。
嵌入式系統(tǒng)中常用的基于軟件的故障注入方法有修改軟件源程序法、基于開發(fā)環(huán)境故障注入、設(shè)備驅(qū)動故障注入和其他故障注入方法。
通過修改軟件源程序進(jìn)行故障注入是目前最常用的注入故障方法。這種方法的最大優(yōu)點是無需借助外部資源和測試工具,同時也無需在軟件源程序中設(shè)置斷點,只需修改源程序中進(jìn)入并執(zhí)行異常處理的判斷條件,即可實現(xiàn)對故障的靈活注入[3]。但是該方法也存在以下不足。
對嵌入式系統(tǒng)進(jìn)行故障注入時,需要軟件測試人員和軟件設(shè)計人員同時在場,軟件測試人員需在軟件設(shè)計人員的指導(dǎo)下完成源程序修改和故障注入工作。該方法在處理和時序相關(guān)的故障注入時,需要對源程序進(jìn)行較大的改動,極有可能在改動源程序時產(chǎn)生新的系統(tǒng)故障?;诓煌墓收献⑷肽J剑枰薷牟⑸啥鄠€版本的軟件源程序,增加了軟件版本管理的工作量和復(fù)雜程度。
在嵌入式系統(tǒng)軟件的編碼和調(diào)試階段,通?;谲浖_發(fā)環(huán)境對系統(tǒng)進(jìn)行故障注入。在開發(fā)環(huán)境中通過設(shè)置調(diào)試斷點的方式,或者在開發(fā)環(huán)境和目標(biāo)機之間建立網(wǎng)絡(luò)連接的方式來修改嵌入式系統(tǒng)軟件內(nèi)存或者寄存器狀態(tài)。該方法最大的優(yōu)點是無需修改嵌入式軟件源程序,在進(jìn)行故障注入時可以極大地減少軟件設(shè)計人員的占用率。該方法也存在以下的局限性和不足。
該方法在利用通用的軟件開發(fā)環(huán)境對具有同步功能的嵌入式余度系統(tǒng)進(jìn)行故障注入時,具有較大的局限性。通過開發(fā)環(huán)境進(jìn)行系統(tǒng)故障注入,通常不能保證故障注入的連續(xù)執(zhí)行,而且無法處理多線程或者中斷程序的故障注入。由于該方法不能對目標(biāo)機進(jìn)行連續(xù)故障注入測試,因此,采用該方法得到的故障注入結(jié)果不能夠真實反映嵌入式系統(tǒng)在實際工作時對故障的反饋狀態(tài)。
當(dāng)嵌入式系統(tǒng)軟件包含底層驅(qū)動模塊軟件時,通??赏ㄟ^底層驅(qū)動模塊軟件向嵌入式系統(tǒng)應(yīng)用層軟件注入故障。該方法需要在底層驅(qū)動模塊軟件中預(yù)留故障注入測試接口,通過故障注入工具向底層驅(qū)動模塊軟件中注入故障。該方法最大的優(yōu)點是無需改動嵌入式系統(tǒng)應(yīng)用層軟件源程序,也不會對被測試嵌入式系統(tǒng)應(yīng)用層軟件的工作負(fù)載產(chǎn)生影響,該方法生成的故障更加接近真實硬件產(chǎn)生的故障。該方法最大的不足是由于需要在底層驅(qū)動模塊軟件中預(yù)留故障注入測試接口,在對系統(tǒng)進(jìn)行故障注入前需要投入較大工作量[4]。
其他的故障注入方法包括超時觸發(fā)法、異?;蛳葳逵|發(fā)法和代碼插入觸發(fā)法等。
超時觸發(fā)法。該方法采用硬件或者軟件定時器觸發(fā)故障注入。該定時器預(yù)先設(shè)定好定時時間,當(dāng)定時時間到后產(chǎn)生中斷信號,在中斷處理程序中激活故障注入。該方法無需修改被測系統(tǒng)的軟件源代碼或者工作負(fù)載。由于定時時間可以任意設(shè)定,因此,該方法可能會對被測試的嵌入式系統(tǒng)產(chǎn)生不可預(yù)知的故障影響和行為,尤其適用于模擬瞬時故障或者間隔式硬件故障。
異常或陷阱觸發(fā)法。該方法采用硬件異?;蛘哕浖葳鍋碛|發(fā)故障注入。與超時觸發(fā)方法不同,它不用設(shè)置定時器就能利用硬件異?;蜍浖葳逶谌我鈺r間或條件下實施故障注入。當(dāng)發(fā)生硬件異?;蚴菆?zhí)行軟件陷阱時,調(diào)用中斷服務(wù)程序激活故障注入。
代碼插入觸發(fā)法。該方法是在被測系統(tǒng)運行時,在不改變被測系統(tǒng)原始軟件源代碼的情況下,在原始軟件源代碼的某條特定代碼之前動態(tài)的插入新的指令并執(zhí)行故障注入。這些動態(tài)插入的新指令作為被測系統(tǒng)軟件源代碼的一部分。通常情況下,被測系統(tǒng)是在特定的工作模式下采用代碼插入觸發(fā)法執(zhí)行故障注入,在被測系統(tǒng)正常的工作模式下一般不采用這種方法[5]。
本文闡述的基于軟件的故障注入方法具有對硬件資源依賴較少,簡單易用,并且具有良好的可擴(kuò)展性,可在系統(tǒng)設(shè)計的任何階段采用該方法來測試系統(tǒng)中的未知故障,并提高系統(tǒng)的健壯性和可靠性。
隨著計算機技術(shù)在嵌入式系統(tǒng)中的不斷發(fā)展和廣泛應(yīng)用,尤其是在航空和航天等安全關(guān)鍵技術(shù)領(lǐng)域的深入推廣,人們對嵌入式系統(tǒng)的可靠性提出了越來越高的要求。目前國內(nèi)嵌入式系統(tǒng)的故障注入技術(shù)仍處于不斷探索和發(fā)展過程中,尤其在一些軍用領(lǐng)域還沒有通用的故障注入設(shè)備,無法高效完成裝備的測試性驗證試驗。所以完善和優(yōu)化故障注入方法,研究通用的故障注入設(shè)備,將成為所有科研人員的努力方向。