所謂軟錯誤,指的是由物理效應(yīng)引起的數(shù)據(jù)偏差,受影響的內(nèi)存單元并沒有被破壞,系統(tǒng)重啟后此錯誤會被修復(fù),我們將這種軟錯誤的發(fā)生稱為單粒子翻轉(zhuǎn)(SEU)。
應(yīng)用中的軟錯誤?
軟錯誤在應(yīng)用中以特定的頻率存在,這種軟件錯誤率(SER)取決于很多環(huán)境和技術(shù)參數(shù)。
一個長期運行的工業(yè)設(shè)備,假設(shè)系統(tǒng)中集成了一個2MB SRAM,已連續(xù)運行20年,以每位小時1e-12個錯誤的SER,我們可以計算:
1e-12errors/bit*h*2Mbyte*8bit/byte*175.200h = 2.9 errors
我們意識到,對于長期運行的安全關(guān)鍵系統(tǒng)來說,這不僅僅是一個物理理論,我們很有可能會因為一個軟錯誤而失去安全功能!
這是不可接受的。我們必須避免或至少能檢測長期運行的工業(yè)設(shè)備中的軟錯誤。
越來越多的軟錯誤
為理解、檢測或糾正硬件中的這些軟錯誤,許多研究正在進(jìn)行。根據(jù)Tezzaron的論文,組件對錯誤率的敏感性將隨著以下情況上升:
· 復(fù)雜性的增加將提升錯誤率
· 高密度(高容量)芯片更容易出錯
· 低壓設(shè)備更容易出錯
· 更高的速度(較低的延遲)導(dǎo)致更高的錯誤率
· 較低的電池容量(存儲電荷較少)將導(dǎo)致較高的錯誤率
這些情況匹配嵌入式市場的當(dāng)前發(fā)展趨勢,我們應(yīng)該讓系統(tǒng)為越來越多的軟錯誤做好準(zhǔn)備。
硬件措施
在航空航天和衛(wèi)星系統(tǒng)使用的一些輻射加固硬件組件具有高度的SEU免疫力,但如果在工業(yè)應(yīng)用中使用這些組件,系統(tǒng)成本將超過可接受的限度。
可以使用為解決IT服務(wù)器內(nèi)存錯誤設(shè)計的chipkill技術(shù),該技術(shù)基于冗余機(jī)制。
硬件供應(yīng)商也意識到了這一挑戰(zhàn)。在過去的幾年里,已經(jīng)發(fā)布了幾款帶有軟錯誤緩解技術(shù)的微控制器。
ECC內(nèi)存保護(hù)
ECC內(nèi)存設(shè)備使用糾錯碼來存儲數(shù)據(jù),這些編碼被歸類為SEC-DED。該方法基于漢明編碼,可以發(fā)現(xiàn)2位錯誤,糾正1位錯誤。
當(dāng)使用ECC保護(hù)內(nèi)存時,軟件在啟動期間只需要少量操作。系統(tǒng)上電后,我們必須將內(nèi)存初始化為已知狀態(tài)。否則,會收到ECC錯誤的通知,而ECC錯誤實際上是內(nèi)存單元的隨機(jī)內(nèi)容。之后,硬件在常規(guī)操作中透明地修復(fù)軟錯誤。大多數(shù)ECC內(nèi)存提供修復(fù)通知,我們用它來監(jiān)控內(nèi)存。
有了這種優(yōu)秀的硬件支持,我們已經(jīng)為軟錯誤做好了充分的準(zhǔn)備。
軟件措施
基于系統(tǒng)或硬件工程原因,我們需為沒有硬件機(jī)制的系統(tǒng)準(zhǔn)備軟件,例如:使用的控制器不支持ECC內(nèi)存,或者我們需要沒有ECC的外部內(nèi)存。
我們建議在項目中針對軟錯誤敏感執(zhí)行數(shù)據(jù)存儲分析,這種分析有助于決定對數(shù)據(jù)存儲使用哪種措施來避免、恢復(fù)或檢測軟錯誤,分析內(nèi)容包含:
· 使用的內(nèi)存數(shù)量(使用的內(nèi)存越多,軟錯誤概率越高)
· 數(shù)據(jù)壽命(壽命越長,出現(xiàn)軟錯誤的概率越高)
· 軟錯誤導(dǎo)致的最壞情況系統(tǒng)行為(影響越嚴(yán)重,我們需要的錯誤檢出率越高)
在這種分析中,未使用的內(nèi)存單元中的軟錯誤是可以接受的。通過這種方法,我們保持了盡可能高的性能和可用性,同時保護(hù)系統(tǒng)免受軟錯誤的影響。存儲數(shù)據(jù)可以分類為:
· 常量數(shù)據(jù)(如操作碼、配置表)
· 枚舉數(shù)據(jù)(如系統(tǒng)狀態(tài)和模式)
· 動態(tài)數(shù)據(jù)(如過程值)
· 臨時數(shù)據(jù)(如局部變量,不斷刷新內(nèi)存)
歸類為臨時數(shù)據(jù)的變量是非關(guān)鍵的,可以在沒有進(jìn)一步保護(hù)措施的情況下保持不變。因此,從獨立數(shù)據(jù)源周期性更新數(shù)據(jù)是一個很好的策略。
常量數(shù)據(jù)保護(hù)
為了保護(hù)內(nèi)存中的常量數(shù)據(jù)(如應(yīng)用操作碼或配置表),我們計算數(shù)據(jù)的哈希值,并使用存儲的預(yù)期值檢查結(jié)果。
保護(hù)的強(qiáng)度取決于哈希值中使用的比特位數(shù)。最常用的是CRC32算法。哈希碰撞是兩個不同的常量數(shù)據(jù)內(nèi)存映像可能產(chǎn)生相同的哈希值的效應(yīng)。杰夫·普雷辛提供了一份關(guān)于碰撞概率的概述。隨著常量數(shù)據(jù)內(nèi)存中字節(jié)數(shù)的增加,CRC32碰撞的概率也會增加。對于實際項目,這導(dǎo)致了諸如“CRC32最多可以保護(hù)4096字節(jié)”這樣的限制(字節(jié)的數(shù)量取決于安全完整性級別)。
因此,更好的選擇是支持32位到1024位可變長度的FVN-Hash值,這是一種快速高效的計算哈希值的方法,下面的偽代碼顯示了算法:
offset_basis和FNV_prime為固定值,取決于hash值的位寬度。
枚舉數(shù)據(jù)保護(hù)
我們在存儲枚舉數(shù)據(jù)時避免使用“1、2、3,…”這樣的值,因為一次位翻轉(zhuǎn)可以將有效數(shù)據(jù)更改為其它的有效值,我們沒有辦法檢測到這個位翻轉(zhuǎn)。
我們可以選擇特定的值,確保一次位翻轉(zhuǎn)的結(jié)果是無效值。如果需要至少兩次位翻轉(zhuǎn)才能將一個有效值更改為另一個有效值,我們將選擇稱為:“漢明距離(HD)為2的值?!?/p>
HD =不同位的數(shù)量
實際項目中,我們選擇漢明距離為4的值。參見以下十六進(jìn)制字節(jié)值:
理論上,我們可以通過搜索具有最小漢明距離的值來糾正單個位翻轉(zhuǎn)。這個值很可能是正確的值。
以0x3c為例,假設(shè)位1翻轉(zhuǎn)-我們得到0x3e。首先,這是一個無效值。其次,我們可以檢查該值到所有有效數(shù)據(jù)的漢明距離(在下面的括號中):
如果只有1位翻轉(zhuǎn)得到0x3e,最低HD的值是0x3c為正確的值。事實上,我們不知道有多少比特被翻轉(zhuǎn)了。這是被分類很可能正確的原因。
我們對安全關(guān)鍵軟件中最有可能正確(most likely)的值不滿意。出于這個原因,我們通常會提出一個安全異常,即關(guān)閉或重啟設(shè)備。
動態(tài)數(shù)據(jù)保護(hù)
對于動態(tài)數(shù)據(jù),任何值都是有效值。我們必須添加冗余來檢測值的變化(如位翻轉(zhuǎn))。一個簡單的方法是將變量鏡像存儲在不同的內(nèi)存區(qū)域中。實現(xiàn)偽代碼如下:
我們現(xiàn)在可以在任何時候用引入的冗余檢查動態(tài)變化的變量:
注意:當(dāng)使用中斷、多線程環(huán)境、DMA傳輸、數(shù)據(jù)緩存或多處理器設(shè)備時,這段偽代碼會變得復(fù)雜(并需要運行時間)。
總結(jié)
我們討論了對長期運行的嵌入式設(shè)備采取軟錯誤保護(hù)措施的必要性。
廣泛使用的硬件和軟件措施概述包括:
· 內(nèi)存設(shè)備的ECC保護(hù)
· 常量數(shù)據(jù)內(nèi)存的哈希值
· 枚舉值的漢明距離
· 動態(tài)數(shù)據(jù)內(nèi)存的冗余
所有措施可以分類到哈希值、漢明碼和冗余三個大類,這是自檢測算法和系統(tǒng)可信性監(jiān)測中使用的三個主要測量方法。
審核編輯:劉清
-
微控制器
+關(guān)注
關(guān)注
48文章
7570瀏覽量
151628 -
多處理器
+關(guān)注
關(guān)注
0文章
22瀏覽量
8962 -
嵌入式設(shè)備
+關(guān)注
關(guān)注
0文章
110瀏覽量
16982 -
十六進(jìn)制
+關(guān)注
關(guān)注
2文章
32瀏覽量
37773 -
CRC32
+關(guān)注
關(guān)注
0文章
8瀏覽量
8258
原文標(biāo)題:如何對長期運行的嵌入式設(shè)備采取軟錯誤保護(hù)
文章出處:【微信號:麥克泰技術(shù),微信公眾號:麥克泰技術(shù)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論