董 劍 佟雙軍 左德承 劉宏偉
哈爾濱工業(yè)大學(xué),哈爾濱150001
?
面向S698處理器的軟件故障注入工具研究與實現(xiàn)*
董 劍 佟雙軍 左德承 劉宏偉
哈爾濱工業(yè)大學(xué),哈爾濱150001
故障注入技術(shù)通過人為引入故障,加速系統(tǒng)失效,能夠在短時間內(nèi)有效地評估容錯計算機系統(tǒng)的容錯性能。通過對S698芯片以及當(dāng)前軟件故障注入技術(shù)的研究,設(shè)計實現(xiàn)了一款針對S698處理器的軟件故障注入工具S-SFI,能夠進行關(guān)鍵寄存器被修改、代碼段破壞、進入非法工作區(qū)、死循環(huán)、軟件不喂狗和接口器件工作異常等類型故障的注入。該工具利用串口通信的方式在宿主機端提供了良好的交互界面。通過實驗對S-SFI的各項功能進行了驗證,并分析了各類型故障對目標(biāo)系統(tǒng)的影響程度。 關(guān)鍵詞 軟件故障注入;S698處理器;中斷處理
計算機系統(tǒng)的可靠性評估是一項非常復(fù)雜的工作[1]。通常采用的模型分析方法隨著系統(tǒng)軟硬件規(guī)模的快速增長而變得越來越困難。對于實際系統(tǒng),模型分析中涉及到的故障激勵和錯誤的傳播過程過于復(fù)雜,如果在建模的過程中將實際系統(tǒng)假設(shè)成較為簡單的模型,分析結(jié)果就沒有太大的參考意義。通過實驗方式來評估系統(tǒng)可靠性已經(jīng)成為一種非常有吸引力的驗證系統(tǒng)容錯機制的方法。其中,將物理故障注入目標(biāo)系統(tǒng)硬件是一種較為常用的方式[2]。諸如引腳級故障注入、重離子輻射和電源干擾都是這種故障注入方式的常用方法[3-4],該方法的優(yōu)點是能模擬真實的硬件故障,但缺點是需要針對特定的目標(biāo)系統(tǒng)附加額外的硬件和故障注入設(shè)備。另外,目前高復(fù)雜度、高速度的硬件系統(tǒng)也使故障注入設(shè)備的研制變得非常困難,甚至不可能。通過對系統(tǒng)的仿真模型執(zhí)行故障注入也是評估可靠性的常用方法,但該方法耗時多,需要花大量時間開發(fā)仿真系統(tǒng)?;谲浖崿F(xiàn)的故障注入技術(shù)[5-6]正逐漸受到關(guān)注,通過某種途徑(插入陷阱指令或者讓目標(biāo)程序在調(diào)試模式下執(zhí)行)中斷目標(biāo)程序的執(zhí)行,利用軟件代碼模擬系統(tǒng)軟硬件故障。這種方式實現(xiàn)復(fù)雜度低、成本小,具有很強的可擴展性。
本文設(shè)計并實現(xiàn)一款面向S698處理器芯片的軟件故障注入工具S-SFI(Software Fault Injector for S698)。S698是一款商業(yè)化的基于SPARC V8標(biāo)準(zhǔn)的32位RISC處理器,其內(nèi)部集成64位的浮點處理單元(FPU)、PCI控制器等片上外設(shè)。該芯片適用于高可靠實時控制,廣泛應(yīng)用于工業(yè)控制、工程機械、航天航空、醫(yī)用電子設(shè)備和商用電子設(shè)備等領(lǐng)域。所提出的軟件故障注入工具能完成關(guān)鍵寄存器修改、代碼段破壞、進入非法工作區(qū)、死循環(huán)和接口器件工作異常等多種類型的故障注入。應(yīng)用程序開發(fā)者能夠通過故障注入之后系統(tǒng)的執(zhí)行效果來檢驗嵌入式應(yīng)用的容錯性能,有效輔助系統(tǒng)開發(fā)人員完成容錯應(yīng)用的研制。
故障注入技術(shù)提出于上世紀(jì)70年代,主要用于驗證容錯系統(tǒng)的設(shè)計。按照實現(xiàn)方式的不同可以分為基于仿真的實現(xiàn)、基于硬件實現(xiàn)和基于軟件實現(xiàn)3大類?;诜抡娣绞降墓收献⑷胄枰獙δ繕?biāo)系統(tǒng)建立仿真模型,對模型的精確性要求較高?;谟布绞降墓收献⑷胄枰褂妙~外的硬件,并且容易對目標(biāo)系統(tǒng)造成永久性損壞。而軟件實現(xiàn)的故障注入通過修改程序執(zhí)行時內(nèi)存映像、處理器寄存器或應(yīng)用程序源代碼等方式來模擬故障的發(fā)生,其實現(xiàn)成本低、對目標(biāo)系統(tǒng)依賴性小、對其硬件沒有損壞、具有較好的可移植性。目前國內(nèi)外研究機構(gòu)已開發(fā)了多款軟件故障注入工具,如表1所示。
從表1中可以看出,F(xiàn)IAT[7]的故障注入位置是由用戶在應(yīng)用程序這個層面上選擇的,而其對內(nèi)存映像故障注入的具體位置是通過編譯器和裝載信息獲取的,這就決定了它無法注入瞬時故障。FERRARI[8]的運行受限于帶有ptrace接口函數(shù)的故障注入目標(biāo)系統(tǒng),無法對不帶有操作系統(tǒng)環(huán)境的嵌入式應(yīng)用執(zhí)行故障注入。DOCTOR[9]適用于分布式系統(tǒng)。Xception[1]對處理器要求較高,需要用到調(diào)試硬件編程接口,而這在很多情況下無法獲取。FTAPE[10]的故障注入需要修改驅(qū)動程序,并且該方法只能注入比特位翻轉(zhuǎn)類型的故障。GOOFI[11]只是提供了一個通用的框架,它的主要目的是為對不同的故障注入目標(biāo)系統(tǒng)執(zhí)行故障注入提供一個通用的操作平臺,因為該平臺是利用面向?qū)ο蟮乃枷朐O(shè)計的,所以能方便地擴展故障注入功能。目前的GOOFI版本只提供了對運行前引入故障這種方法的支持,這是其局限性。JACA[12]雖然能夠?qū)ava應(yīng)用程序執(zhí)行高層次故障注入(例如修改變量值),但其運行依賴于Java語言的反射機制,僅僅適用于對Java程序的故障注入。從上述對這些軟件注入工具的分析來看,軟件故障注入工具需要針對其依賴的運行環(huán)境和編譯環(huán)境進行設(shè)計,同時受到這些因素的影響,其功能也有一定的局限性。而目前國內(nèi)尚未發(fā)現(xiàn)能夠運行于S698處理器的故障注入工具。為此,通過對現(xiàn)有工具中針對不同注入方式以及不同故障類型的注入技術(shù)的研究,提出了一款支持國產(chǎn)S698處理器的軟件注入工具S-SFI。
1.1 SFI的運行環(huán)境
S-SFI可分為服務(wù)端和控制端兩部分,分別運行在宿主機和基于S698處理器的目標(biāo)系統(tǒng)上。具體運行環(huán)境如圖1所示。
S-SFI的服務(wù)端運行在以S698芯片為處理器的目標(biāo)硬件系統(tǒng)上,以串口中斷處理程序的方式注冊到目標(biāo)系統(tǒng)的中斷向量表中。故障注入目標(biāo)程序連同服務(wù)端相關(guān)代碼在集成開發(fā)環(huán)境Orion 5.0中編輯、編譯、鏈接生成可執(zhí)行程序之后,開發(fā)環(huán)境通過宿主機COM1串口下載可執(zhí)行程序到目標(biāo)硬件(對應(yīng)DSU調(diào)試支持接口)之上運行。宿主機COM1口和目標(biāo)硬件的DSU口共同組成了程序下載運行調(diào)試的物理通道。目標(biāo)系統(tǒng)提供一個串口(UART1)與宿主機機串口2相連,構(gòu)成故障注入工具控制端與服務(wù)端之間的故障注入與結(jié)果回收通道。
圖1 S-SFI的運行環(huán)境
表1 國外經(jīng)典軟件故障注入工具
工具名稱實現(xiàn)單位注入特點FIAT美國CMU大學(xué)破壞任務(wù)內(nèi)存映像FERRARI美國Texas大學(xué)利用UNIXptrace接口函數(shù)提供的調(diào)試功能注入故障DOCTOR美國Michigan大學(xué)能注入處理器、內(nèi)存、通信故障Xception葡萄牙Coimbra大學(xué)對處理器內(nèi)部調(diào)試硬件編程FTAPE美國Illinois大學(xué)修改驅(qū)動程序模擬磁盤、內(nèi)存等故障GOOFI瑞典Chalmers大學(xué)面向?qū)ο蟮墓收献⑷牍ぞ撸猛ㄓ脭?shù)據(jù)庫存儲數(shù)據(jù)JACA巴西Campinas大學(xué)利用Java語言的反射機制對Java程序執(zhí)行故障注入
1.2 S-SFI的功能設(shè)計
S-SFI的服務(wù)端和控制端的具體功能結(jié)構(gòu)如圖2所示。
控制端位于宿主機上,是用戶配置故障注入?yún)?shù)、進行故障注入、觀察運行結(jié)果的交互界面。由于目標(biāo)程序運行在嵌入式環(huán)境下,而這種環(huán)境所能提供的人機交互方式非常有限且不直觀,為此選擇將工具的控制部分實現(xiàn)在能夠運行Windows的宿主機上,方便用戶操作。S-SFI的控制端主要包含串口通信支撐模塊、故障注入?yún)?shù)生成模塊和命令發(fā)送與結(jié)果回收模塊。串口通信支撐模塊主要包含與目標(biāo)系統(tǒng)進行串口通信的一些功能。它提供串口選擇、發(fā)送數(shù)據(jù)、接收數(shù)據(jù)和配置串口波特率等串口相關(guān)功能給其他模塊,供控制端與服務(wù)端通信使用。故障注入?yún)?shù)生成模塊為用戶提供配置界面,并且根據(jù)用戶的輸入合理地組織故障注入命令。命令發(fā)送與結(jié)果回收模塊一方面接收參數(shù)生成模塊的故障注入命令數(shù)據(jù)并進行相應(yīng)的改造以形成控制命令字節(jié)流,通過串口發(fā)送到工具的服務(wù)端。另一方面還需接收解析服務(wù)端發(fā)來的反饋結(jié)果顯示給用戶。這3個模塊統(tǒng)一協(xié)作,使得用戶能夠在PC機上配置故障注入?yún)?shù)、執(zhí)行故障注入并得到反饋結(jié)果。
服務(wù)端位于目標(biāo)系統(tǒng)之上,是工具的核心部分,主要包含了關(guān)鍵寄存器修改、代碼段破壞、進入非法工作區(qū)、死循環(huán)、軟件不喂狗和接口器件工作異常這6種故障的實際注入模塊和系統(tǒng)狀態(tài)反饋模塊。命令接收與解析模塊接收串口上收到的故障注入命令字節(jié)流并解析出命令的含義,將相關(guān)參數(shù)放到相應(yīng)的數(shù)據(jù)結(jié)構(gòu)中供后續(xù)的故障注入使用。不同的故障類型所對應(yīng)的參數(shù)需求如表2所示。在S-SFI的注入命令格式為‘b’+faultType+parameters+‘e’,命令字長度不固定,用b和e字符指示命令的開頭與結(jié)尾,它們之間的內(nèi)容如果與‘b’,‘e’相同則需要用‘’字符進行轉(zhuǎn)義。命令的第1個字節(jié)描述故障類型,其余位用來表示注入故障的參數(shù),命令字長度不固定。
圖2 S-SFI總體功能結(jié)構(gòu)
1.3 S-SFI的實現(xiàn)
(1) 關(guān)鍵寄存器的修改
S698包含72個普通寄存器以及大量的系統(tǒng)寄存器,普通寄存器能通過匯編指令訪問到,系統(tǒng)寄存器可通過C程序訪問。目標(biāo)系統(tǒng)處理器有用戶、特權(quán)2種工作模式。在中斷處理程序中,處理器處于特權(quán)模式,能讀寫所有存儲器和寄存器。
表2 每種故障類型注入所需的參數(shù)變量
系統(tǒng)寄存器分布于內(nèi)存地址空間上,中斷發(fā)生時不會被硬件自動保存,能夠在中斷處理程序中直接修改。而普通的72個寄存器,在中斷發(fā)生之時會采用SPARC架構(gòu)特有的窗口機制保存部分通用寄存器。因此,實現(xiàn)寄存器修改的關(guān)鍵就是找到被寄存器滑動窗口所隱藏的寄存器。圖3中給出了寄存器窗口的結(jié)構(gòu)。
圖3 具有8組寄存器窗口的寄存器結(jié)構(gòu)
在S698中,當(dāng)發(fā)生函數(shù)調(diào)用(包含中斷調(diào)用)時,隱含的save指令使窗口按圖中逆時針的方向移動一個格,使得被調(diào)函數(shù)在新的窗口運行,前一窗口的out寄存器組變成當(dāng)前窗口的in寄存器組,這種特性常常使得函數(shù)調(diào)用變得高效,但卻使我們無法在中斷處理程序中訪問被注入的目標(biāo)程序的寄存器。為此,對中斷注冊函數(shù)catch_interrupt進行了反匯編分析,得到了S698中斷的注冊過程。在此基礎(chǔ)上,設(shè)計了窗口寄存器的訪問方法。在用于注入的串口中斷處理子程序中,先通過restore執(zhí)行回到進入中斷處理程序之前的寄存器窗口B,利用該窗口的sp寄存器的值,可以訪問并修改內(nèi)存中保存的窗口B的寄存器的內(nèi)容,待中斷返回后,注入的故障值就會被恢復(fù)到相應(yīng)的寄存器中。在這里還需要注意,涉及修改寄存器的代碼部分不能使用局部變量,因為局部變量存儲在內(nèi)存中的堆棧段,堆棧段通過sp寄存器(窗口中的o6寄存器)訪問,而sp寄存器在窗口變換的過程中對應(yīng)的物理寄存器不同,其值會發(fā)生變化,故障注入會因不能正確訪問到變量值而失敗。
(2)代碼段的破壞
代碼段的破壞需要起始破壞地址、終止破壞地址和待注入破壞值3個參數(shù)。由于控制端發(fā)過來的地址可能不是4字節(jié)對齊的,所以在進行故障注入時首先需判斷起始地址,如果是4字節(jié)對齊地址,利用整型指針指向當(dāng)前待破壞代碼段起始位置,以每次四字節(jié)的速度執(zhí)行故障值的寫入。如不是4字節(jié)對齊地址,需利用字節(jié)指針先處理前面若干字節(jié),按照字節(jié)依次寫入故障值。因為Sparc處理器內(nèi)存的存儲格式是大端模式,其在存儲4字節(jié)變量的時候,將變量的最高字節(jié)存放在內(nèi)存的最小地址上,舉例來說,如果內(nèi)存地址0x40037280-0x40037283處存儲了整型內(nèi)容0x12574538,那么這個數(shù)據(jù)中的字節(jié)0x12會被存放在地址0x40037280處,字節(jié)0x38會被存儲到0x40037283處。對于S-SFI來說,因為只接受4字節(jié)為單位的代碼段破壞故障值,所以如果用戶指定的代碼段首地址不是4字節(jié)對齊,為保持一致性,在對4字節(jié)對齊地址之前的內(nèi)存單元進行破壞時,要仔細選擇寫入的字節(jié)。圖左邊表示向內(nèi)存地址0x40037280寫入破壞值 0x12574538之后的內(nèi)存形態(tài),如果用戶指定的故障注入地址以0x4003727E開始,如圖4中左側(cè)畫“??”處,那么,要保證在破壞前2個內(nèi)存單元之后,內(nèi)存單元中的數(shù)據(jù)分布要與圖中右側(cè)的形式一致。
圖4 多字節(jié)代碼段破壞值在內(nèi)存中的分布
(3) 其它注入功能的實現(xiàn)
進入非法工作區(qū)主要是對目標(biāo)程序的PC和nPC寄存器的修改。由于這2個寄存器都會被寄存器滑動窗口保存起來,注入方法與寄存器修改類似。非法工作區(qū)的地址采用隨機地址,在實驗中,進入非法工作區(qū)后系統(tǒng)大多數(shù)會崩潰。死循環(huán)故障使用匯編語言向中斷返回地址寫入死循環(huán)機器代碼,將其寫入PC寄存器所指向的代碼段地址。通過對brach指令機器碼的分析獲得實現(xiàn)死循環(huán)的機器代碼。接口器件的工作異常采用了基于定時器的注入方式,定時器中斷處理程序中采用循環(huán)的方式將故障值數(shù)組中的每個故障值注入到指定的接口控制系統(tǒng)寄存器中。
實驗所采用的目標(biāo)系統(tǒng)為歐比特提供的s698開發(fā)系統(tǒng),目標(biāo)程序為整型和浮點矩陣計算程序。實驗中針對6種類型的故障共進行了5110次注入。表3對注入結(jié)果進行了統(tǒng)計。
表3 故障注入實驗結(jié)果統(tǒng)計
在共計5110次的故障注入測試中,有722次導(dǎo)致目標(biāo)系統(tǒng)崩潰,比例達到了14.13%。有100次導(dǎo)致運行結(jié)果不正確,比例為1.96%,故障注入后仍舊得到正確結(jié)果的比例為83.91%。首先來看寄存器故障注入部分,對大部分寄存器執(zhí)行的故障注入對目標(biāo)系統(tǒng)的運行結(jié)果沒有影響,這可能是因為目標(biāo)程序運行中并沒有用到這些寄存器,在導(dǎo)致目標(biāo)系統(tǒng)運行結(jié)果不正確的100次故障中,o0,o4,o5,Y,F(xiàn)SR寄存器的故障注入占有的百分比相對多些,說明程序在執(zhí)行的過程中經(jīng)常用到它們,這些寄存器對于得到正確的計算結(jié)果非常重要。在導(dǎo)致目標(biāo)系統(tǒng)崩潰的525次故障中,fp,sp,PSR,PC,nPC,WIM和TBR占有的百分比最多,o2次之,這是由于前面幾個寄存器都是堆棧指針(程序要通過它來訪問變量)或者控制寄存器,它們的故障對系統(tǒng)影響非常大,當(dāng)其值被改變后,程序可能訪問到了錯誤的內(nèi)存位置或進入不正確的狀態(tài)而導(dǎo)致系統(tǒng)運行崩潰。從表中也可以看出,關(guān)鍵寄存器修改、破壞代碼段、進入死循環(huán)和進入非法工作區(qū)這幾種類型故障注入后引起系統(tǒng)的崩潰或者錯誤率都到90%以上,證明它們對于目標(biāo)程序來說都是非常致命的故障。在系統(tǒng)設(shè)計時,要著重研究如何檢測與應(yīng)對這些對系統(tǒng)運行而言非常關(guān)鍵的故障。
經(jīng)過對S698處理器的深入研究,本文利用基于串口和定時器中斷的故障注入手段,開發(fā)了一款軟件故障注入工具S-SFI,能完成關(guān)鍵寄存器修改、代碼段破壞、進入非法工作區(qū)、死循環(huán)、軟件不喂狗、接口器件工作異常這6種類型故障的注入,并通過實驗對各項功能進行了驗證。S-SFI基于中斷控制注入的執(zhí)行,實現(xiàn)了運行時的故障注入,可在線調(diào)整注入?yún)?shù),能極大提高基于S698的容錯系統(tǒng)的調(diào)試與驗證效率。在下一步工作中,將展開對故障注入數(shù)據(jù)的分析工作,為用戶提供更加直觀的系統(tǒng)容錯能力參考數(shù)據(jù)。
[1] Carreira J, Madeira H, Silva J G. Xception: Software Fault Injection and Monitoring in Processor Functional Units[J]. Dependable Computing and Fault Tolerant Systems, 1998, 10: 245-266.
[2] Hsueh M C, Tsai T K, Iyer R K. Fault Injection Techniques and Tools[J]. Computer, 1997, 30(4): 75-82.
[3] Natella R, Cotroneo D, Duraes J A, et al. On Fault Representativeness of Software Fault Injection[J]. IEEE Transactions on Software Engineering, 2013, 39(1): 80-96.
[4] Arlat J, Crouzet Y, Karlsson J, Folkesson P, Fuchs E, Leber G H. Comparison of Physical and Software-implemented Fault Injection Techniques[J]. IEEE Trans. Comput, 2003,52(9) : 1115-1133.
[5] Ziade H, Ayoubi R A, Velazco R. A Survey on Fault Injection Techniques[J]. Int. Arab J. Inf. Technol., 2004, 1(2): 171-186.
[6] Wei J, Thomas A, Li G, et al. Quantifying the Accuracy of High-level Fault Injection Techniques for Hardware Faults[C]. The 44rd Annual IEEE/IFIP International Conference on.Dependable Systems and Networks (DSN), 2014.
[7] Barton J H, Czeck E W, Segall Z Z, et al. Fault Injection Experiments Using FIAT[J]. IEEE Transactions on Computers, 1990, 39(4): 575-582.
[8] Kanawati G A, Kanawati N A, Abraham J A. Ferrari: A Flexible Software-based Fault and Error Injection System[J]. IEEE Transactions on Computers, 1995, 44(2): 248-260.
[9] Han S, Shin K G, Rosenberg H A. Doctor: An Integrated Software Fault Injection Environment for Distributed Real-time Systems[C]. International. IEEE Computer Performance and Dependability Symposium, 1995, 204-213.
[10] Tsai T K, Iyer R K. Ftape: A Fault Injection Tool to Measure Fault Tolerance[R]. NASA STI/Recon Technical Report N, 1994.
[11] Aidemark J, Vinter J, Folkesson P, et al. Goofi: Generic Object-oriented Fault Injection Tool[C]. International Conference on Dependable Systems and Networks, 2001, 83-88.
[12] Martins E, Rubira C M F, Leme N G M. Jaca: A Reflective Fault Injection Tool Based on Patterns[C]. International Conference on Dependable Systems and Networks, 2002, 483-487.
A Software Fault Injector for S698 Processor
Dong Jian, Tong Shuangjun, Zuo Decheng, Liu Hongwei
Harbin Institute of Technology, Harbin 150001, China
Thefaultinjectiontechnologycanacceleratesystemfailurebyinjectingthefault,whichcaneffectivelyevaluatethefaulttoleranceperformanceoffaulttolerantcomputersysteminashortperiodoftime.ByresearchingthesoftwarefaulttechniquesandS698chip,asoftwarefaultinjectorforS698chip(S-SFI)isdesignedandimplemented,whichcaninjectfaults,suchasthekeyregistersmodification,codesegmentwreckage,illegalworkareaentrance,thedeadcycle,errorofwatchdogandabnormalinterface,intothesoftwaresystemrunningonS698.Finally,thefunctionsofS-SFIisevaluatedbyexperiments,andtheinfluenceofeachtypeoffaultonthetargetsystemisanalyzedaccordingtotheexperimentalresults.
Softwarefaultinjection; S698chip;Interruption
*國家自然科學(xué)基金(61100029)
2014-10-29
董 劍(1978-),男,山東章丘人,博士,教授,主要研究方向為容錯計算技術(shù);佟雙軍(1990-),男,哈爾濱人,碩士研究生,主要研究方向為容錯機制驗證;左德承(1971-),男,黑龍江五常人,博士,教授,主要研究方向為容錯計算與移動計算;劉宏偉(1971-),男,黑龍江大慶人,博士,教授,主要研究方向為軟件可靠性。
TP302.8
A
1006-3242(2016)04-0083-06