?

面向二進制代碼的軟錯誤故障注入器設計與實現

2021-10-15 12:48羅予東董守玲
計算機應用與軟件 2021年10期
關鍵詞:寄存器存儲器應用程序

羅予東 董守玲 陸 璐

1(嘉應學院計算機學院 廣東 梅州 514015) 2(華南理工大學計算機科學與工程學院 廣東 廣州 510641)

0 引 言

隨著計算機硬件設備集成度的日益提高,現代系統中的硬件故障率也與日俱增。隨著芯片小型化和精密化的不斷發展,硬件設備更容易受到外部環境的影響。在使用過程中,主要的故障問題是軟錯誤:一些隨機位在存儲器和寄存器中翻轉,導致軟件在計算時產生不可預知的錯誤。導致硬件設備電壓變化、存儲器位翻轉等軟錯誤的原因很多,對于高可靠性要求的軟件應用,更加重視軟錯誤的影響。目前,硬件和系統級檢測與校正機制幾乎不能監視某些軟錯誤。因此,研究軟錯誤對程序計算、程序控制的系統來說具有重要意義。

為了評估軟錯誤對系統的影響,通常的解決方案是手動生成故障并研究程序在故障下的行為及動作。通常的方法是采用軟件方式注入故障,除此以外還可以模擬外部環境(如輻射等)產生故障。由于在實際應用中很少發生軟錯誤,因此需要提高軟錯誤的發生概率。實際上,模擬外部環境和直接修改硬件設備狀態,代價是昂貴且不切實際的。研究表明在機器代碼級通過軟件故障注入技術更容易模擬硬件故障,并且具有較高的精度[1]。

在硬件模擬方法中,通過硬件模擬設備實現位翻轉。該方法可以提供機器代碼級的硬件故障注入,通過檢測和校正機制可以覆蓋整個注入過程。為了實現匯編代碼的故障注入結果與源代碼的映射,研究并設計了一種軟件故障注入方法,可以針對源代碼進行故障注入。目前,該技術面臨的主要挑戰是如何保證硬件錯誤能夠精確注入。原因是硬件錯誤可以分布在程序的任何地方和任何部分,而程序的某些組件無法提供源代碼。二進制故障注入技術可以有效解決上述兩個問題,能夠提供可操縱的、準確以及實用的故障注入方法,該方法通過直接修改二進制代碼來模擬硬件故障。常用的動態二進制故障檢測和注入工具包括PIN[2]和Valgrind[3],基于上述工具進行故障模擬的方法已被證明是準確和有效的。該故障注入技術主要是處理機器代碼級的硬件指令,對于源代碼級的故障注入更是準確和有效的。

為了研究軟錯誤對程序計算的實際影響,本文設計并開發了一種基于PIN的故障注入器。其主要特點是可以在特定位置檢測和修改應用程序,包括各種寄存器和存儲器單元。實驗證明,該方法針對ECC保護存儲器和邏輯單元可以有效地模擬位翻轉。本文的主要貢獻是:

1) 本文設計的故障注入器基于PIN工具。介紹了故障注入器的設計和實現,它能夠注入軟錯誤并分析運行結果,同時提供了一種將故障注入任何特定存儲器和寄存器的方法。

2) 研究并分析了基于PIN的故障注入器的準確性,評估了軟錯誤對應用程序的影響。

1 國內外主要研究工作

截至目前,軟錯誤對應用性能和系統可靠性的影響越來越受到關注,故障注入技術作為研究軟錯誤對系統影響的一種常用方法,現已被廣泛采用。在故障注入技術領域,已經提出了許多種方法,主要包括以下內容。

1.1 軟錯誤分析的故障注入

硬件模擬方法通過在機器代碼級別使用硬件模擬器產生單粒子翻轉,可以在系統架構級別輕松注入故障,例如內存和寄存器。研究人員采用了照射硬件的方法使存儲器單元在運行過程中引發位翻轉。Karlsson等[4]提出了一種通過使用來自acallfbtnhun-252源的重離子輻射將瞬態故障注入到集成芯片電路的方法。該方法模擬軟錯誤的基本原理實現了硬件單粒子翻轉。這種方法的缺點顯而易見,它們通常是無法控制且高成本的。另外,該方法可能會破壞目標系統。

基于軟件的故障注入技術是修改目標系統運行的硬件狀態,分析在硬件故障發生時系統的運行情況。Guan等[5]設計并實現了軟錯誤故障注入框架SEFI,這是一種分析軟件對軟錯誤敏感性的工具。在不改變其他程序或共享VM的操作系統的情況下,可以通過使用開源虛擬機和處理器仿真器(QEMU)成功地實現在目標程序的邏輯操作中注入軟錯誤。但是該方法不支持對特定的寄存器和存儲器進行故障注入。

1.2 基于動態二進制插裝的故障注入

目前,比較流行的故障注入技術是動態地模擬應用程序二進制文件中的軟錯誤。王承松[6]提出了一個名為BIFIT的故障注入工具,它基于二進制檢測來模擬位翻轉。BIFIT能夠在任何指定的位置注入錯誤,如應用程序的全局或堆棧數據對象等。但是不支持對寄存器的注入操作,需要進一步的改進。Li等[7]開發了一種新的故障注入工具FIT-grind,它使用了Valgrind提供的動態二進制插裝。該工具從底層硬件架構進行抽象,并將故障注入到Valgrind提供的人工架構中。但是其不支持軟件在動態運行過程中的注入操作,所以需要增強故障注入的靈活性。

2 故障模型和動態二進制檢測框架

2.1 故障模型

本文主要考慮針對處理器和存儲器單元發生的單粒子翻轉錯誤。該錯誤一般是由外部環境輻射引起的。通常每個應用程序運行過程中僅產生一個bit位的翻轉錯誤,根據研究表明,在短時間內產生多位翻轉的概率非常低。在選擇注入故障的指令時,采用隨機均勻分布。例如,如果應用程序選擇與插裝條件匹配的N條指令,則指令注入故障的概率為1/N。由于寄存器值和存儲器單元內容具有多個位,因此采用隨機均勻分布的方法選擇翻轉故障的位[8]。

依據軟錯誤模擬的相關研究,將實驗結果分為以下幾類,具體定義內容如下。

定義1良性故障——故障注入的程序輸出與原始執行結果相同。其主要原因是可以通過后續的程序計算來覆蓋故障數據。因此,故障不會擴散到應用程序中,也不會影響其運行結果。

定義2硬件異?!捎诠收献⑷胍鸬挠布葳寤虍惓?,軟錯誤可能會導致應用程序崩潰。

定義3內存捕獲——注入的錯誤被內置檢測機制捕獲。

定義4靜默數據損壞(SDC)——故障注入程序的輸出與原始程序成功執行后的結果不一致,通常被認為是危險故障,因為它們在程序執行期間無法被檢測到,但確實會影響其結果。

定義5應用程序掛起(“超時”)——如果應用程序沒有在規定的時間內終止,則定義為超時。通常在不執行故障注入的情況下運行程序以獲得基準時間[9]。

2.2 PIN

PIN是由英特爾設計的程序分析框架,它在執行Linux應用程序過程中進行二進制插裝,具有可移植性、透明性、高效率和健壯性,采用C/C++編程實現,提供了一個支持多種體系結構的插裝平臺,實現了一種程序分析器和故障注入器[10]。PIN配備了豐富的API,抽象出架構的具體細節,可以編寫便攜式插裝工具。PIN采用即時(JIT)編譯的方法插入和優化代碼,提供了一種高效的檢測機制,該檢測機制可以在程序運行過程中探測代碼,從而使得PIN比靜態檢測或代碼修補的系統工具更強大。

3 軟錯誤故障注入器

軟錯誤故障注入器是一種基于二進制檢測的故障注入工具,可在機器代碼級注入硬件故障。該注入器使用PIN(動態二進制插裝和分析工具)模擬存儲器和各種寄存器中的單粒子翻轉。故障注入的目標是可執行的二進制程序,可以在沒有源代碼的情況下模擬軟錯誤,其故障注入方法不受編程語言的影響[11]。

3.1 軟錯誤故障注入器概述

圖1給出了故障注入器的架構設計,主要由三個模塊組成:控制器、監視器和故障注入模塊。使用動態檢測工具可以在應用程序執行期間將故障注入到存儲器和寄存器的隨機位置。為了提高插裝性能,設計并開發了一個收集指令信息的監視器。為了協調預處理和插裝功能,采用了基于Python腳本的控制器??刂破鞑粌H僅是提供給用戶直接使用的組件,而且還是整個故障注入過程的控制器。在控制器的協同下,注入器使用預處理的指令信息執行故障注入操作;故障注入模塊負責軟錯誤的模擬與實現。圖2為故障注入過程,其整個過程如下:

1) 用戶控制器,該控制器通過界面的方式提供給用戶,配置實驗的相關參數信息。

2) 控制器激活目標系統和監視器并執行。監視器獲取有關故障注入點的相關數據。故障注入點為程序監視模式下的具體實例,故障信息被傳遞到故障注入器中,注入器激活故障并注入到與控制器相連的進程中。

3) 故障注入器啟動后,將故障注入到二進制程序中。故障注入產生的數據傳遞給控制器,然后存儲在文件中以供離線分析。在注入操作完成并且從目標系統收集了所有數據之后,控制器退出實驗并關閉監視器。

圖1 故障注入器架構設計

圖2 故障注入過程

3.2 監視器

監視器是故障注入器的一個模塊,用于判斷在測試過程中注入軟件故障的位置。該模塊能夠收集所有可能的故障信息以及相關的故障模式,并為故障注入器提供該信息。在注入操作之前監視器獲取了指令的詳細信息進而加速故障注入過程。應用程序的分析過程不會影響程序對故障注入的響應。事實上,監視器為所有可能的故障位置提供了特定插裝操作的相關故障模式??刂破鲉涌蓤绦谐绦蚝捅O視器。后者識別某些指令模式并將分析信息存儲到文件中作為故障注入點。當應用程序到達指定的執行點并匹配輸入的分析信息時,故障注入模塊立即注入故障以模擬bit位翻轉。故障注入操作將使不相關的代碼快速運行。通過在指定的故障注入執行點之前注入故障和插裝,可以精確地提高插裝性能。

3.3 控制器

控制器為用戶與故障注入器之間的接口,通過用戶配置實現故障注入操作。采用Python腳本的方式實現控制器信息配置,故障支持多次注入,用戶可以靈活地設計各種故障實例集??刂破鲗⒂脩粼O置的參數傳遞給監視器,并協調監視器和故障注入模塊之間的工作。

控制器負責收集故障注入操作產生的相關數據,包括應用狀態、執行輸出和故障注入信息。此外,如果應用程序運行很長時間,控制腳本將中止應用程序執行。如果執行時間超過設定值,故障注入器將可執行程序狀態定義為超時。根據之前的故障注入研究成果,超時時間系數設置為10,表示故障注入下目標應用程序的執行時間比無錯誤執行時間延長了10倍。

3.4 故障注入模塊

故障注入模塊是整個系統的關鍵模塊。通過監視器和控制器的協調,故障注入器可以在任何執行位置產生位翻轉錯誤。故障注入模塊應能夠識別故障注入點,通過PIN的API識別與用戶配置匹配的特定故障模式。PIN提供了一種通過允許分析例程覆蓋應用程序寄存器和應用程序內存來修改程序行為的方法,這種機制可以模擬寄存器和存儲器的位翻轉。對于寄存器,可以通過確定操作數是否帶PIN助手的寄存器來選擇限定指令,同時,可以指定寄存器的類型,包括數據寄存器、標志寄存器等。對于存儲器借助PIN的功能接口判斷是否進行加載或存儲操作[12]。

4 實驗與結果分析

4.1 典型應用程序的選取

實驗所選應用程序代表了典型的應用程序。本文中使用的目標應用程序主要包括:

1) 多線程程序應用。多線程協同工作,共享存儲資源,線程之間通過鎖控制不同順序的執行過程。要求訪問全局存儲線程安全的工具或手段能夠與其他線程協調。

2) 預測算法?;诰€性關系數據的算法,通過讀寫存儲器完成數據的訪問,通過寄存器保存中間過程,完成復雜的預測式計算。

3) 浮點計算。通過浮點寄存器傳遞參數,完成浮點計算,輸出計算結果到其他應用。

4.2 實驗方法

本節主要介紹了故障注入實驗的結果。實驗環境的操作系統是Linux(x64),在該環境中下載PIN 3.7并進行二次開發以實現功能擴展。在選擇注入故障的模式時,采用隨機均勻分布的方法。

通過實驗評估軟錯誤對應用程序執行時間和應用程序輸出結果的影響。為了評估故障注入對執行時間的影響,定義了三個執行時間。T0為最初的程序執行時間,作為基準時間;T1為故障注入后的執行時間;T2為在沒有故障注入但是使用插裝的情況下的執行時間。將故障注入的性能影響定義為P。其計算公式如下:

P=(T1-T2)/T0

對于故障注入操作,根據監視器的指令信息隨機選擇800條指令,選擇一個隨機均勻分布的指令來隨機翻轉。對于每個應用程序,模擬寄存器和存儲器的單粒子翻轉,分別執行三次故障注入,觀察整個故障注入期間應用程序的執行時間,并評估軟錯誤對其性能的影響。

4.3 實驗結果

在同一應用程序的不同位置注入故障會對執行時間產生不同的影響。圖3顯示了軟錯誤對多線程應用程序執行時間的影響,同時可以看到寄存器故障注入下的執行時間明顯長于內存故障注入時的執行時間,這說明應用程序的寄存器單元對軟錯誤故障特別敏感。

圖3 多線程應用程序的擴展執行時間

圖4說明了在預測算法應用程序中,寄存器故障的執行時間明顯比存儲器的執行時間延長,這表明應用程序的寄存器故障對軟錯誤故障響應明顯。而在寄存器故障方面性能損耗較小。圖5說明了內存故障的浮點計算應用程序的執行時間比寄存器故障的應用程序執行時間更為敏感。

圖4 預測算法應用程序的擴展執行時間

圖5 浮點計算應用程序的擴展執行時間

實驗結果表明,應用程序執行時間對軟錯誤非常敏感。此外,還可以得出結論,寄存器中的軟錯誤對性能的影響更大,因為寄存器錯誤注入會顯著延長執行時間。在預測算法應用程序中,可以看到執行時間增加了幾倍,這表明寄存器中的數據一旦被破壞,就會導致算法收斂達到預期精度的時間延長。同時在某些情況下,可以觀察到執行時間的增加取決于某些特殊的故障注入點。

圖6和圖7分別比較了三個目標應用程序之間的故障注入結果對性能的影響,通過結果可以看出預測算法應用程序最容易受到軟錯誤對程序性能的影響。這主要可能是預測算法需要通過計算收斂到預期的精度,從而導致預測的時間增加。

圖6 寄存器故障注入執行時間

圖7 存儲器故障注入執行時間

圖8和圖9分別給出了目標應用程序的寄存器和存儲器的故障注入結果,錯誤行為也因不同的應用程序而不同。從圖9中可以看到寄存器故障的浮點計算應用成功率高于其他應用,統計上證明了該應用對寄存器故障不敏感。內存捕獲僅在多線程應用程序上發生,因為它在此應用程序上有自己的檢測機制。無論是在寄存器還是在內存中,類型SDC錯誤在預測算法應用程序中比在其他應用程序中更為常見,這表明此類故障對應用程序的輸出具有更大影響。良性故障的成功率在浮點計算中比在其他應用程序中更為常見;硬件異常在多線程應用中比在其他應用程序中更為常見;超時在預測算法中比在其他應用程序中更為常見。通過評估軟錯誤對應用程序的影響,本文發現如果應用程序對組件敏感,應用程序執行時間和應用程序輸出幾乎會同時受到影響。

圖8 存儲器故障注入結果統計

圖9 寄存器故障注入結果統計

4.4 軟錯誤結果分析

根據4.3節中的實驗結果,分析故障注入器的實驗結果。如圖3所示,可以看出寄存器故障注入下的應用程序其執行時間明顯長于內存故障浮點計算應用程序。為了探究軟錯誤對各種寄存器的影響,將故障分別注入通用寄存器,臨時寄存器和標志寄存器,以分析故障注入對特定寄存器的影響。

每個故障注入都針對以下三種寄存器之一:

1) 1x86-64 ISA中的16個64位通用寄存器(RAX,RBX,RCX,RDX,RDI,RSI,RSP,RBP,R8,R9,R10,R11,R12,R13,R14,R15)。

2) 一個64位標志寄存器。

3) 32個64位臨時寄存器,代表寄存器的高位或低位。

圖10顯示了多線程應用中的故障注入崩潰率。臨時寄存器只延長執行時間,不會產生崩潰。R8寄存器和R15寄存器的影響很小,因為它們很少使用。由此可以得出結論,在堆棧指針寄存器中注入的故障大大增加了該實驗中程序的崩潰率。

圖10 多線程應用程序寄存器故障崩潰率

根據4.3節中的結果,進一步研究注入故障后的程序產生不同行為的原因。注入的故障通常從硬件傳播到軟件級別,然后破壞各種程序狀態和行為。

故障注入類型分為三種:

1) 控制方式注入:如果將故障注入用于條件分支的寄存器,則定義為控制故障。在這種情況下,故障注入器將故障直接注入到條件分支中的條件標志。

2) 地址方式注入:如果故障被注入到影響加載或存儲操作中的存儲器地址的寄存器中,則將其作為地址故障。

3) 數據方式注入:這種類型的故障通常涉及整數算術指令、浮點計算、寄存器之間的數據移動、邏輯指令等。從后續程序的運行結果分析,在軟錯誤傳播之后,數據故障將轉變為地址故障或控制故障。

從圖11中可以看出,在多線程應用中,地址方式注入的故障率高于其他類型,這說明在內存操作階段注入故障時可能會導致程序中止。此外,可以得出結論,當在預測算法的數值計算階段中注入故障時,可能會導致應用程序的執行時間增加。由于算法結構和數據規模的原因,故障注入下不同程序的執行時間和輸出變化很大。

圖11 不同故障類型注入結果

5 結 語

本文設計一種軟錯誤的故障注入器,用于模擬機器級代碼的軟錯誤,主要基于英特爾的動態插裝和分析框架PIN。該注入器能夠模擬寄存器和存儲器中的單bit錯誤。為了提高插裝性能,設計并實現了監視和控制腳本。此外,將該注入器應用于典型的應用程序,并運行數百次故障注入實驗以評估其對程序執行時間和程序輸出的影響。

實驗結果表明,典型應用程序的軟錯誤對性能和精度敏感。故障注入的位置不同,會對應用程序產生不同的影響,基于應用程序固有的算法特性和計算規模的不同,其對軟錯誤響應也不同。

下一步的工作是開發一個完全集成的故障注入環境,該環境可以在各種操作系統下使用。此外,還要進一步改進支持的故障類型,以便將來在實際系統上進行應用。

猜你喜歡
寄存器存儲器應用程序
靜態隨機存儲器在軌自檢算法
刪除Win10中自帶的應用程序
谷歌禁止加密貨幣應用程序
飛思卡爾單片機脈寬調制模塊用法研究
移位寄存器及算術運算應用
數字電路環境下汽車控制電路信號設計
存儲器——安格爾(墨西哥)▲
三星電子將開設應用程序下載商店
微軟軟件商店開始接受應用程序
Buffalo推出四硬盤網絡存儲器 主打Soho一族
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合