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