?

利用隨機森林的單粒子翻轉軟件故障注入方法

2021-11-22 08:03曹子寧
小型微型計算機系統 2021年11期
關鍵詞:寄存器數據流指令

程 義,莊 毅,曹子寧

(南京航空航天大學 計算機科學與技術學院,南京 211106)

1 引 言

隨著嵌入式應用程序領域內技術的迅速發展,計算機應用程序在復雜性和規模都在不斷增長.同時,嚴格的功率限制和元器件冗余的減少促使半導體行業從業者在設計集成電路時繼續精簡結構降低電壓.這種趨勢一方面使硬件元器件高度集成化,另一方面提高了其對外部硬件故障的敏感性,如輻射效應或電磁干擾等[1]引發的硬件故障.這對嵌入式系統的設計和開發提出了新的挑戰.

航空航天領域的工作環境中存在著大量的高能粒子,這些高能粒子會引發一系列的單粒子效應,影響相關計算機設備的正常運行.單粒子效應(Single Event Effect)是指高能帶電粒子穿過微電子器件的靈敏結構時,造成器件邏輯狀態的非正常改變或器件損壞的現象[2].單粒子翻轉是高能帶電粒子使元器件的邏輯狀態發生翻轉的一種單粒子效應[3].

為了提高嵌入式系統的可靠性,在設計時就需要對系統中潛在故障進行分析并采取一系列手段對相應的故障進行檢測、恢復或補償.隨機或永久性的硬件故障都會對系統運行的各個層面產生不同的影響.相較于永久性的硬件故障,計算機硬件的瞬時故障存在時間和空間的隨機性和不可預測性.這使得該類瞬時故障問題更加難以應對,并提高了應對瞬時故障能力在設計可靠性系統時的重要性.故障注入技術是現行可靠性評估技術的主要方法之一,被廣泛應用在各個領域[4-6].相關安全標準(如ISO 26262[7])也強烈建議在驗證嵌入式系統的可靠性時應用故障注入技術.主流的故障注入技術按照所注入故障的方式分為硬件故障注入和軟件故障注入兩類[8].硬件故障注入技術存在成本高、自動化水平低等缺陷;而軟件故障注入技術,不僅可以較好地模擬硬件故障,而且可以對應用程序產生直接影響,更受到研究者與開發人員的青睞.

故障按照對應用程序產生的影響分為:控制流錯誤和數據流錯誤兩大類[5].目前這兩種故障的軟件注入技術都得到了長足研究和廣泛應用.但是同時兼顧控制流錯誤和數據流錯誤的軟件故障注入研究和工具較少.另一方面傳統的故障注入工具注入故障的方案較為簡單,一般是僅在某條指令處隨機的注入單粒子翻轉故障[2,9,10].事實上這些注入的故障不一定能引發程序的控制流錯誤和數據流錯誤,有些甚至屬于無效故障,即故障注入前后程序運行和執行結果沒有發生變化.因此設計能夠同時兼顧控制流錯誤和數據流錯誤,且能夠通過智能決策注入有效故障的故障注入工具成為當下亟需探索的研究方向.

本文主要貢獻如下:在通用嵌入式計算機硬件架構的基礎上,討論了主要硬件器件能否產生控制流和數據流錯誤及其對程序運行的影響;并在此基礎上提出了一種基于隨機森林的故障注入方法,設計并且實現了該系統.該系統使用隨機森林方法,根據被注入程序的指令的各項特征,對程序指令各個器件發生單粒子翻轉故障的敏感性預測,生成故障序列,最后在程序運行時根據故障序列,對程序進行自動故障注入.相比已有方法,本文所提出的基于隨機森林的單粒子翻轉模擬軟件故障注入方法具有實施成本低、自動化水平高、故障覆蓋率高、故障有效率高等優點.相關實驗證明了本文所提出方法的有效性和優越性.

2 相關工作

目前程序故障注入的方法主要分為兩大類:硬件故障注入與軟件故障注入.其中軟件故障注入還分為傳統的軟件故障注入和基于機器學習的軟件故障注入.

2.1 硬件故障注入

基于硬件的故障注入方法通常在附加硬件設備的輔助下,將故障注入到系統中[8].這類故障注入的方法往往需要定制的硬件設備,具有實施成本高、設備特異性、耗時時間長、無法自動化、結果難觀察、降低硬件使用壽命等問題.現階段的主要研究工作是通過一些硬件調試設備對硬件設備進行故障注入,或者通過軟件仿真模擬硬件設備的方式來實現自動化故障注入.Zhang等人提出了基于管道的故障注入技術[11],通過該技術可以加快故障注入的流程,從而能夠對基于SRAM的FPGA中發生的單粒子翻轉故障進行模擬.Bhattacharya提出一種基于FPGA的故障仿真技術[12],可在設計的早期階段設計和開發測試資源,驗證測試臺以及互連電路.Khosrowjerdi等人提出了一種虛擬化故障注入方法[13],該方法集成了QEMU、GDB和LBTest,能夠自動化的生成故障并注入到嵌入式系統中.Coelho等人設計了一種名為NETFI-2的故障注入平臺[14],該故障注入平臺能夠在FPGA中模擬單粒子翻轉故障并注入到集成電路中.Moorthi基于FPGA設計了一套可編程的硬件故障注入框架[15],使用該框架可以將模擬生成單粒子翻轉故障,并將該故障注入到指定的元器件.這些硬件故障注入方法可以較好的模擬單粒子翻轉故障現場,但是存在故障注入方案泛化性差、實施成本高和單次故障注入開銷大等缺點.

2.2 傳統的軟件故障注入

除了用物理手段進行故障注入的方法,基于軟件的故障注入技術也是一類常見的故障注入技術.軟件故障注入通過特定的程序對系統軟件、硬件錯誤狀態進行仿真[16].較之硬件故障注入方法,軟件方法具有實施成本低、能夠針對特定的程序、易于觀察故障注入效果、可以對注入故障進行追蹤、可特定針對控制流或者數據流錯誤進行故障注入、故障注入開銷小的特點.現有的研究工作一般針對數據流或者控制流錯誤,來研究發生相應故障對程序的影響,進而提出了相應故障的容錯算法.如Porpodas設計了一種基于時序的故障注入工具ZOFI[17],這種故障注入工具能夠模擬發生在寄存器上的瞬態故障并注入.Ahmad等設計了一種純軟件的故障注入技術LDSFI[18],該技術可以在程序運行時自動的將單粒子翻轉故障注入到二進制代碼中.Osinski等人通過考慮微體系結構和應用程序級別的單個故障的假設[19],討論分析了不同策略下注入控制流錯誤以及相應的差異.Zhang等人基于LLFI設計了一種模擬分析瞬時故障的方法[20],并使用該方法研究了指令SDC脆弱性.這些軟件故障注入方法在故障注入時一般采用隨機的方式,極易注入無效故障.并且這些故障注入方法由于使用的場景僅限于數據流或者控制流錯誤,存在泛用性較差等問題.

2.3 基于機器學習的軟件故障注入

為了減少軟件故障注入的成本和增加故障注入技術的泛用性,一些機器學習算法被運用到了軟件故障注入技術中.如Yang等人基于SVM提出了PVInsiden[21],該技術使用SVM來識別指令是否是易導致數據靜默錯誤(Silent Data Corruption,SDC)的指令,但是這種方案仍然只適用于數據流錯誤,對控制流錯誤無效.Jha等人提出了一種基于機器學習的故障注入引擎DriverFI[22],能夠挖掘自動駕駛汽車的影音系統的安全性和故障.該引擎主要針對內存中的單粒子翻轉引發的數據流錯誤,不能注入CPU中器件的單粒子翻轉故障和一些控制流錯誤.

2.4 小結

綜上所述,基于硬件故障注入方法雖然具有貼近單粒子翻轉現場優點,但存在成本高,注入位置隨機、不能指定程序進行故障注入,難以觀察故障注入的結果、易對硬件造成損壞等問題.傳統的基于軟件的故障注入方法存在注入故障的有效性難以保證,并且只針對控制流錯誤或數據流錯誤,存在故障覆蓋率低等問題.但是基于軟件的故障注入技術實施成本低,能夠指定注入故障的程序,還具有易于追蹤注入的故障、觀察注入故障的結果等優點.而基于機器學習的故障注入技術能夠有效的對故障空間進行剪枝,增加注入故障的有效性,但是目前缺少能夠同時兼顧數據流和控制流的故障注入技術.本文在使用傳統的故障注入技術注入形成的原始故障集的基礎上,使用隨機森林算法生成指令脆弱性預測模型,使用該模型能夠預測程序指令對各個部件單粒子翻轉的脆弱性;進而在此基礎上形成被注入故障程序的故障序列,即故障注入時在指令對應的故障序列中選取較為脆弱的故障進行故障注入,提高故障注入的有效性.

3 單粒子翻轉故障

硬件級別的單粒子翻轉故障會影響程序行為,例如內存或者寄存器中的數據錯誤會影響程序的控制流和數據流錯誤.分析計算機的體系結構,單粒子翻轉故障可以在系統中的任何抽象層次傳播.星載、機載等嵌入式計算機的硬件架構如圖1[23]所示.

圖1 星載嵌入式計算機通用系統架構

單粒子翻轉故障主要發生在處理器和存儲部件或者非標準的設備(如搖桿、打印機)中[5],其他的硬件器件發生單粒子翻轉的概率較低.其他部件的單粒子故障最終都可以映射為處理器和內存中的單粒子翻轉故障.按照故障發生的硬件位置,單粒子翻轉故障可以分為處理器故障、存儲器故障等.其中處理器故障又可以劃分為寄存器和運算單元故障,而存儲故障又可以分為內存故障和外存故障.表1總結并描述了硬件故障類型,并列舉了對應的數據/控制流錯誤類型.由于大部分外部設備通過總線傳輸數據,因此將這些外部設備的故障歸類為總線錯誤.從表1中我們不難看出指令譯碼器、內存、外存中同時存在控制流錯誤和數據流錯誤.

表1 硬件故障類型

指令譯碼器負責將復雜的機器語言指令解譯成運算邏輯單元(ALU)和寄存器能夠理解的格式即相應的電氣信號.因此當指令譯碼器中發生單粒子翻轉故障時,可能導致非跳轉指令翻轉為跳轉指令,繼而引起程序跳出正常的執行順序,表現為控制流錯誤;當指令譯碼器遇到跳轉指令,跳轉的目的地址因為位翻轉而程序跳出正常的執行順序,也表現為控制流錯誤.一般以上兩種情況較為少見,發生在該元件中的更多的是數據流錯誤.

發生在內存中控制流錯誤主要是發生在代碼區.與指令譯碼器中的類似,出現非跳轉指令翻轉為跳轉指令和跳轉指令的目的地址發生翻轉,而表現出的控制流錯誤.該類錯誤屬于瞬態錯誤,當重新讀入程序時,即可糾正該類錯誤.外存中控制流錯誤出現的原因與內存中出現的原因一致.此外發生在內存和外存中的位翻轉而導致的程序故障是持續性的,這種持續性體現在內存和外存中的單粒子翻轉故障不像是指令寄存器、指令譯碼器中的故障屬于“一次性”的:指令寄存器、指令譯碼器中的單粒子翻轉不會影響到下次執行本條指令.但是內存和外存中的單粒子翻轉故障下次執行同樣的指令,相同的故障仍會發生.這是因為內外存中保存的指令一旦發生單粒子翻轉,程序執行時在取指令階段讀取到的指令都是翻轉后的指令.這種持續性的故障可以通過重新載入/編譯程序來解決.

下面以圖2中的匯編代碼為例,分析各個硬件設備可能導致的數據流錯誤:1)若在指令寄存器保存指令2時發生單粒子翻轉,翻轉后的機器碼為:8b 45 fb,則對應的匯編代碼為:mov-0x5(%rbp),%eax,則寄存器eax中的數據保存向錯誤的內存地址,發生數據流錯誤;2)指令譯碼器發生數據流錯誤的情形和指令寄存器類似,但是故障發生在指令譯碼時,指令譯碼器的單粒子翻轉故障可以等效為指令寄存器中的指令在同位置發生單粒子翻轉故障;3)操作控制器主要負責決策寄存器之間建立數據通路的任務,若在執行指令1時發生單粒子翻轉,本該保存到寄存器edx中的數據保存到其他寄存器中,則會影響到指令3的執行結果造成數據流錯誤,可以等效為指令寄存器中的指令在同一位置發生單粒子翻轉故障;4)若執行指令2時,CPU中的寄存器edx發生單粒子翻轉故障導致數據流錯誤,會對指令3執行的數據結果為錯誤結果;5)邏輯運算單元、總線單元、數據高速緩存中發生單粒子翻轉故障,都是通過寄存器簡介造成數據流錯誤,他們中數據的來源和去向都是寄存器,一般可以視為寄存器單粒子翻轉故障;6)指令4屬于訪存指令,通過變址寄存器rbp和偏移地址-0x14訪問內存,并將內存中的數據存儲到寄存器eax中,若執行指令4時,要訪問的內存發生單粒子翻轉故障,則存儲到寄存器eax中的數據就出現錯誤,導致數據流錯誤;7)外存中的單粒子翻轉故障更多的是影響保存在外存中的程序,如1)指令2翻轉為8b 45 fb,也會造成數據流錯誤,可以視為程序載入內存時發生在內存中的單粒子翻轉故障.

圖2 x86-64匯編代碼示例

下面分析圖2中可能發生的控制流錯誤:1)程序計數器中保存的當前執行指令的下一個指令,如執行指令1時,此時程序計數器中的內容應為:0x1004010b0,即為指令2的內存地址,若程序計數器發生單粒子翻轉故障,使得程序計數器中的內容翻轉為0x1004010b3,則執行完指令1后程序執行指令3,程序出現控制流錯誤;2)指令寄存器、指令譯碼器發生控制流錯誤,通常是單粒子翻轉故障發生在跳轉指令使得跳轉指令變為其他指令,或者更改程序跳轉的目的地址,使得程序發生控制流錯誤,比如指令9發生單粒子翻轉故障je指令變成jne指令或者跳轉的目的地址變為0x1004010ae,可以等效為指令寄存器中的指令在同位置發生單粒子翻轉故障;3)內存、外存中的控制流錯誤與指令寄存器、指令譯碼器類似,都是由于位翻轉瞬時故障發生在跳轉指令或者更改目的地址時,使得程序發生控制流錯誤.

從上面可以看出各類硬件的單粒子翻轉故障都可以等效的看作寄存器單粒子翻轉故障和內存單粒子翻轉故障;并且同一指令發生單粒子翻轉的硬件器件不同,發生在同一硬件器件上翻轉的位置不同對程序造成的影響也不同;同時單粒子翻轉故障注入時需要的參數為翻轉的部件和翻轉的位置.因此在設計故障注入系統的故障注入決策時,必須掌握被注入故障的指令對器件發生單粒子翻轉故障和翻轉位置的敏感性,以及被注入故障的指令發生數據流/控制流錯誤與注入故障器件和翻轉位置的相關性,以達到單粒子翻轉故障的高效注入.

4 指令單粒子翻轉脆弱性特征提取

從第3節可知在某些指令處注入寄存器單粒子翻轉故障不會引發程序故障,有些指令對注入的內存單粒子翻轉故障不敏感.因此研究指令單粒子翻轉脆弱性,是提高故障注入有效性的關鍵.為了研究指令對器件發生單粒子翻轉故障和翻轉位置的敏感性,以及被注入故障的指令發生數據流/控制流錯誤與注入故障器件和翻轉位置的相關性,我們定義指令單粒子翻轉的脆弱性為發生單粒子翻轉后導致程序發生故障的概率,指令數據流脆弱性為發生單粒子翻轉后導致程序發生數據流錯誤的概率,指令控制流脆弱性為發生單粒子翻轉后導致程序發生控制流錯誤的概率.為了注入故障的有效性,必須在故障注入時根據注入故障的類別(數據流錯誤、控制流錯誤和兩者兼有之的故障),在相應的脆弱性中選擇最高的故障選擇注入.下面對影響程序的脆弱性的指令特征進行分析,為指令脆弱性的預測提供依據.

4.1 寄存器單粒子翻轉脆弱性特征

本節討論發生在寄存器上的單粒子翻轉.指令的單粒子翻轉脆弱性與下面幾個因素有關:1)指令類型;2)指令操作數個數;3)寄存器類型.首先指令類型與指令單粒子翻轉的數據流/控制流脆弱性相關,在保持其他條件不變的情況下執行周期長的指令容易發生單粒子翻轉,從而引發程序發生數據流/控制流錯誤.跳轉指令與其他指令相比更不容易發生數據流錯誤,這是因為跳轉指令不使用數據寄存器,所以跳轉指令對通用寄存器中的單粒子翻轉瞬時故障有天然的屏蔽作用;其次指令操作數的個數與指令單粒子翻轉的數據流脆弱性相關,在保持其他變量不變的情況下,操作數數量越多單粒子翻轉命中使用的寄存器的概率越高.最后,發生單粒子翻轉的寄存器類型與指令的數據流/控制流脆弱性相關.在保持其他條件不變的情況下,顯然程序計數器發生單粒子翻轉故障時必然會導致控制流錯誤.而指令寄存器較大概率導致控制流錯誤.而一些通用寄存器由于使用頻率較低,即使發生單粒子翻轉,也不一定會導致程序發生故障.

4.2 內存單粒子翻轉脆弱性特征

本節討論了發生在內存中的單粒子翻轉.指令的單粒子翻轉脆弱性與下面幾個因素有關:1)指令在程序執行序列中的位置;2)發生單粒子翻轉的內存地址.

指令有效故障空間是指:程序在執行到對應指令時發生單粒子翻轉會導致程序故障的內存地址范圍.執行到某些指令時,部分內存單元在本程序結束前都不會再使用,所以這片地址空間發生的單粒子翻轉故障不會引起程序故障.程序執行序列中不同指令有效故障空間不同;發生在數據區、堆棧區的單粒子翻轉故障只會導致程序出現數據流錯誤;代碼區的單粒子翻轉故障,僅在操作碼由非跳轉指令翻轉轉為跳轉指令或跳轉指令翻轉為非跳轉指令時才會造成控制流錯誤.而指令操作碼在一個指令中占比較小,因此發生在代碼區的單粒子翻轉在多數情況下仍屬于數據流錯誤.

5 基于隨機森林的故障注入框架

基于上述影響指令數據流/控制流的脆弱性的特征分析,本文提出了基于隨機森林的故障注入的基于隨機森林的故障注入框架.本文設計的基于隨機森林的故障注入框架整體流程如圖3所示.包含指令脆弱性預測模型建立、故障序列生成和故障注入3個部分.下面對3個部分分別進行介紹.

圖3 基于隨機森林的故障注入

5.1 指令脆弱性預測模型

要使用隨機森林算法對指令的脆弱性進行預測,需要收集相關的特征和對應的結果從而形成數據集.

首先使用傳統的故障注入程序針對目標程序注入故障,然后收集故障結果和注入故障時執行指令的相關特征,形成數據集;然后將數據集分為訓練集和測試集,使用訓練集建立基于隨機森林算法的故障注入指令脆弱性預測模型.隨機森林算法具有精度高、抗過擬合能力強、屬于非線性模型等優點[24],本文采用隨機森林算法來訓練得出指令脆弱性預測模型.

隨機森林算法是由Breiman等提出的[24],隨機森林是一種結構簡單的組合型分類算法,使用隨機的方式從多個分類回歸樹中構建分類模型,并且分類回歸樹之間沒有關聯.本文采用隨機森林算法來生成指令脆弱性預測模型.

5.2 生成故障序列

首先從被注入故障的程序中提取指令序列,然后對提取出的指令序列中的每一個指令提取相應的指令特征,將提取的指令特征輸入到上一步中得到的基于隨機森林的指令脆弱性分類器中,從而預測處指令對發生在寄存器和內存上的單粒子翻轉故障的脆弱性,最后根據每條指令對寄存器和內存中的單粒子翻轉故障的脆弱性形成故障序列.故障序列由3個寄存器和1個地址范圍構成,其中3個寄存器是使用隨機森林預測出的指令寄存器單粒子翻轉脆弱性最高的3個相關寄存器,地址范圍是使用隨機森林預測出的指令故障空間.與圖2中的指令序列對應的故障序列如表2所示.

表2 指令(圖2)對應的故障序列

5.3 故障注入

故障注入的步驟如下:

步驟1.提取被注入故障程序的指令序列;

步驟2.使用指令脆弱性預測模型預測出指令序列中的每一條指令的故障序列;

步驟3.根據用戶設定的單粒子翻轉故障的數量,從指令序列中隨機選取對應數量的指令;

步驟4.使用gdb運行被注入故障的程序,在選定的注入故障的指令處插入斷點,當程序運行到插入的斷點時,根據斷點所在的指令位置查詢故障序列,得到該指令處的單粒子翻轉故障敏感寄存器和有效故障空間.

學生在語文學習中的障礙主要是由于缺乏對所學內容了解不夠而沒有產生學習興趣?,F在我們可以用多媒體幫助學生由抽象變為具體,加上教師恰到好處的點撥講解使學生更容易理解和把握所學內容。

步驟5.根據工作模式選擇故障注入的方式:若處于自動故障注入故障模式中時,從單粒子翻轉故障敏感寄存器或有效故障空間中隨機選取一個注入單粒子翻轉故障;若故障注入程序處于手動控制模式,則提供該指令處的單粒子翻轉故障敏感寄存器和有效故障空間.

6 實驗與分析

為了驗證本文提出的基于隨機森林的故障注入方法的有效性,本文進行了相關實驗.實驗的硬件環境:CPU為i5-3470,內存為8G;使用的操作系統為Ubuntu-16.04.1 i686,Linux內核版本為4.15.0-106,編譯器使用的是gcc-5.4.0.為了收集訓練數據和測試的數據集,本文從GitHub上爬取72個使用C語言編寫的程序,這些程序的類型包括b-tree、bfs、dijksra和fibonacci等49種類型,然后使用gcc 編譯作為被故障注入的程序,然后針對寄存器故障和內存故障分別進行了故障注入實驗.

6.1 寄存器單粒子翻轉故障注入實驗

本部分的實驗首先收集被注入寄存器單粒子翻轉故障程序的所有可能執行的指令序列和計算機所有的寄存器.為了減少故障之間的影響,假設程序一次執行僅發生一次單粒子翻轉故障,即僅在一條指令處注入一個寄存器單粒子翻轉故障.按照程序指令的執行序列和寄存器列表依次注入故障.圖4給出了4種注入方法故障有效率的箱線圖,故障有效率為注入故障后引發程序出現數據流/控制流錯誤的故障注入次數占總故障注入次數的比率.圖5給出了控制流注入和基于隨機森林注入故障覆蓋率的箱線圖,故障覆蓋率為注入有效故障占程序所有有效故障中的比.

圖4 4種注入故障有效率

圖4中可以看到隨機注入故障的有效率在40%以下,僅有兩個程序故障有效率超過40%,72個程序的平均故障率為28.90%.即采用隨機故障注入的方式,故障注入的有效率不到30%,使用隨機注入的方式注入故障的有效率低于三分之一.數據流注入故障的有效率和隨機故障注入有效率略低于隨機注入,平均故障有效率為23.57%,數據流注入由于指令的覆寫作用而導致故障有效率低.而本文提出的基于隨機森林的故障注入方法,是將上述故障注入的結果隨機選取70%作為訓練數據集,30%作為測試數據集,使用訓練數據集訓練指令寄存器故障預測器,然后使用測試數據測試訓練的效果.而基于隨機森林的故障注入方法在測試集中的故障有效率大多數在80%左右,最高為 96%.經過計算,基于隨機森林的故障注入平均故障預測準確率為80.42%.因此與隨機注入的方式相比,使用隨機森林的方法實有效的提高了注入故障的有效率.

從圖4中可知控制流注入故障有效率與本文提出的方法接近;但是控制流注入會極大的降低有效故障的覆蓋率.控制流注入和本文方法的有效故障覆蓋率如圖5所示,控制流注入的有效故障覆蓋率在40%-50%之間,對有效故障的覆蓋率不足,而基于隨機森林的故障覆蓋率均在70%以上,故障覆蓋率分布在75%到90%之間,72個程序的平均故障覆蓋率為82.72%.隨機注入是在指令和寄存的全體集合中隨機選取,所以隨機注入的方式故障覆蓋率為100%;基于隨機森林的注入方式由于使用了隨機森林算法對故障進行預測,不能覆蓋所有的有效故障,所以與隨機注入的方式相比故障覆蓋率有所下降.

圖5 故障覆蓋率箱線圖

6.2 內存單粒子翻轉故障注入實驗

與離散的寄存器不同,一個程序內存既是離散又是連續的,程序內存的離散性體現在:程序不同的部分(動態庫)的內存地址是離散的、程序動態申請的內存是離散的,但是程序模塊內部的地址又是連續的.本文首先將獲取程序各個部分的內存地址范圍,再將它們拼接成一個整體;然后采用定長的方式將內存分成幾個故障注入區,這些故障注入區可以根據內存拼接的方式重新映射到原有的程序部分中.為了避免注入故障之間的影響,并且本問題出的注入方法針對的是單粒子翻轉故障,假設程序中的內存單粒子翻轉故障僅發生在執行某個指令時翻轉內存中的某比特位上.因此,在收集內存單粒子翻轉故障注入數據時,本文按照指令序列和內存故障注入區,采用一次僅在一條指令處中的一個內存故障注入區注入一個單粒子翻轉故障.表3給出了按照0.5kb、0.7kb、0.8kb和1kb的方式劃分故障注入區的平均故障有效率.從表3中不難看出隨著故障區劃分的粒度越來越粗糙,注入故障的有效率迅速降低,最后僅有個位數的有效故障率,也就是說在內存單粒子故障上,使用隨機的故障注入方式故障注入的有效率極低.

表3 不同大小故障注入區的平均故障有效率

基于隨機森林故障注入的實驗使用0.5kb的故障區劃分方式的收集到的數據.隨機選取70%作為訓練數據集,30%作為測試數據集,使用訓練數據集訓練內存單粒子翻轉故障預測器,然后使用測試數據測試訓練的效果.最終基于隨機森林的預測器在測試集上的故障有效率平均為74.52%,有效的提高了內存單粒子翻轉故障注入的有效率.此外,本框架中的內存單粒子翻轉故障注入預測器故障注入的有效率和數據收集時內存故障注入區劃分的細粒度有關,1kb的故障注入區的劃分方式訓練出的預測器有效率僅為10.48%,故障注入的有效率接近隨機注入的故障有效率.

實驗結果表明當劃分的注入故障區域越小時,本文所提出的基于隨機森林的故障注入方法對故障注入的有效率提高的越明顯;當劃分的故障區域越大時,隨機注入的故障有效率和本文的大致相同,使用機器學習算法對故障有效率提高效果不明顯.

7 結 論

針對傳統故障注入方法有效性不足、有些僅注入控制流錯誤和有些僅注入數據流錯誤的問題,本文提出了一種基于隨機森林的故障注入方法,該方法根據基于傳統故障注入方法的獲取程序指令的各項特征和故障注入結果,然后將收集的數據分為訓練數據集和測試數據集,在訓練數據集上使用隨機森林算法訓練出指令脆弱性預測模型,根據該預測模型對被注入程序的各指令不同部件單粒子翻轉故障的脆弱性進行預測,選取每個指令寄存器脆弱性最強的3個故障和有效故障空間形成故障序列,故障注入時從故障序列中選取對應的項中隨機選取一個故障進行注入.最后通過實驗,與傳統的故障注入方法進行對比,分析了該故障注入方法的有效性,該故障注入方法相比同類故障注入方法,可以極大的避免注入不能引起程序故障的無效單粒子翻轉故障,并且與單純的注入數據流錯誤和控制流錯誤的故障注入方法相比,這種方法能夠兼顧兩種故障注入,也可以側重于一種故障,應用更具有泛化性.

猜你喜歡
寄存器數據流指令
優先級驅動的泛化航電網絡實時性能分析
基于抽象匯編指令的惡意軟件家族分類方法
汽車維修數據流基礎(上)
汽車維修數據流基礎(下)
《單一形狀固定循環指令G90車外圓仿真》教案設計
新機研制中總裝裝配指令策劃研究
數據流安全查詢技術綜述
飛思卡爾單片機脈寬調制模塊用法研究
移位寄存器及算術運算應用
數字電路環境下汽車控制電路信號設計
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合