所谓软错误,指的是由物理效应引起的数据偏差,受影响的内存单元并没有被破坏,系统重启后此错误会被修复,我们将这种软错误的发生称为单粒子翻转(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保护
· 常量数据内存的哈希值
· 枚举值的汉明距离
· 动态数据内存的冗余
所有措施可以分类到哈希值、汉明码和冗余三个大类,这是自检测算法和系统可信性监测中使用的三个主要测量方法。
审核编辑:刘清
全部0条评论
快来发表一下你的评论吧 !