专利名称:一种基于还原程序的硬件故障检测方法
技术领域:
本发明涉及一种硬件故障检测的方法,尤其是在空间辐射环境下对由于单粒子效
应引起的电子器件的故障进行检测的方法。
背景技术:
空间探测活动投入大、风险高,对可靠性有着极高的要求。太空中影响空间探测器 安全的主要因素是宇宙射线的辐射,因为这些宇宙射线中的高能带电粒子流会使电子器件 出现硬件故障。空间辐射环境对电子器件的影响主要表现为单粒子效应。
普通计算机所使用的芯片 一 般是商用微处理器COTS (Commercial Off-the-Shelf),在空间环境中,为了防止空间辐射的影响,一般使用经过特殊工艺设计与 加工的微处理器芯片,即抗辐照器件。抗辐照器件主要通过硬件冗余实现容错,具有很高的 可靠性。但是由于其设计非常复杂,研制周期很长,产业规模和产量都很小,价格非常昂贵。 由于硬件的冗余,抗辐照器件的芯片面积通常成倍增加,这不仅使芯片成品率下降,也带来 了功耗的迅速增长。而且按照这种方式生产出来的抗辐照器件的性能通常落后于同时代的 COTS很多代。COTS由于产量很大且使用广泛、经过充分的市场竞争,所以一般性能很高,价 格相对较低,且任何国家都无法对其进行封锁和禁运。其缺点是对空间环境比较敏感,容易 产生单粒子效应。 计算机发展的历史表明,很多原本用硬件实现的技术同样可以用软件来实现,在 COTS上进行面向硬件故障的软件容错可以弥补COTS在容错能力方面的不足。国内外已开 展很多实验探讨在空间环境中能否使用以及如何使用C0TS。实验结果表明在COTS上面 向硬件故障的软件容错方法所实现的性能,可以比基于抗辐照器件的空间计算机高一个数 量级;面向硬件故障的软件容错方法可以有效提高基于COTS的空间计算机的可靠性,能够 很好地应对空间辐射的影响,同时还能够使成本降低。 通过与采用抗辐照器件的硬件容错方法比较可以发现,基于COTS的软件容错方 法除可靠性方面比硬件容错方法略低之外,在性能、成本、功耗和灵活性方面都拥有巨大的 优势。软件容错方法包括故障检测、定位、恢复等过程,其中,故障检测是故障定位及恢复的 基础。空间辐射环境中的单粒子效应可能导致星载计算机上的寄存器、存储器、缓存等存储 部位出现故障,也可能导致总线、算术逻辑运算单元、指令译码器等功能部件出现故障。这 些故障可能致使计算机中的指令序列出现执行顺序错误或者数据错误,前者又称控制流错 误。针对数据错误和控制流错误,现有的软件容错方法一般采用不同的故障检测策略分别 对其检测。其中针对数据错误的故障检测策略又可分为两类(l)基于程序简单复算的方 法;(2)基于数据差异性变换的方法。软件实现的故障检测策略作用的对象一般是程序编 译后得到的汇编语言程序(简称源程序),实现的方法一般是在源程序中插入容错需要的 指令,这些插入的容错指令合称为冗余程序。 1.基于程序简单复算的方法是将源程序的指令复制得到冗余程序,程序执行时在 预设的检测点比较源程序和冗余程序的执行结果,如果二者一致则认为源程序执行正确,
6否则认为系统存在故障。同时为了提高故障检测率,冗余程序的执行要基于冗余的存储空 间。这种方法的关键在于设置检测点。 一般检测点设置越多,则程序运行时的错误延迟越 小,系统可靠性越高,但检测指令一般耗时较多,所以检测点的增加必定导致程序性能开销 的增加。 单粒子效应具体又可分为单粒子翻转、单粒子闩锁和单粒子烧毁三种。其中,单 粒子翻转是瞬时故障,通过重写可以恢复原来的状态。单粒子闩锁在重新加电后一般可以 恢复,但如果电路状态被锁定时间太长,则可能成为永久性故障。单粒子烧毁是永久性故 障。基于程序简单复算的方法可有效检测出系统发生的瞬时故障,但是很难检测出发生在 总线、算术逻辑运算单元、指令译码器等部件上的永久性故障。这种方法还存在存储开销较 大的不足。 2.基于数据差异性变换的方法 这种方法是对基于程序简单复算方法的改进。它是将源程序复制得到冗余程序, 但冗余程序的执行基于不同的输入数据,冗余程序的输入数据D和源程序的输入数据d之 间存在函数关系f,即D = f (d),程序执行时,在预设的检测点比较冗余程序和源程序的执 行结果,如果二者之间也保持函数关系f ,则认为源程序运行正确,否则说明系统发生故障。 这种方法的难点在于如何设计函数关系f,通常的做法是将f设计为倍乘关系,即D = k*d, 整数k称为差异化因子。 基于数据差异性变换的方法可以检测出瞬时故障,同时,由于同一处永久性故障 对不同的数据可能产生不同的影响,这种方法也可以检测出部分永久性故障导致的错误。 但是需要仔细设计函数关系f才能得到理想的检测效果,并且极易出现数据溢出问题。另 外由于只对数据做差异性变换,源程序和冗余程序运行时的时空差异不够大,导致部分永 久性故障使源程序和冗余程序运算出相同的错误数据,从而使这部分永久性故障无法被检 测到。 由于上述方法存在的不足和航天领域对可靠性的极高需求,本领域很多技术人员 都在努力研究新的故障检测方法,以解决单粒子效应对空间探测器可靠性的负面影响问 题。如何进一步提高故障检测方法的故障检测率,克服已有方法存在的数据溢出、存储开销 大、源程序和冗余程序运行时的时空差异性不够等问题是人们关注的重点。
发明内容
本发明要解决的技术问题是,提供一种新的硬件故障检测方法,加大源程序和冗 余程序运行时的时空差异性,克服数据溢出等问题,提高瞬时故障和永久性故障的故障检 本发明的技术方案是将源程序中的加、减、乘、除、左移、右移、异或和同或运算 指令定义为可还原运算指令,将减、加、除、乘、右移、左移、异或和同或运算指令分别定义为 加、减、乘、除、左移、右移、异或和同或运算指令的还原运算指令(这样,每条可还原运算指 令都有对应的还原运算指令,如加法指令的还原运算指令是减法指令,减法指令的还原运 算指令是加法指令,异或指令的还原运算指令仍然是异或指令等)。在源程序中的可还原运 算指令序列后插入还原运算指令序列,插入的还原运算指令序列利用可还原运算指令序列 的输出数据还原其输入数据,然后插入检查点指令,比较还原得到的输入数据和原始的输入数据,若二者一致则认为程序运行正常,否则报告系统故障。源程序中插入的还原运算指 令序列定义为还原程序。 可以用以下简单例子说明还原程序还原数据的基本方法假设源程序中有以下操
作序列
R2 = e
Rl = R2+R3
R2 = d 这段程序执行过程中,R2中先后驻留了数据e和d。这段程序执行后,还原程序通 过执行还原操作R2 = Rl-R3还原出寄存器R2中的原始数据e。
具体技术方案为 第一步,遍历源程序,对源程序进行预处理。通过预处理确保还原程序能够还原出 输入数据及不存在故障时还原出的数据和原始数据相同。预处理包括以下步骤
1. 1判断源程序中是否存在源、目的操作数相同的指令。即形如以下操作的指令 R = R 0P R1 (0P表示一个可还原运算指令对应的操作码),同一个寄存器操作数R既作为 源操作数出现,又作为目的操作数出现,Rl为寄存器。如果存在则执行第1. 2步,否则转第 1. 3步。 1. 2用执行如下操作的指令(中间数据保存指令)替换源、目的操作数相同的指 令 R2 = R+0
R = R2 OP Rl R2为新分配的寄存器。对源、目的操作数相同的指令进行上述变换的原因是,原指 令执行后无法通过其还原运算指令还原出Rl中的数据,因为还原操作是如下形式Rl = R ROP R(R0P表示可还原运算操作OP对应的还原操作),R中的数据为原指令修改后的数据。 1. 3判断源程序是否存在定点除法指令。如果存在则执行第1. 4步,否则转第1. 5
止 少。 1. 4在定点除法指令前插入求余指令,利用求余指令rem = Rl % R2保存除法操作 的余数。对于定点除法操作,若被除数和除数之间不存在整除关系,则对此操作进行还原运 算后得到的结果和原始数据必定不同,为此,需在定点除法操作前面插入求余指令保存除 法操作的余数,因为对定点除法还原运算后得到的结果和余数相加即和原始数据相同。
1. 5判断源程序是否存在数据传送指令。即形如以下操作的指令R1 = R2,指令 将寄存器R2中的数据复制到寄存器Rl中。如果存在则执行第1. 6步,否则转第二步。
1. 6用加法指令Rl = R2+0替换数据传送指令Rl = R2,这样就实现了数据传送操 作的可还原化。 第二步,找出源程序中的原子数据,构造原子数据表和数据指令关联表。原子数 据是指由寄存器、存储器等存储单元记录、在指令中不可再分的数据,包括在指令操作数中 以各种形式寻址的数据,如寄存器中的数据、指令中的立即操作数、存储器中某一位置的数 据。同一存储单元可能在程序执行过程中被多次写入数据,这些数据即是先后驻留到此存 储单元的不同的原子数据。数据指令关联表存放每条可还原运算指令及其操作的原子数据 信息,包括指令编号及作为源、目的操作数的原子数据编号。目前中高档服务器普遍采用
8RISC指令集(这也是高性能处理器的发展方向),而RISC指令集中的运算指令只操作寄存 器操作数或者立即操作数,因此找源程序中的原子数据时,只需要找出源程序中作为寄存 器型操作数和立即操作数的原子数据即可。这一步包括以下步骤 2. 1寻找源程序中的原子数据,构造原子数据表。具体方法如下 2. 1. 1将源程序中不同的立即操作数确定为不同的原子数据,为不同的原子数据
分配不同的原子数据编号,并将每个原子数据的以下信息存入原子数据表原子数据编号,
驻留寄存器,驻留状态。其中,驻留寄存器信息设置为空,驻留状态设置为驻留中。
2. 1. 2对源程序中目的操作数为寄存器类型的指令,将指令向目的操作数寄存器
中写入的数据确定为原子数据,为不同的原子数据分配不同的原子数据编号,并将每个原
子数据的以下信息存入原子数据表原子数据编号,驻留寄存器,驻留状态。其中,一个原子
数据a的驻留寄存器即为指令写入a的寄存器,每个原子数据驻留状态信息设置为未驻留。 2.2构造数据指令关联表。具体方法如下 2. 2. 1对于任意一条可还原运算指令I,将指令向目的操作数寄存器写入的原子 数据确定为I的目的操作数对应的原子数据; 2. 2. 2若指令I的一个源操作数B是立即操作数,则将立即操作数对应的原子数据 确定为B对应的原子数据; 2. 2. 3若指令I的一个源操作数C是寄存器操作数,则从当前指令向前寻找最近 向该寄存器中写入数据的指令,将找到的这条指令写入的原子数据确定为C对应的原子数 据。 2. 2. 4判断是否已找出所有可还原运算指令的目的操作数和源操作数对应的原子
数据,如果是则将可还原运算指令的指令编号、目的操作数对应的原子数据编号、源操作数
对应的原子数据编号存放到数据指令关联表,执行第三步,否则转第2. 2. 1步。 第三步,将源程序划分为若干可还原程序块,构造可还原程序块表和控制流图。可
还原程序块是顺序执行的可还原运算指令的极大集合,控制流只能从可还原程序块的入口
和出口进出,并且可还原程序块内除最后一条指令外都必须是可还原运算指令。可还原程
序块表则专门存放每个可还原程序块的信息,包括可还原程序块的块编号、入口和出口地
址。控制流图是以可还原程序块为结点,以可还原程序块之间的控制流关系为边的图。插
入到每个可还原程序块内的还原运算指令序列定义为对应的还原程序块。这一步包含如下
步骤 3. 1确定各个可还原程序块的入口指令,它们是
參程序的第一条指令;或者 參条件转移指令或无条件转移指令跳转到的指令;或者
參紧跟在条件转移指令后面的指令;或者 參紧跟在非可还原运算指令(不包括新插入的求余指令)后的指令。 3. 2对每个入口指令,确定其对应的出口指令,它们是 參入口指令后除当前入口指令外的第一个入口指令前的指令;或者 參入口指令后的第一个转移指令;或者 參程序的结束指令。 3. 3每个入口指令和其对应的出口指令之间的程序块为一个可还原程序块,为每个可还原程序块分配一个块编号,并将块编号和入口、出口地址存入可还原程序块表。凡未被纳入某一可还原程序块的指令都是程序控制流无法到达的指令,不会被执行,因此这些指令不需要考虑。 3. 4构造程序的控制流图,方法是分析每个可还原程序块的出口指令,如果是转移指令,则存在当前可还原程序块到转移目标所在的可还原程序块之间的控制流关系;如果不是转移指令,则存在当前可还原程序块到下一条指令所在的可还原程序块之间的控制流关系。将可还原程序块作为结点,如果一个结点到另一个结点有控制流关系,则产生前一个结点到后一个结点的一条有向边,用这种方法构造出控制流图。 第四步,为每个可还原程序块构造运算关系图。运算关系图以单层二叉树为基本构件,反映可还原程序块内原子数据之间的运算关系。单层二叉树是只含一个父结点和其子结点的二叉树,即高度为2的二叉树。 一个可还原程序块的运算关系图的构造方法是
4. 1对可还原程序块内的每条可还原运算指令,查找数据指令关联表,得出其源、目的操作数对应的原子数据编号,分别为每条可还原运算指令构造一棵单层二叉树,父结点代表目的操作数信息元组(目的操作数对应的原子数据编号,当前指令编号),子结点代表源操作数信息元组(源操作数对应的原子数据编号,当前指令编号)。
4. 2结合数据指令关联表,查找可还原程序块内所有具有如下关系的可还原运算指令对一条指令II的源操作数B对应的原子数据编号和另一条指令12的目的操作数对应的原子数据编号相同。对每个这样的指令对,将指令12的二叉树作为一个结点替代指令II的二叉树中源操作数B对应的子结点,这样,II和12的二叉树合并得到一个子图。
4. 3结合数据指令关联表,查找可还原程序块内所有具有如下关系的可还原运算指令对一条指令II的源操作数B对应的原子数据编号和另一条指令12的某个源操作数对应的原子数据编号相同。对每个这样的指令对,在对应的两个二叉树中,将B对应的子结点作为两个二叉树的公共子结点,同时删除12对应的二叉树中原子数据编号和B相同的子结点,这样,11和I2的二叉树合并成为一个子图。4.2和4.3所得的子图和其它单层二叉树一起构成可还原程序块的运算关系图。 第五步,为每个可还原程序块找出最优还原路径。对于源程序中的一个可还原运算操作C = A 0P B,其还原运算操作可以是A = C R0P B,这个操作还原了数据A,但数据C和B的错误及这次运算的错误也传播到子数据A,因此称A为此次运算的错误传播点。若还原程序以A为源操作数,继续进行别的还原运算,则错误会经A传向下一个错误传播点,继续这个过程得到的还原运算操作序列称为一个还原路径,对应的所有错误传播点则构成了一个错误传播路径。但是,可还原运算操作C = A 0P B的还原运算操作也可以是B = CROP A,这说明对一个可还原运算指令序列,存在不同的还原路径和错误传播路径。由于性能代价的限制,只能采用一个还原路径进行数据还原,因此要寻找最优的还原路径。包含还原运算指令最多,也就是最长的还原路径,可以将程序执行时的错误最多地传播到最后一个错误传播点即检查点,因此被定义为最优的还原路径。寻找一个可还原程序块的最优还原路径的步骤如下 5. 1找出当前可还原程序块使用的寄存器在可还原程序块表中查找当前块的入口和出口,确定当前可还原程序块中包含的指令,然后在数据指令关联表中查找出当前可还原程序块中包含的指令关联的所有原子数据,最后在原子数据表中找出这些原子数据驻留的寄存器,找出的寄存器即称为当前可还原程序块使用的寄存器。 5. 2找出所有初态数据对每一个当前可还原程序块使用的寄存器R,查找可还原程序块内第一个使用寄存器R的指令,将该指令中R对应的原子数据定义为当前可还原程序块的初态数据,利用数据指令关联表找出所有初态数据。
5. 3找出所有终态数据对每一个当前可还原程序块使用的寄存器R,查找可还原
程序块内最后一个使用寄存器R的指令,将该指令中R对应的原子数据定义为当前可还原
程序块的终态数据,利用数据指令关联表找出所有终态数据。
5.4更新原子数据表在原子数据表中,将所有终态数据对应的寄存器驻留状态
设置为驻留中,将除立即操作数外的所有非终态数据的驻留状态设置为未驻留。 5. 5找出当前可还原程序块的局部最优还原路径并存入还原路径信息表。 一个可
还原程序块的多个还原路径构成集合S,局部最优还原路径是S的某个子集的最优还原路
径,可还原程序块的最优还原路径则是所有局部最优还原路径中最优的。执行以下步骤 5. 5. 1检索当前可还原程序块的运算关系图,从尚未产生还原运算指令的单层二
叉树中找出当前所有满足下述特征的单层二叉树作为备选的单层二叉树设一个单层二叉
树的父结点和子结点分别为A、B、C,对应的操作是A = B OP C,A结点对应的原子数据的寄
存器驻留状态为驻留中,且B、 C中至少有一个结点对应的原子数据的寄存器驻留状态为驻留中。 5. 5. 2从备选的单层二叉树中选择符合条件的树,并为选择出的树产生还原运算指令。选择出树A' =B' OP C'的条件和产生还原运算指令B' =A' ROP C'的约束如下 參还原运算指令的源操作数A' 、C'对应的原子数据的驻留状态必须为驻留中;
參还原运算指令的目的操作数B'对应的原子数据不能为立即操作数;
參如果B'关联的寄存器已有一个不同的原子数据d处于驻留中,且还没有为所有包含结点d的单层二叉树产生还原运算指令,则不能为当前的单层二叉树对应的操作A' =B' OP C'产生还原运算指令。 參如果B'或C'同时是运算关系图中其它单层二叉树的子结点,即B'或C'是两个二叉树的公共子结点,则先后为这两个单层二叉树产生的还原运算指令Il、 12要满足B'或C'要作为I1的目的操作数和I2的源操作数出现。 将本步产生的所有还原运算指令按产生的顺序加入临时还原指令表L。并将原子数据表中还原运算指令的目的操作数B'对应的原子数据驻留状态更新为驻留中,将B'对应寄存器中其它原子数据的驻留状态更新为未驻留。 5. 5. 3判断是否运算关系图中所有单层二叉树都有对应的还原运算指令。如果是则执行第5. 5. 4步,否则转到第5. 5. 1步。 5. 5. 4找出局部最优还原路径并存入还原路径信息表对L中的还原运算指令序列,在其包含的所有可能的错误传播路径A — B — D…M中找出最长的错误传播路径,将最长的错误传播路径对应的还原运算指令序列作为局部最优还原路径存入还原路径信息表。第5. 5. 2步为符合条件的树产生还原运算指令的顺序并不唯一,且满足约束条件的还原运算指令也不唯一(指令B' =A' ROP C'或C' =A' ROP B'都可能是A' =B' OP C'的还原运算指令),因此第5. 5. 2步构造出的L并不唯一,对应的5. 5. 4步找出的局部最优还原路径也不唯一。 5. 6判断是否已找出所有局部最优还原路径,如果是则执行第5. 7步,否则转第5. 5步。 5. 7找出最优还原路径比较得出还原路径信息表中最长的还原运算指令序列,即得当前可还原程序块的最优还原路径。 第六步,在每个可还原程序块中插入容错指令。可还原程序块和对应的还原程序块使用的是相同的寄存器,这两个过程会分别重写其中的初态数据和终态数据,因此在还原运算时需要实现两方面的现场保护一,还原程序块还原出的初态数据需要和原始的初态数据比较来确定程序运行是否正确,因此需要在可还原运算程序重写前备份这种初态数据;二,被还原程序重写的终态数据有可能还要被以后的程序使用,因此在还原程序前要备份这种终态数据。另外还原运算完成后,还需要插入检查点指令及现场恢复指令。对于一个可还原程序块,插入容错指令的过程如下 6. 1构造初态数据备份指令找到第五步中找出的最优还原路径的最后一个错误传播点,该错误传播点即为需要备份的初态数据,分配缓冲区并产生存储指令备份需要备份的初态数据。 6. 2构造终态数据备份指令找出在最优还原路径中被重写的终态数据,基于控制流图,利用编译技术中的活跃变量分析方法,找出被重写的终态数据中在当前可还原程序块内最后两条指令之间的位置活跃的数据,产生存储指令在缓冲区备份这些活跃的且被重写的终态数据。 一个数据a在位置t处活跃是指位置t后存在指令使用数据a。
6. 3构造实现如下功能的检查点指令如果当前可还原程序块执行的是定点运算,比较备份的初态数据和还原的初态数据是否相等,如果相等则执行后面的指令,否则报告错误并跳出程序。如果当前可还原程序块执行的是浮点运算,则设定误差允许范围,并比较备份的初态数据和还原的初态数据之间的差别是否小于误差允许范围,如果是则执行后面的指令,否则报告错误并跳出程序。 6. 4构造数据恢复指令利用读指令实现从缓冲区中恢复第6. 2步备份的数据。
6. 5在可还原程序块中按下列顺序依次插入容错指令初态数据备份指令一可还原运算指令序列一终态数据备份指令一最优还原路径一检查点指令一数据恢复指令一可还原程序块最后一条指令。 第七步,将插入容错指令后的源程序编译为目标代码。在目标平台上运行此代码,实现执行程序功能和检测平台故障的双重目标。 基于本发明,用户可以改造现有的编译器,直接将源程序编译为可以容错的目标
代码。用户也可以开发独立的容错程序生成系统,输入汇编语言源程序,输出具有容错功能
的汇编程序,然后手工利用编译器编译出可以容错的目标代码。
与传统的故障检测方法相比,采用本发明可以达到以下的技术效果 (1)本发明由于第6. 5步在可还原程序块中依次插入容错指令时,将最优还原路
径插入到可还原运算指令序列之后执行,源程序和冗余程序不是在同一时间执行,而瞬时故障具有重写可恢复特点,所以本发明可以检测出瞬时故障; (2)本发明由于第五步为每个可还原程序块找出的最优还原路径中的指令是还原运算指令,还原运算指令的操作码、操作数和源程序中对应的可还原运算指令均不同,因此
12还原程序和源程序具有很大的差异性。而同一处永久性故障对不同的程序会产生不同的影响,当存在永久性故障时,还原程序还原的数据会和原始数据不同,所以本发明可以有效检测出永久性故障。 (3)本发明由于第六步在每个可还原程序块中插入的容错指令和源程序中的指令在操作码、操作数、执行时间等方面均不同,加大了源程序和冗余程序运行时的差异性,这种特点有助于避免出现源程序和冗余程序输出相同错误数据的情形,因此本发明可以提高故障检测率。
(4)本发明由于第六步在每个可还原程序块中插入的容错指令只是将源程序操作数据的位置进行调整(源操作数变为目的操作数,目的操作数变为源操作数),没有对源程序操作数据进行放大或縮小,因此本发明能够克服背景技术存在的数据溢出问题。
(5)本发明由于第6. l构造初态数据备份指令、第6. 2步构造终态数据备份指令时只备份了部分数据,而不需要复制源程序的整个存储空间,节省了存储资源。
图1是本发明的总流程图; 图2是本发明的第一步遍历源程序,对源程序进行预处理流程图; 图3是本发明的第五步为每个可还原程序块找出最优还原路径流程图; 图4是本发明的第六步在每个可还原程序块中插入容错指令流程图; 图5是本发明第5. 5步找出当前可还原程序块的局部最优还原路径并存入还原路
径信息表流程图。
具体实施例方式
图1是本发明的总流程图,主要包括以下七个步骤 1.遍历源程序,对源程序进行预处理。 2.找出源程序中的原子数据,构造原子数据表和数据指令关联表。 3.将源程序划分为若干可还原程序块,构造可还原程序块表和控制流图。 4.为每个可还原程序块构造运算关系图。 5.为每个可还原程序块找出最优还原路径。 6.在每个可还原程序块中插入容错指令。 7.将插入容错指令后的源程序编译为目标代码。 图2是本发明的第一步遍历源程序,对源程序进行预处理流程图,包括以下步骤 1.判断程序中是否存在源、目的操作数相同的指令。如果存在则执行第2步,否则转到第3步。 2.用中间数据保存指令替换源、目的操作数相同的指令 3.判断程序是否存在定点除法指令。如果存在则执行第4步,否则转到第5步。 4.在定点除法指令前插入求余指令。 5.判断程序是否存在数据传送指令。如果存在则执行第6步,否则预处理结束。 6.用加法指令替换数据传送指令。 图3是本发明的第五步为每个可还原程序块产生最优还原路径流程图,寻找一个可还原程序块的最优还原路径的步骤如下 1.检索可还原程序块表、原子数据表、数据指令关联表,找出当前可还原程序块使 用的寄存器。 2.检索数据指令关联表,找出所有初态数据。
3.检索数据指令关联表,找出所有终态数据。
4.更新原子数据表。 5.找出当前可还原程序块的局部最优还原路径并存入还原路径信息表。 6.判断是否已找出所有局部最优还原路径,如果是则执行第7步,否则转到第5
止 少。 7.找出最优还原路径比较得出还原路径信息表中最长的还原运算指令序列,即 得当前可还原程序块的最优还原路径。 图4是本发明的第六步在每个可还原程序块中插入容错指令流程图,在一个可还 原程序块中插入容错指令的步骤如下 1.从当前可还原程序块的还原路径信息表中读出最优还原路径,基于最优还原路 径找出需要备份的初态数据,构造初态数据备份指令。
2.从当前可还原程序块的还原路径信息表中读出最优还原路径,基于最优还原路
径找出被重写的终态数据,基于控制流图,分析出被重写的终态数据中活跃的数据,为这些
数据构造终态数据备份指令。
3.构造检查点指令。 4.构造数据恢复指令。 5.在可还原程序块中按下列顺序依次插入容错指令初态数据备份指令一可还 原运算指令序列一终态数据备份指令一最优还原路径一检查点指令一数据恢复指令一可 还原程序块最后一条指令。 图5是本发明第5. 5步找出当前可还原程序块的局部最优还原路径并存入还原路 径信息表流程图。包括步骤如下 1.根据原子数据表中数据的驻留信息找出备选的单层二叉树。 2.从备选的单层二叉树中选择符合条件的树,并为选择出的树产生还原运算指
令。将产生的还原运算指令按产生的顺序加入临时还原指令表L。并在原子数据表中,将还
原运算指令的目的操作数B'对应的原子数据驻留状态更新为驻留中,将B'对应寄存器
中其它原子数据的驻留状态更新为未驻留。 3.判断是否运算关系图中所有单层二叉树都有对应的还原运算指令。如果是则执 行第4步,否则转到第1步。 4.找出局部最优还原路径并存入还原路径信息表对L中的还原运算指令序列, 在其包含的所有可能的错误传播路径A — B — D…M中找出最长的错误传播路径,将最长的 错误传播路径对应的还原运算指令序列作为局部最优还原路径存入还原路径信息表。
权利要求
一种基于还原程序的硬件故障检测方法,其特征在于包括以下步骤第一步,遍历源程序,对源程序进行预处理,方法是1.1判断源程序中是否存在源、目的操作数相同的指令,即形如以下操作的指令R=R OP R1,OP表示一个可还原运算指令对应的操作码,R和R1均为寄存器,如果存在则执行第1.2步,否则转第1.3步;1.2用中间数据保存指令R2=R+0,R=R2 OP R1替换源、目的操作数相同的指令R=R OP R1,R2为新分配的寄存器;1.3判断源程序是否存在定点除法指令,如果存在则执行第1.4步,否则转第1.5步;1.4在定点除法指令前插入求余指令,利用求余指令rem=R1%R2保存除法操作的余数;1.5判断源程序是否存在数据传送指令,即形如以下操作的指令R1=R2,如果存在则执行第1.6步,否则转第二步;1.6用加法指令R1=R2+0替换数据传送指令R1=R2;第二步,找出源程序中的原子数据,构造原子数据表和数据指令关联表,方法是找出源程序中作为寄存器型操作数和立即操作数的原子数据;原子数据是指由寄存器、存储器等存储单元记录、在指令中不可再分的数据,数据指令关联表存放每条可还原运算指令及其操作的原子数据信息,包括指令编号及作为源、目的操作数的原子数据编号;这一步包括以下步骤2.1寻找源程序中的原子数据,构造原子数据表,方法如下2.1.1将源程序中不同的立即操作数确定为不同的原子数据,为不同的原子数据分配不同的原子数据编号,并将每个原子数据的以下信息存入原子数据表原子数据编号,驻留寄存器,驻留状态;其中,驻留寄存器信息设置为空,驻留状态设置为驻留中;2.1.2对源程序中目的操作数为寄存器类型的指令,将指令向目的操作数寄存器中写入的数据确定为原子数据,为不同的原子数据分配不同的原子数据编号,并将每个原子数据的以下信息存入原子数据表原子数据编号,驻留寄存器,驻留状态;其中,一个原子数据a的驻留寄存器即为指令写入a的寄存器,每个原子数据驻留状态信息设置为未驻留;2.2构造数据指令关联表,具体方法如下2.2.1对于任意一条可还原运算指令I,将指令向目的操作数寄存器写入的原子数据确定为I的目的操作数对应的原子数据;2.2.2若指令I的一个源操作数B是立即操作数,则将立即操作数对应的原子数据确定为B对应的原子数据;2.2.3若指令I的一个源操作数C是寄存器操作数,则从当前指令向前寻找最近向该寄存器中写入数据的指令,将找到的这条指令写入的原子数据确定为C对应的原子数据;2.2.4判断是否已找出所有可还原运算指令的目的操作数和源操作数对应的原子数据,如果是则将可还原运算指令的指令编号、目的操作数对应的原子数据编号、源操作数对应的原子数据编号存放到数据指令关联表,执行第三步,否则转第2.2.1步;第三步,将源程序划分为若干可还原程序块,构造可还原程序块表和控制流图;可还原程序块是顺序执行的可还原运算指令的极大集合,控制流只能从可还原程序块的入口和出口进出,并且可还原程序块内除最后一条指令外都必须是可还原运算指令;可还原程序块表则专门存放每个可还原程序块的信息,包括可还原程序块的块编号、入口和出口地址;控制流图是以可还原程序块为结点,以可还原程序块之间的控制流关系为边的图;插入到每个可还原程序块内的还原运算指令序列定义为对应的还原程序块;这一步包含如下步骤3.1确定各个可还原程序块的入口指令;3.2对每个入口指令,确定其对应的出口指令;3.3每个入口指令和其对应的出口指令之间的程序块为一个可还原程序块,为每个可还原程序块分配一个块编号,并将块编号和入口、出口地址存入可还原程序块表;3.4构造程序的控制流图,方法是分析每个可还原程序块的出口指令,如果是转移指令,则存在当前可还原程序块到转移目标所在的可还原程序块之间的控制流关系;如果不是转移指令,则存在当前可还原程序块到下一条指令所在的可还原程序块之间的控制流关系;将可还原程序块作为结点,如果一个结点到另一个结点有控制流关系,则产生前一个结点到后一个结点的一条有向边;第四步,为每个可还原程序块构造运算关系图,运算关系图以单层二叉树为基本构件,反映可还原程序块内原子数据之间的运算关系;单层二叉树是只含一个父结点和其子结点的二叉树,即高度为2的二叉树;一个可还原程序块的运算关系图的构造方法是4.1对可还原程序块内的每条可还原运算指令,查找数据指令关联表,得出其源、目的操作数对应的原子数据编号,分别为每条可还原运算指令构造一棵单层二叉树,父结点代表目的操作数信息元组,包括目的操作数对应的原子数据编号,当前指令编号,子结点代表源操作数信息元组包括源操作数对应的原子数据编号,当前指令编号;4.2结合数据指令关联表,查找可还原程序块内所有具有如下关系的可还原运算指令对一条指令I1的源操作数B对应的原子数据编号和另一条指令I2的目的操作数对应的原子数据编号相同;对每个这样的指令对,将指令I2的二叉树作为一个结点替代指令I1的二叉树中源操作数B对应的子结点,这样,I1和I2的二叉树合并得到一个子图;4.3结合数据指令关联表,查找可还原程序块内所有具有如下关系的可还原运算指令对一条指令I1的源操作数B对应的原子数据编号和另一条指令I2的某个源操作数对应的原子数据编号相同;对每个这样的指令对,在对应的两个二叉树中,将B对应的子结点作为两个二叉树的公共子结点,同时删除I2对应的二叉树中原子数据编号和B相同的子结点,这样,I1和I2的二叉树合并成为一个子图;4.2和4.3所得的子图和其它单层二叉树一起构成可还原程序块的运算关系图;第五步,为每个可还原程序块找出最优还原路径即包含还原运算指令最多的还原路径,步骤如下5.1找出当前可还原程序块使用的寄存器在可还原程序块表中查找当前块的入口和出口,确定当前可还原程序块中包含的指令,然后在数据指令关联表中查找出当前可还原程序块中包含的指令关联的所有原子数据,最后在原子数据表中找出这些原子数据驻留的寄存器,找出的寄存器即称为当前可还原程序块使用的寄存器;5.2找出所有初态数据对每一个当前可还原程序块使用的寄存器R,查找可还原程序块内第一个使用寄存器R的指令,将该指令中R对应的原子数据定义为当前可还原程序块的初态数据,利用数据指令关联表找出所有初态数据;5.3找出所有终态数据对每一个当前可还原程序块使用的寄存器R,查找可还原程序块内最后一个使用寄存器R的指令,将该指令中R对应的原子数据定义为当前可还原程序块的终态数据,利用数据指令关联表找出所有终态数据;5.4更新原子数据表在原子数据表中,将所有终态数据对应的寄存器驻留状态设置为驻留中,将除立即操作数外的所有非终态数据的驻留状态设置为未驻留;5.5按以下步骤找出当前可还原程序块的局部最优还原路径并存入还原路径信息表;一个可还原程序块的多个还原路径构成集合S,局部最优还原路径是S的某个子集的最优还原路径,可还原程序块的最优还原路径是所有局部最优还原路径中最优的;5.5.1检索当前可还原程序块的运算关系图,从尚未产生还原运算指令的单层二叉树中找出当前所有满足下述特征的单层二叉树作为备选的单层二叉树设一个单层二叉树的父结点和子结点分别为A、B、C,对应的操作是A=B OP C,A结点对应的原子数据的寄存器驻留状态为驻留中,且B、C中至少有一个结点对应的原子数据的寄存器驻留状态为驻留中;5.5.2从备选的单层二叉树中选择符合条件的树A′=B′OP C,并为选择出的树产生还原运算指令B′=A′ROP C′,将产生的所有还原运算指令按产生的顺序加入临时还原指令表L,并将原子数据表中还原运算指令的目的操作数B′对应的原子数据驻留状态更新为驻留中,将B′对应寄存器中其它原子数据的驻留状态更新为未驻留;5.5.3判断是否运算关系图中所有单层二叉树都有对应的还原运算指令,如果是则执行第5.5.4步,否则转到第5.5.1步;5.5.4找出局部最优还原路径并存入还原路径信息表对L中的还原运算指令序列,在其包含的所有可能的错误传播路径A→B→D…M中找出最长的错误传播路径,将最长的错误传播路径对应的还原运算指令序列作为局部最优还原路径存入还原路径信息表;5.6判断是否已找出所有局部最优还原路径,如果是则执行第5.7步,否则转第5.5步;5.7找出最优还原路径比较得出还原路径信息表中最长的还原运算指令序列,即得当前可还原程序块的最优还原路径;第六步,在每个可还原程序块中插入容错指令,过程如下6.1构造初态数据备份指令找到第五步中找出的最优还原路径的最后一个错误传播点,该错误传播点即为需要备份的初态数据,分配缓冲区并产生存储指令备份需要备份的初态数据;6.2构造终态数据备份指令找出在最优还原路径中被重写的终态数据,基于控制流图,利用编译技术中的活跃变量分析方法,找出被重写的终态数据中在当前可还原程序块内最后两条指令之间的位置活跃的数据,产生存储指令在缓冲区备份这些活跃的且被重写的终态数据;一个数据a在位置t处活跃是指位置t后存在指令使用数据a;6.3构造实现如下功能的检查点指令如果当前可还原程序块执行的是定点运算,比较备份的初态数据和还原的初态数据是否相等,如果相等则执行后面的指令,否则报告错误并跳出程序;如果当前可还原程序块执行的是浮点运算,则设定误差允许范围,并比较备份的初态数据和还原的初态数据之间的差别是否小于误差允许范围,如果是则执行后面的指令,否则报告错误并跳出程序;6.4构造数据恢复指令利用读指令实现从缓冲区中恢复第6.2步备份的数据;6.5在可还原程序块中按下列顺序依次插入容错指令初态数据备份指令→可还原运算指令序列→终态数据备份指令→最优还原路径→检查点指令→数据恢复指令→可还原程序块最后一条指令;第七步,将插入容错指令后的源程序编译为目标代码,在目标平台上运行此代码,实现执行程序功能和检测平台故障。
2. 如权利要求1所述的一种基于还原程序的硬件故障检测方法,其特征在于所述可还 原运算指令是指程序中的加、减、乘、除、左移、右移、异或和同或运算指令,减、加、除、乘、右 移、左移、异或和同或运算指令分别为加、减、乘、除、左移、右移、异或和同或运算指令的还 原运算指令。
3. 如权利要求1所述的一种基于还原程序的硬件故障检测方法,其特征在于所述可还 原程序块的入口指令是參程序的第一条指令;或者參条件转移指令或无条件转移指令跳转到的指令;或者 參紧跟在条件转移指令后面的指令;或者參紧跟在非可还原运算指令后的指令,非可还原运算指令不包括新插入的求余指令。
4. 如权利要求1所述的一种基于还原程序的硬件故障检测方法,其特征在于每个入口 指令的出口指令是參入口指令后除当前入口指令外的第一个入口指令前的指令;或者參入口指令后的第一个转移指令;或者參程序的结束指令。
5. 如权利要求1所述的一种基于还原程序的硬件故障检测方法,其特征在于从备选的 单层二叉树中选择符合条件的树A' =B' 0P C',并为选择出的树产生还原运算指令B' =A' R0P C'的约束如下參还原运算指令的源操作数A' 、C'对应的原子数据的驻留状态必须为驻留中; 參还原运算指令的目的操作数B'对应的原子数据不能为立即操作数;參如果B'关联的寄存器已有一个不同的原子数据d处于驻留中,且还没有为所有包 含结点d的单层二叉树产生还原运算指令,则不能为当前的单层二叉树对应的操作A'= B' OP C'产生还原运算指令;參如果B'或C'同时是运算关系图中其它单层二叉树的子结点,即B'或C'是两个 二叉树的公共子结点,则先后为这两个单层二叉树产生的还原运算指令II、 12要满足B' 或C'要作为I1的目的操作数和I2的源操作数出现。
6. 如权利要求1所述的一种基于还原程序的硬件故障检测方法,其特征在于错误传 播点是指对于源程序中的一个可还原运算操作C = A OP B,其还原运算操作可以是A = CROP B,这个操作还原了数据A,但数据C和B的错误及这次运算的错误也传播到了数据A, 称A为此次运算的错误传播点;若还原程序以A为源操作数,继续进行别的还原运算,则错 误会经A传向下一个错误传播点,继续这个过程得到的还原运算操作序列称为一个还原路 径,对应的所有错误传播点则构成了一个错误传播路径。
全文摘要
本发明公开了一种基于还原程序的硬件故障检测方法,目的是加大源程序和冗余程序运行时的时空差异性,克服数据溢出等问题,提高瞬时故障和永久性故障的故障检测率。技术方案是遍历源程序,对源程序进行预处理后,找出源程序中的原子数据,构造原子数据表和数据指令关联表;接着将源程序划分为若干可还原程序块,构造可还原程序块表和控制流图,并为每个可还原程序块构造运算关系图;然后为每个可还原程序块找出最优还原路径;最后在每个可还原程序块中插入容错指令,将插入容错指令后的源程序编译为目标代码。采用本发明可以检测出瞬时故障和永久性故障,提高故障检测率,克服数据溢出问题,且节省存储资源。
文档编号G06F11/36GK101751334SQ200910226770
公开日2010年6月23日 申请日期2009年12月30日 优先权日2009年12月30日
发明者周会平, 宁洪, 徐建军, 徐锡山, 李建立, 谭兰芳, 谭庆平 申请人:中国人民解放军国防科学技术大学