郭 強,伍攀峰,2,許振龍
(1.山東航天電子科學技術研究所,山東 煙臺 264006;2.哈爾濱工業大學 航天學院,哈爾濱 150001)
近年來,隨著國內外航天產業和新興技術的蓬勃發展,衛星功能密度和星上實時性要求日益增長,基于傳統單核處理器設計的星載計算機系統已無法滿足航天器任務需求,多核處理器應用于航天任務已成為了發展的必然[1]。
航天應用的電子產品要考慮空間輻射效應的影響。空間輻射環境中的高能質子、粒子等都有可能使高集成衛星電子系統中的半導體器件在敏感區域產生瞬態脈沖,進一步觸發單粒子翻轉(SEU,single event upsets)事件,導致系統得到錯誤的運行結果以及系統中的其他故障,如掛起和崩潰等[2]。當輻射足夠高時,可能致使存儲器單元、寄存器、鎖存器和觸發器的數據位發生翻轉,從而引起系統錯誤[3]。單粒子效應引發的錯誤類型包括硬錯誤和軟錯誤兩種不同類型的錯誤。隨著集成電路工藝尺寸的持續優化,軟錯誤出現的幾率大幅度提高,已成為航天器設計中的重點研究對象[4]。
就目前的技術而言,傳統的星載計算機一般采用由專門定制的宇航級器件設計而成,宇航級的器件考慮了真空、輻射、原子氧等空間環境適應性和長期工作可靠性,但在性能上普遍落后于同期商用貨架產品(COTS,commercial off-the-shelf),而且價格成本遠遠高于后者。相比于高等級抗輻射加固宇航器件,COTS器件因性能優異、成熟度高、采購成本低廉的特性在國際上已得到充分認可[5]。但COTS器件在芯片設計時沒有進行抗輻射加固設計,應用于空間任務易發生單粒子翻轉,進而對星上電子系統產生影響,需要進行相應的抗SEU容錯[6]。
星上電子系統常用的抗單粒子加固措施有雙機切換、多模冗余、錯誤檢測與糾正(EDAC,error detection and correction)檢驗等方式。文獻[7]針對PowerPC460處理器核原有存儲機制以及糾檢錯加固算法展開研究,實現了對PowerPC460兩種不同糾錯能力的EDAC加固設計;文獻[8]中采用軟硬件結合的方式,設計了一種低成本容錯方法。針對星載計算機硬件采用雙機冷備方案,同時通過現場可編程門陣列(FPGA,field programmable gate array)仲裁處理器狀態,在檢測到異常時進行切機;文獻[9]提出了一種三模冗余設計,采用部組件級冗余,3個CPU進行熱冗余備份,通過FPGA完成仲裁,信息通過高速串行外設接口(SPI,serial peripheral interface)實現信息交互;文獻[10]中在可重構FPGA內部設置獨立工作的三核處理器,通過反熔絲FPGA可對任一處理器進行重構,構成了可修復的三模冗余系統。
盡管硬件層面的加固方式可以有效提高電子系統的可靠性,但也帶來了額外的硬件開銷和資源占用問題。從軟件層面通過犧牲處理器部分性能來提高系統可靠性是另一種行之有效的方法。車輛、航空電子系統中常用鎖步技術來實現雙核處理器抗軟錯誤軟件加固[11-14]。文獻[15]提出了一種擴展的雙核鎖步方法,將執行周期和鎖步周期分離,并引入了"寫歷史表"的概念,降低了系統性能開銷,但需要額外引入監測模塊對兩核計算結果作判斷;文獻[16]發明了一種基于Zynq-7000的雙核ARM處理器抗軟錯誤防護方法,結合基于復算域的雙核互檢方法和基于檢查點的回卷恢復方法,可在雙核處理器核間實現軟錯誤的檢測和恢復,但檢查點設置在每段程序末尾,回卷帶來的系統性能開銷過大。
本文基于雙核鎖步機制,提出了一種多核處理器核間互檢機制,在不引入額外硬件的前提下,將寫命令作為CPU間的同步點,檢查點在寫同步點中選取,僅對系統關鍵數據的改動做記錄,以較小的性能開銷實現了軟錯誤檢測和系統恢復。最后采用軟件故障注入方式對加固前后的處理器抗單粒子翻轉能力進行評估,驗證了該機制抗軟錯誤能力滿足應用的需要。
鎖步技術是一種錯誤檢測機制,常應用于車輛、航空電子系統中,是雙核處理器抗軟錯誤加固設計的重要技術手段。
雙核鎖步系統通常被稱為主從鎖步處理器。冗余處理器稱為從屬,在開機復位(POR,power on reset)時以與主處理器相同的狀態開始,運行相同的指令,接收相同的輸入,并在沒有發生錯誤時在每個時鐘周期中生成相同的輸出。如果主核和從核輸出結果不同,系統會自動丟棄錯誤并重新執行指令。如果嘗試糾正錯誤的次數超過了允許的閾值,則會觸發系統重置。雙核鎖步技術的原理如圖1所示。

圖1 雙核鎖步原理
檢查點(CP,check point)技術是在應用程序的執行過程中,每間隔一段時間將處理器當前正確的狀態以檢查點文件的形式存儲到存儲器中;回卷恢復(RR,rollback recovery)技術是在檢測到系統發生故障后,由處理器從存儲器中讀取最近一次保存的檢查點文件,使處理器恢復至上一個正確狀態并重新執行故障程序,避免在發生故障后,處理器重新開始執行應用程序,從而減少了因故障帶來的計算損失,有效地提高系統的可用性和容錯能力,檢查點和回卷恢復技術的原理如圖2所示[17]。

圖2 檢查點和回卷恢復技術
本文提出的雙核互鎖加固設計是在PowerPC架構中Qorlq系列的一款雙核處理器P2020上設計和實現的,該方法僅需要一些調整就可適用于其他系列處理器,是面向通用型多核處理器的抗軟錯誤加固設計。硬件架構如圖3所示。

圖3 雙核互鎖硬件架構
兩核有各自的cache存儲互鎖機制產生的過程信息,通過共享的L2 cache及ddr3存儲器存儲程序及運行過程中的寄存器、內存數據。本文雙核互鎖機制基于寫操作進行同步,每次寫同步都會進行兩核交互,若彼此計算結果一致則繼續執行程序,否則將系統狀態恢復到最近的檢查點,重新執行部分指令。
DDR3中設置兩級歷史表(WHT,write history table)文件,分別存儲第N個和第N-1個鎖步周期內產生的寫命令,寫同步處更新歷史表0,檢查點處更新歷史表1。當系統檢測到錯誤時,調用回卷中斷,從歷史表中獲取自上一個檢查點起被更改的數據,并進行恢復。

表1 CPU0寫同步應用簽名計算過程
本文雙核互鎖設計基于Vxworks操作系統實現。Vxworks操作系統是美國風河(WindRiver)公司于1983年開發的一種高性能、可裁剪的嵌入式實時操作系統,具有較強的時性和可靠性,廣泛應用在航空、航天、軍事等實時性要求極高的高精尖技術領域中[18-19]。
本文使用Vxworks操作系統搭建非對稱多處理(AMP,asymmetric multiprocessing)工作環境,在兩核中運行相同的程序,通過消息隊列進行兩核交互,使用PowerPC處理器自帶的核間中斷進行檢查點和回卷恢復操作。
在雙核互鎖機制中,兩處理器運行相同的應用程序,基于寫指令進行同步,每N個寫同步設置一個驗證點(VP,verification point)。根據應用程序功能和可靠性要求等因素,合理設置VP的數量和間隔。圖4詳細介紹了CPU0、CPU1的執行概況及互鎖加固流程。

圖4 雙核互鎖加固流程
1)寫同步:CPU0、CPU1執行相同的應用程序,在寫命令處進行同步,交換數據;
2)一致性判斷:CPU寫同步后,將自身數據與來自另一處理器的數據進行比較,比較結果有一致和不一致兩種;
3)WHT0:CPU0的一級寫歷史表,負責存儲第N個檢查點(最近的一次檢查點)后CPU0對關鍵數據的寫命令;
4)WHT0*:CPU1的一級寫歷史表,負責存儲第N個檢查點(最近的一次檢查點)后CPU1對關鍵數據的寫命令;
5)VP:檢查點;
6)WHT1:二級寫歷史表,負責存儲第N-1個檢查點到第N個檢查點(最近的一次檢查點)間處理器對關鍵數據的寫命令,在檢查點處更新。
數據初始化后,兩核并行執行相同應用程序,在執行到寫命令時進行同步。在寫同步處,兩核通過消息隊列進行寫指令交互,然后比較二者的差異,如果對比結果一致,則認為系統中沒有發生故障,更新WHT0、WHT0*;若對比結果不一致,則認為當前系統中發生故障,生成回卷恢復中斷信號,CPU0、CPU1分別響應中斷信號,使系統恢復到上一個驗證點狀態。
執行到驗證點時,若CPU寫同步均判斷一致,則代表連續通過了N個同步點,此時應用程序暫停執行,對比WHT0和WHT0*,若表決一致,兩核生成檢查點中斷信號,調用中斷服務例程獲取WHT0內容,覆蓋WHT1,并清空WHT0、WHT0*,然后繼續執行應用程序。同一時刻,DDR3存儲器中保留有恢復至系統第N個檢查點的WHT0和恢復至第N-1個檢查點的WHT1文件。
處理器調用回卷中斷程序,即寫同步判斷不一致時,CPU0、CPU1從WHT0中獲取第N個檢查點后的所有寫命令,執行回卷恢復操作,從第N個檢查點重新執行該段程序,直到應用程序執行結束。
在本文中,寫操作范圍被定義為:
1)通用寄存器:GPR0-GPR31;
2)特殊寄存器:條件寄存器(CR,condition register)、鏈接寄存器(LR,link register)和計數寄存器(CTR,count register)等;
3)DDR3存儲器。
同時,在設計時要考慮以下問題:
1)CPU0、CPU1連接到外部DDR3存儲器,并將應用程序和檢查點文件存儲在不同地址中;
2)CPU0、CPU1共享DDR3內存,對于不可同時訪問的資源需要設置互斥信號量等進行保護;
3)驗證點在所有寫同步中選取,但二者并不等同,大部分寫同步不對WHT1作改動。
在雙核互鎖機制中,由CPU本身擔任監測模塊,任一CPU判斷兩核寫命令不一致,則認為系統中出現了軟錯誤,需要采取相應措施。監測機制基于Vxworks操作系統編寫,采用C語言進行設計,它負責驗證CPU0和CPU1的一致性并通過輸出的中斷信號控制鎖步。監測模塊通過比較CPU0、CPU1的寫命令來判斷二者是否一致,比較方式有以下兩種。
1)第一種方法:將CPU0、CPU1同步時的寫地址和寫數據分別發送給對方,然后二者對各自數據的每一位進行比較;
2)第二種方法:在CPU0、CPU1寫同步的數據中應用簽名,兩CPU僅對比簽名來判斷是否一致,簽名方式有數據總和、異或掩碼等。
在第一種方法中,不需要對應用程序做額外修改,優點是監測覆蓋率較大,但會增大系統開銷。在第二種方法中,需要在同步前計算簽名,即在應用程序上附加代碼,但降低了監測模塊對比數據量,有效降低了系統消耗時間。
綜合考慮上述兩種方法的優缺點,采用第二種方法在CPU0、CPU1的寫同步數據中應用簽名,而后再由CPU0、CPU1進行對比,簽名的實現方式是:將寫地址和寫數據相與,然后計算總和中二進制數據“1”的個數,如表1所示。
以CPU0為例,寫同步流程如圖5所示。首先CPU0計算自身寫地址和寫數據的簽名,然后通過消息隊列將簽名發送至CPU1,等待來自CPU1的簽名,超時則觸發回卷。

圖5 雙核互鎖CPU0寫同步過程
接收到來自CPU1的簽名后,CPU0進行二者對比,不一致觸發回卷。若一致性判斷通過,則記錄寫命令,繼續執行程序。
3.2.1 檢查點技術
檢查點的設置基于CPU0、CPU1的寫同步,設置檢查點間隔為N,每連續N個寫同步檢驗通過,就向CPU0、CPU1發送一個檢查點中斷請求,CPU0、CPU1響應中斷信號后執行檢查點中斷操作。處理器響應中斷流程如圖6所示。

圖6 處理器響應中斷流程
在檢查點執行過程中,發送中斷請求,調用中斷服務函數,初始化相關信號量和共享變量,獲取WHT0中數據形成檢查點文件,覆蓋歷史表1,并清空歷史表0。
3.2.2 回卷恢復技術
當任何一次寫同步檢測到兩核寫命令不同時,系統進入回卷恢復操作。為了盡可能降低系統回卷引入的性能資源消耗,本文設置了四級回卷,如圖7所示。

圖7 回卷恢復流程
一級回卷中斷:一次表決不一致時,回卷計數值加1,重新執行該指令;
二級回卷中斷:連續兩次表決不一致,按照WHT0內容修改DDR3中內存數據段與CPU寄存器的值,使它們恢復到第N個檢查點狀態,回卷計數值加1,其余信號清零,退出中斷;
三級回卷中斷:按照WHT0、WHT1內容修改DDR3中內存數據段與堆棧數據段的值,使它們恢復到第N-1個檢查點狀態,回卷計數值加1,其余信號清零,退出中斷;
四級回卷中斷:中斷服務程序用DDR3中的備份數據覆蓋內存數據段、CPU寄存器值,清空WHT0和WHT1,清零所有信號,重新執行該程序。
當連續回卷計數為5時,代表四級回卷恢復機制仍未解決當前系統中出現的錯誤,控制系統復位。此外,對雙核鎖步過程中的數據傳輸進行信息冗余加固,提高系統可靠性。
雙核互鎖設計以較小的性能和資源代價來換取系統可靠性的提升,兩核互為檢查模塊,任一核認為數據異常則默認系統受到軟錯誤影響,可見兩核的交互是雙核互鎖設計的關鍵,包括兩核交互、交互方式、交互頻率等,兩核交互設計的好壞決定了系統性能開銷大小。
3.3.1 交互內容
交互內容是指系統在檢查點操作時具體保存的某些狀態。交互內容設置詳細,那么通過回卷技術可以有效地使系統回到上一個檢查點時的正確狀態,重新執行程序段,得到正確的結果。相應的,也會帶來系統檢查點操作和回卷操作時間的增加;上下文內容缺失,會導致無法通過回卷技術得到正確的系統狀態,進而不能夠產生正確的計算結果,使整個鎖步機制失效。
在本文中,交互內容包括寫命令對內存數據段的改變以及CPU各寄存器值,考慮到DDR3存儲器受錯誤檢查和糾正(ECC,error checking and correcting)技術加固,認為內存數據可靠性較高,并在每個程序開始執行時進行一次內存數據段備份,程序運行到檢查點時僅更新交互內容不對內存數據段進行額外操作。
3.3.2 交互方式
通常情況下,鎖步系統通過一致性檢驗進行兩處理器的同步。目前主要的設置方式有寫操作同步和劃分程序塊同步兩種。前者是在處理器運行到寫操作時,通過等待的方式進行同步,當完成一致性檢驗后,兩個處理器同時開始后續指令執行;劃分程序塊是指將應用程序劃分為多個塊,在兩塊之間設置驗證點,當到達驗證點時,通過等待的方式實現同步。
在本文中,考慮到劃分程序塊可能使錯誤數據污染內存,甚至對其他系統造成嚴重影響的情況,選擇基于寫操作同步的設置方式。但由于寫操作頻率在不同程序間的不確定性,本文選擇將檢查點設置與一致性檢驗設置進行區分,每次寫操作都進行一致性檢驗,多次寫操作后進行一次檢查點操作。同時設置四級回卷,針對潛在單粒子影響有一定的抵抗能力。
3.3.3 交互頻率
檢查點間隔的選取對系統性能影響很大。檢查點設置密集,意味著需要頻繁進行檢查點操作,且易產生潛在單粒子影響無法消除的現象;檢查點設置稀疏,兩個處理器計算結果不一致,觸發回卷后需要重新執行很長一段程序。致使系統產生不必要的性能開銷。
在本文中,將檢查點設置與一致性檢驗設置進行區分,每次寫同步都進行一致性檢驗,多次寫同步后進行一次檢查點操作。通過寫請求先到等后到的方式進行CPU0、CPU1的同步。檢查點數量和回卷數量設置不一致,當寫同步一致性表決不通過時,根據連續回卷次數,產生相應的回卷中斷信號。
軟件故障注入技術(SWIFI,software implemented fault injection)是在軟件層次來實現處理器的故障注入方法,該技術不需要任何硬件設備就可以實現故障的模擬注入,而是在處理器程序編譯或者運行時動態的修改執行程序,或者人為設置寄存器值來改變處理器的運行狀態,這種注入方法不需要任何額外的開銷,屬于一種低成本的故障注入技術,且故障注入位置靈活可控,具有相當高的自由性。另一方面,通過腳本或者程序可以實現批量的故障注入操作,完成故障注入的全自動化設置。
故障注入會因實現方式的不同或者注入對象的不同而略有差異,但是基本設計思想是一致的[20],其原理如圖8所示。

圖8 故障注入原理圖
主要通過定時器超時、代碼插入和異常/陷阱等技術手段[21],對雙核鎖步機制及個容錯技術進行故障注入實驗,模擬系統中上至雙核處理器、下至處理器的寄存器、存儲單元等多個層次可能發生的故障,驗證雙核互鎖機制是否能夠有效工作,提高系統可靠性。
為驗證本文提出的雙核互鎖機制的抗軟錯誤的有效性,在兩核寫同步、檢查點兩處注入故障來模擬系統中出現的單粒子翻轉現象,觀察CPU0、CPU1是否能正確識別軟錯誤,并通過回卷恢復技術得出正確的結果。
4.2.1 同步點故障注入
在雙核互鎖機制中,CPU0和CPU1執行相同的程序,在寫同步處進行數據交互,從而進行一致性判斷,產生相應的檢查點中斷信號或回卷中斷信號。因此,為了模擬處理器在執行任務過程中數據位翻轉的情況,可以通過故障注入的方法直接對處理器寫命令的計算簽名進行修改,故障注入位置如圖9所示。

圖9 同步點故障注入
故障注入步驟如下:
1)設置信號量sig0,核1每次寫命令時sig0信號自增;
2)核1寫同步計算簽名后讀取sig0信號,若大于預設值,則進入故障注入函數;
3)同步點故障注入函數獲取核1計算后的簽名,與0x55555555做與運算,將運算結果重新賦值給簽名;
4)核1得到故障注入后的簽名,通過消息隊列與核0交換數據,兩核進行一致性判斷。
連續修改一次到五次寫同步后形成的核0的計算簽名,每次翻轉簽名中的一個bit位,模擬執行應用過程中數據位發生翻轉的情況,致使系統產生回卷恢復中斷信號,并觀察系統回卷級數,后續是否能恢復到正確的系統狀態,產生正確輸出。
4.2.2 檢查點文件故障注入
檢查點文件是雙核鎖步機制的核心,是系統能恢復到上一個正確狀態的依據。CPU執行到檢查點處時,分別從WHT0、WHT0*獲取數據,生成檢查點文件。因此,為了模擬處理器在檢查點處數據位翻轉情況,可以在檢查點文件生成時進行故障注入,故障注入位置如圖10所示。

圖10 檢查點文件故障注入
故障注入步驟如下:
1)設置信號量sig1,核1每次進入檢查點時sig1信號自增;
2)核1在計算檢查點文件簽名前讀取sig1信號,若大于預設值,則進入檢查點故障注入函數;
3)在檢查點故障注入函數中,手動設置不同的故障注入位置,分別將檢查點文件中各寄存器的值與0x55555555做與運算,運算結果保存到檢查點文件中;
4)核1計算檢查點文件簽名,通過消息隊列與核0交換數據,進行一致性判斷。
通過修改CPU1生成檢查點文件中各寄存器值,翻轉其中的1 bit位,模擬從堆棧地址中讀取各寄存器值時發生數據位翻轉的情況,致使CPU0、CPU1在對比檢查點文件的簽名時產生回卷恢復中斷信號,從而達到故障注入的目的。同樣通過連續注入一次到四次錯誤,觀察系統回卷級數,是否能恢復到正確的系統狀態。
根據4.2所述的軟件故障注入方案,分別進行相應的故障注入設計,其實驗結果如表2所示。

表2 雙核互鎖故障注入實驗結果
其中,W1點是該應用程序的非首個寫同步點,W2點是程序的非首個檢查點,r1是通用寄存器,CR是條件寄存器,LR是鏈接寄存器。
在寫同步計算簽名過程中,選取了W1、W2兩個程序運行位置進行了故障注入,每個注入點進行了1次注入到連續5次注入實驗,雙核互檢機制可以穩定檢查到兩核運行過程中出現不一致,以及連續注入錯誤的數量,準確率為100%。根據連續出錯次數,雙核互檢機制選取不同的恢復策略:1次錯誤時調用一級回卷中斷函數,重新執行指令;連續2次到3次錯誤時,系統調用二級、三級回卷中斷函數,分別回卷至第N次、第N-1次檢查點的系統狀態;連續4次出現錯誤,系統調用四級回卷中斷,將應用程序初始化時備份的程序段傳入內存,重新執行該程序;當連續超過4次錯誤時,處理器復位。
在檢查點文件中,選取通用寄存器r1、特殊寄存器CR、LR三個故障注入點,同樣各個注入點分別進行1至5次手動造錯。多次實驗下,CPU0、CPU1進行一致性表決時,均可得到“fail”的表決結果,并且根據連續回卷計數觸發正確的回卷中斷信號。連續注入故障不超過4次時,CPU0、CPU1能通過回卷恢復能到正確的輸出結果,避免了類似的單粒子翻轉對系統可靠性的影響。當連續回卷計數值達到5時,認為該系統已無法通過回卷恢復技術糾正錯誤,進行復位操作。
綜上,本文雙核互鎖機制可以在不額外增加硬件的前提下,犧牲小部分處理器性能,使系統具備較好的軟錯誤檢測和系統恢復能力。
本文提出了一種面向通用處理器的雙核互檢抗軟錯誤加固方法,該方法基于寫命令進行CPU0、CPU1同步,結合檢查點、回卷恢復技術實現正確狀態的保存和恢復。通過簡化檢查點存儲數據和四級回卷恢復機制,降低處理器資源開銷的同時有效保障了系統可靠性。
軟件層面改進的雙核互檢算法面向通用型多核處理器,具有良好的可移植性。根據軟件故障注入仿真結果可知,雙核互檢方法可以100%檢測到程序運行關鍵數據發生的翻轉,并通過多級回卷技術得到正確的結果,具備較強的工程實用價值。雙核互檢加固方法對處理器性能影響的評估將是未來工作的重心。