Transient Fault基本概念介绍和一种基于watchdog的容灾策略

来源:互联网 发布:金蝶软件系统参数 编辑:程序博客网 时间:2024/09/21 09:02

这里的介绍来自IEEE论文A Watchdog Processor to Detect Data and Control Flow Errors,由于本人能力有限,在翻译过程中可能会出错,希望大家指正。

由于辐射和电磁干扰(Radiations and electromagnetic interferences)的存在,出现的短暂而且偶尔的faults会暂时改变系统的运行状态,这种fault成为Transient Fault。由于这种fault的随机性和偶然性,很难去检测并隔离,因此这成为我们研究fault tolerance的关键问题之一,尤其之于实时(real-time)应用程序。

针对这种fault,经常采取on-line error detection的机制进行应对,通常又分为电路级(circuit-level)和系统级(system-level)的解决方法,这些方法能够有效的保护系统免受Transient Fault的影响,不过也存在成本高、要对现有系统配置(system layout)有大的改动的缺陷,致使不能很好的商业化。

这里介绍一种基于watchdog的方法。watchdog是一种小而简单的协处理器,它通过监控主处理器的行为进行错误检查。第一阶段,watchdog获取处理器的信息;第二阶段,采集运行时的信息并和第一阶段进行比较达到错误检查的目的。watchdog通过系统总线与处理器进行交互。

像论文那样,我们先看一看Fault Model。我们知道fault的来源是辐射和电磁干扰,那么它们会造成什么后果呢?

Memory Fault:会使得memory cell(内存单元)发生bit-flip,也就是说本来存有0却翻转成1,存有1翻转成0,这会影响程序和数据的存储。

Processor Fault:由于在处理器内部寄存器发生了bit-flip致使程序错误执行,从而导致处理器的内部状态发生改变。

Bus Fault:微处理器I/O引脚或系统总线上出现电压或电流毛刺(glitches),往往会导致错误的数据传输和数据败坏(data corruption)。下面的图片来自论文,有助于直观地理解这种影响:


其实上面的影响可以总结成两条:

数据错误(data errors):存储在内存或寄存器中的变量值发生改变。

控制流错误(control flow errors):发生改变的是指令,导致错误的指令执行序列(an incorrect sequence of instructions)。

其实这都是很糟糕的影响,它会使得一个操作系统崩溃,一个程序不能运行,这是我们往往会采取重启的策略,那实现fault-tolerant的watchdog会让系统重启吗?

接下来是watchdog的容错机制:

watchdog监控系统总线上的数据传输来发现错误,一旦检测到faults,它会产生中断来停止程序的执行,并通知处理器。

数据保护:watchdog有一个内部存储器,存有程序用到的变量(variables)的一份copy。具体机制是,从处理器到内存的每一次对变量的写操作都要在总线上被watchdog拦截,在它的内存中存有一份该变量的copy,称为shadow variable,然后从内存中的每一次读变量,也要在总线上被watchdog拦截,进行读取的变量值和shadow variable的比较,达到检测数据是否败坏(corruption)的目的。很显然,watchdog不能存储所有程序的变量,只能存有程序中最关键的变量(most critical variable MCV),而关键变量指的是当它受到影响时,会导致程序正确地终止但产生错误的结果。

控制流检测:在取指令的过程中出现位翻转(bit-flip)以及存在内存中的程序二进制代码出现bit-flip,都会导致指令执行序列的错误。一个程序可以用Flow Control Graph(流程图)来表示,如(下面的图片来自论文):


也就是程序被分解成了两种组成:Branch Free Block 和 Control Node。如何保证Branch Free Block中的指令正确执行?论文中提出计算每一个Branch Free Block的签名(signature)的解决方案,具体是根据指令的操作码(opcode)生成签名,在watchdog中存有一份golden signature(应该是Branch Free Block执行前生成的签名,也就是代表正确的指令序列),在运行时,watchdog重新计算每个block的签名并和golden signature进行比较。关于这种机制的原理,论文并没有介绍,我想这是否与SHA-1算法加密认证类似,因为出错的指令序列的opcode和正常的是不一样的,这样他们生成的密钥(这里是signature)就不同。

接下来是检查blocks是否按正确的顺序执行,也就是考虑Control Node。论文作者提出了一种基于正则表达式的签名方案:每个Branch Free Block用一个标签(label)来表示。我们可以列出所有可能的blocks执行序列,并用正则表达式来表示。运行时,watchdog通过检查地址总线上指令地址的序列来构造blocks的执行序列。在watchdog的内存中有一个table存有每个block第一条指令的地址和该block的label的一一映射,这样watchdog便会将获取的指令地址序列转化成lable序列,然后用正则表达式验证label序列的合法性。这里只是粗略的介绍,由于水平有限,难免有出入,如果想详细了解,大家可以查看下面这篇论文 A. Benso, S. Di Carlo, G. Di Natale, P. Prinetto, L. Tagliaferri, Control-Flow Checking Via Regular Expressions, IEEE Asian Test Symposium (ATS 2001), Kyoto (J), November 2001, pp. 299-303。

总线保护:watchdog采取了基于Automatic Repeat Request (ARR)的保护策略,watchdog让处理器进行与内存多次重复的传输,来消除只是偶然出现的Transient Fault,直到至少两次连续的传输是同样的数据为止。显然,这样的机制是很耗时的,不过同变量保护类似,我们可以只选择程序的关键部分来repeat。


总结:论文只是提出了错误检测,并没有提出如何去纠正(总线保护是在纠正错误),不过这确实实现fault tolerance的关键一步。我会继续为大家介绍fault tolerance的相关话题和技术,希望大家支持和斧正。




1 0
原创粉丝点击