一种基于线形汇编指令差异性变换的dsp软错误检测方法

文档序号:10654398阅读:289来源:国知局
一种基于线形汇编指令差异性变换的dsp软错误检测方法
【专利摘要】本发明公开了一种基于线形汇编指令差异性变换的DSP软错误检测方法,目的是解决现有DSP软错误检测方法性能开销大的问题。技术方案是将程序划分为无存基本块,构建程序控制流图,识别出循环,筛选出可编排软件流水的循环;对程序进行加固,为程序添加错误检测指令,采用指令差异性变换方法对部分指令进行等价性变换,对其余指令进行复算,并在存储指令及跳转指令前插入检测指令,利用DSP指令条件执行的特点及等价变换方法优化检测指令,针对可编排软件流水的循环采用延迟错误处理方法降低加固带来的性能开销;执行加固后的程序,检测发生在运行时的软错误。本发明是一种纯软件的DSP加固方法,对数据错误的检测率高,且加固的性能开销低。
【专利说明】
-种基于线形汇编指令差异性变换的DSP软错误检测方法
技术领域
[0001 ] 本发明设及一种针对数字信号处理器DSP(Digital Si即al Processor)程序的错 误检测方法,尤其是针对空间高能粒子福射引发的软错误进行检测的方法。
【背景技术】
[0002] 近年来,随着集成电路工艺技术的发展,处理器设计人员采用越来越高的时钟频 率、越来越低的电压水平W及越来越小的工艺尺寸。运些技术在带来更高性能与更低功耗 的同时,也使得处理器对瞬态故障更加敏感,威胁到程序执行的正确性。运些瞬态故障通常 是由外部环境中高能粒子福射和电压扰动、电磁干扰等诱发。与永久性故障导致的硬件错 误相比,运种错误具有瞬态、发生时间和位置随机、可恢复等特点,因此被称为"软错误"。工 程人员提出了很多技术来处理软错误的问题,运些技术主要可分为两类:硬件技术和软件 技术。
[0003] 硬件技术主要采用体系结构冗余的思想实现容错。例如,一些存储结构比如缓存 和内存包含ECC化rror Correcting Code),可W用来检测甚至改正错误,此外较为常用的 错误校验码技术还包括抓AC,它们是通过设置冗余的二进制位来实现的。也可W通过设置 专口的硬件检测电路实现容错,如采用专用处理器来检测总线上数据正确性的看口狗技术 WatchDog。在一些可靠性要求较高的系统中,TMR(Triple-Modular Redundancy)应用比较 广泛,它通过=个同时工作的部件W投票的形式实现错误的检测和恢复,是部件级别的冗 余。硬件容错技术思想简单,可W显著的提高系统的可靠性,但同时会在体积、功耗等方面 引入巨大的硬件开销,运在很多嵌入式系统的设计中是无法接受的。
[0004] 为了缓解硬件容错技术硬件开销大的问题,同时也是对硬件容错技术更好的完善 和拓展,软件容错技术成为了研究热点。软件容错技术,也称为软加固技术。计算机发展的 历史表明,很多原本用硬件实现的方法同样可W用软件实现。随着处理器性能的极大提升, 在满足时间约束的前提下,通过程序复算牺牲部分性能来换取高可靠性的软件容错技术展 现出了很强的吸引力。
[0005] 软件容错技术包括错误检测、定位、回复等技术,其中错误检测是错误定位和恢复 的基础。空间福射环境中的单粒子效应可能改变寄存器、存储器、Cache中存储的数据、运算 单元执行结果,导致执行结果出错,运一类软错误属于数据错误。数据错误主要通过指令复 算的方式实现错误检测,其检测原理如下:由于软错误具有瞬时性、偶发性和随机性等特 点,指令同一时间在不同功能部件上多次执行,或者不同时间在相同功能部件上多次执行 的过程中,发生相同错误的概率非常低,因此将运多次执行的结果进行比较,若相符则认为 指令执行结果正确,否则说明至少在一次执行过程中发生了软错误。通过指令复算,一般可 W检测出瞬时故障导致的软错误。
[0006] 2002年《I趾E Transactions on Reliability》第51卷第1期发表的作者为 Stanf ord大学CRC实验室的N. Oh、P. P. Shirvani、E. J. McCluskey 的论文巧rror detect ion by duplicated instructions in super-scalar processors"提出的EDDI方法是常用的 数据流检错方法。抓DI通过复制程序指令来实现冗余,进而通过插入点比较来实现容错。故 障注入实验表明:使用抓DI后,程序的平均出错概率从20%下降到1.5% W下。抓DI方法的 基本步骤是:
[0007] 第一步,将程序划分为N个无存基本块SBBi,SBB2,…SBBn的序列,N为正整数,无存 基本块是程序中能够顺序执行的指令序列的集合,运组指令序列只有最后一条指令可W是 存储指令或程序控制指令,运组指令只有一个入口和一个出口,入口就是第一条指令,出口 就是最后一条指令。划分无存基本块序列的具体步骤是:
[000引1.1确定程序的每个无存基本块的入口指令,它们是:
[0009] ?程序的第一条指令;或者
[0010] ?存储指令、条件转移指令或无条件转移指令跳转到的指令;或者
[0011] ?紧跟在存储指令、转移指令或函数调用后面的指令;或者
[0012] ?被调用函数的第一条指令。
[001引1.2对每个入口指令,确定其对应的出口指令,它鳩:
[0014] ?入口指令后除当前入口指令外的第一个入口指令前的指令;或者
[0015] ?入口指令后的第一个存储指令、转移指令或函数调用指令;或者
[0016] ?程序的结束指令。
[0017] 1.3分别将每个入口指令和其对应的出口指令之间的程序块划分为一个无存基本 块。
[0018] 第二步,对程序进行加固,即为每个无存基本块添加合适的复算指令或检测指令, 复算指令与原指令具有相同的指令码,复算指令中的操作数为原指令中操作数的副本,具 体做法为:
[0019] 2.1 令 il = l。
[0020] 2.2在SBBii除最后一条指令外的每一条指令后面插入对应的复算指令。
[0021 ] 2.3若SBBii最后一条指令不为跳转指令或存储指令,则在运条指令后面插入对应 的复算指令,转2.6。
[0022] 2.4若SBBii最后一条指令为存储指令,则在运条指令前插入第一检测指令(第一检 测指令的功能是检测存储指令的数据、内存地址、偏移量、指令执行条件等变量原始数据与 副本数据是否一致,不一致则表示检测到错误),转2.6。
[0023] 2.5若SBBii最后一条指令为跳转指令,则在运条指令前插入第二检测指令(第二检 测指令的功能是检测跳转指令的指令执行条件、内存地址等变量原始数据与副本数据是否 一致,不一致则表示检测到错误),转2.6。
[0024] 2.6il = il+l。
[0025] 2.7判断il是否大于N,若是则执行第S步,否则转第2.2步。
[0026] 第=步,执行加固后的程序,检测发生在运行时的软错误,具体步骤为:
[0027] 3.1若加固后的程序执行过程中没有发生单粒子翻转等原因导致的软错误,则原 指令和副本指令具有相同的执行结果,加固后的程序不会检测到错误,加固后的程序正常 执行与加固前的执行结果相同,转第四步。
[0028] 3.2若加固后的程序执行过程中发生单粒子翻转等原因导致的软错误,使得原指 令与副本指令执行结果不同,贝阳日固后的程序检测到此软错误,转第四步。
[0029] 第四步,结束。
[0030] CRC实验室在抓DI基础上引入数据差异性概念(Data Diversity),于2002年在 《IEEE Transactions on Computer》第51 卷第2其月发表论文(屯〇4;[:Error Detection by Diverse Data and Duplicated Instructions"提出邸4I方法。邸4I与邸DI方法在步骤上基 本相同,但其中的SI不再是MI的单纯复制,而是将MI中的输入数据乘W-个差异因子k作为 SI中的输入数据,若输出数据依然保持k倍的关系,则认为指令执行过程中没有发生错误。 由于数据差异因子的引入,使得抓4I可W检测一部分持续性故障和永久性故障。数据差异 因子的选择对邸4I方法的故障检测能力影响很大,最优k值也难W求出。另外,数据都乘Wk 倍可能会导致数据溢出的问题。原文章建议将k值选为-1,即将所有数据求反,但论证结果 表明很多时候-1并不是最佳差异因子。虽然抓4I方法在抓DI方法的基础上进一步提高了错 误检测率,但也引入了更多的性能开销。
[0031] 2008年国防科技大学李建立的硕±学位论文《空间福射环境下软件实现的硬件故 障检测技术研究》中第S章提出了基于逆向恢复的故障检测方法抓CC化rror Detection by Converse Computing),思想也是对SI做差异性变换,W提高软错误检测率和检测永久 性故障错误的能力。EDCC方法的主要原理是计算的可逆性,通过对程序进行逆向恢复运算, 使得SI变成与MI完全不同的指令,增加了指令之间的差异性,达到最大限度暴露故障的目 的,提高了故障检测率,同时克服了ED4I数据溢出的问题。但逆向恢复运算都是针对运算指 令进行的,对于运算操作比例不高的程序,EDCC会插入很多比较指令却只能检测相对较少 的运算错误,故障检测能力因此会有所下降。
[0032] 高性能数字信号处理器DSP由于其处理复杂信号能力强、灵活性高等优点,已经越 来越多地应用到星载信号处理系统中。然而,高性能DSP空间应用受到了可靠性的制约。空 间探测活动投入大、风险高,对可靠性有着极高的要求。太空中影响空间探测器安全的主要 因素是宇宙射线的福射,因为运些宇宙射线中的高能带电粒子流会使电子器件出现硬件故 障,因此航天应用等特殊领域需要针对DSP程序进行容错加固。
[0033] 从并行处理的角度分析,新型的TMS320C6000系列DSP的主要特点是采用了超长指 令字化IW(Very Long Instruction Words)的体系结构。在C6000片内共有8个并发工作的 功能单元,单指令字长为32M t,8条指令组成一个指令包,一个指令包字长为256M t。忍片 内部设置了专口的指令分配模块,可W将25化it的指令包同时分配给8个功能单元,一个周 期最多可W同时执行8条指令。VLIW结构中,指令并行性和数据传送完全是在编译时确定 的,运与运行时的资源调度和同步不同,运种结构中每条指令的等效周期数很低,即运行速 度很快。VLIW结构中指令获取、指令分配、指令执行、数据存储等阶段需要进行多级流水,不 同指令执行的流水延迟时间也不相等。运种深流水线给编程和编译带来困难,指令安排稍 有不当将破坏流水线,使得性能下降。因此化IW结构执行代码效率很大程度上取决于程序 中循环的软件流水排布。
[0034] 为了提高程序的性能,可W将程序用线形汇编实现。线形汇编是一种TUTexas Instrument)公司提供的CCS(Code Composer Sl:udio)环境支持的可用于DSP平台的编程语 言。线形汇编使用汇编指令集,但因其不用指定所使用的功能单元、物理寄存器W及指令并 行,所W更加利于编程实现。线形汇编代码经过汇编器编译可生成最终执行的高度并行的 汇编代码。在编译过程中,汇编器为线形汇编指令分配物理寄存器、指定运行的功能单元, 为循环编排软件流水线。线形汇编代码经过汇编器编译后可W生成高度并行的汇编代码。
[0035] 传统的指令级错误检测方法针对编译后的目标代码进行加固。编译后的DSP汇编 代码并行度很高,若插入加固指令很有可能破坏DSP软件流水线,致使性能显著降低。且编 译后的程序几乎占用了所有的物理寄存器和功能单元,在此基础上很难插入加固指令。因 此,使用传统的针对目标代码的指令级错误检测方法很难对DSP程序进行软加固。
[0036] 如何解决DSP软加固问题是本领域技术人员极为关注的热点问题。但总的来说, DSP程序的软错误检测方法还存在W下几个方面的问题:
[0037] (1)加固后的程序可能破坏DSP的软件流水线,使得程序运行时间开销显著提高。
[0038] (2)复算指令和原指令具有相同的指令码,使用相同的功能单元,容易形成流水线 堵塞,降低程序运行速度。
[0039] (3)无法检测出发生在指令译码单元和功能单元中的软错误,因为复算指令和原 指令具有相同的指令码,使用相同的功能单元,若错误会导致原数据和副本数据发生相同 的错误结果。
[0040] 因为已有软件实现的软错错误检测方法在DSP中存在上述问题,必须研究检测效 率更高而对程序本身性能影响较小的软错误检测方法。

【发明内容】

[0041] 本发明要解决的技术问题是,克服已有的软错误检测方法不适用于DSPW及基于 源代码级方法执行性能开销大的问题,提供一种基于线形汇编指令差异性变换的DSP软错 误检测方法,将线形汇编源程序转换为具有软错误检测能力的线形汇编程序,通过=大指 令差异性变换方法:指令等价变换、优化检测指令、延迟错误处理,显著提高加固后代码的 执行效率,同时增加指令之间的差异性,达到最大限度暴露故障的目的,提高软错误检测 率。指令等价变换方法是对DSP线形汇编指令进行语义等价变化,用执行时间短的指令替换 执行时间长的指令,用可分配功能单元多的指令替换可分配功能单元少的指令,显著降低 加固的性能开销,同时增加指令码的差异性。优化检测指令方法是在检测指令中用异或指 令XOR取代比较指令CMPEQ来进行检测(因 XO財目较于CMPEQ更利于功能单元的分配和软件流 水线的编排),同时利用DSP指令条件执行的特点,将同一组检测指令中的若干跳转指令合 并为一条跳转指令,从而显著降低加固的性能开销。延迟错误处理方法是针对可被编译优 化的循环,使用一个寄存器邸ROR记录循环内部检测到的错误,并将运些错误延迟到循环结 束再处理,从而显著降低加固的性能开销。
[0042] 本发明的技术方案是:针对原始线形汇编程序,将程序划分为无存基本块序列;W 无存基本块序列构建程序控制流图;基于程序控制流图,识别出循环,并筛选出可编排软件 流水的循环,为运种循环的基本块做标识;对程序进行加固,为每个无存基本块添加错误检 测指令,采用指令差异性变换方法,对部分指令进行等价性变换,用执行时间短的指令替换 执行时间长的指令,用可分配功能单元多的指令替换可分配功能单元少的指令,对其余指 令进行复算,并在存储指令W及跳转指令前插入检测指令,利用DSP指令条件执行的特点W 及等价变换方法优化检测指令,并针对标识循环的基本块采用延迟错误处理方法,降低加 固带来的性能开销;执行加固后的程序,检测发生在运行时的软错误。
[0043] 具体技术方案为:
[0044] 第一步,将程序划分为N个无存基本块SBBi,SBB2,…SBBn的序列,具体方法与背景 技术所述邸DI方法第一步相同。
[0045] 第二步,基于无存基本块序列SBBi,SBB2,…SBBn,构造程序控制流图G(V,E),V为节 点集合,取值为Vi,V2,一Vm, V功程序的入口节点,Vm为程序的出口节点,E为边集合。具体过 程为:
[0046] 2.1将每个无存基本块作为G (V,E)的一个节点。
[0047] 2.2令i2 = 1。2.3判断SBBu最后一条指令的类型,若为无条件跳转指令则执行第 2.4步,若为条件跳转指令则执行第2.5步,若为函数调用指令则执行第2.7步,否则为普通 指令,执行第2.6步。
[004引2.4在G (V,E)中添加一条节点SBBi2到转移目标所在的基本块节点的有向边,转2.8 步。
[0049] 2.5在6(¥,6)中添加一条节点58812到转移目标所在的基本块节点的有向边,并且 添加一条节点58812到节点58812+1的有向边,转2.8步。
[0050] 2.6在6八6)中添加一条节点58812到节点58812+1的有向边,转第2.8步。
[0051 ] 2.7在G(V,E)中从SBBi2向被调用函数的入口无存基本块画一条有向边,并且从被 调用函数的退出无存基本块向SBBi2+i画一条有向边,表示函数返回的控制流转移,转2.8 步。
[0化2] 2.8i2 = i2+l。
[0053] 2.9判断i2是否大于N,若是则得到G(V,E),执行第S步,否则执行第2.3步。
[0054] 第=步,基于G(V,E),找到程序中所有可被编译优化的循环,并为运些循环的无存 基本块做标识。可被编译优化的循环即除了循环的第一个无存基本块外没有循环外部到其 内部的控制流转移,且除了循环的最后一个无存基本块外没有循环内部到外部的控制流转 移,体现在控制流图上即循环除头节点具有多个入度外,其余节点入度为1,除尾节点具有 多出度外,其余节点出度为1。运一步的具体过程为:
[0055] 3.1从Vi开始采用深度优先捜索遍历G(V,E),得到一个树形结构T,T的叶节点是程 序执行结束的节点或者是G(V,E)的深度优先捜索已经遍历过的节点。具体步骤为:
[0化6] 3.1.1建立树结构T,令根节点为Vo。
[0057] 3.1.2令¥13 = ¥1,¥14 = ¥〇。
[0化引 3.1.3将Vi3加入树形结构T,作为T中Vi4的子节点。
[0059] 3.1.4判断Vi3是否遍历过,若是则执行第3.1.5步,否则执行第3.1.6步。
[0060] 3.1.5令Vi3=Vi4, Vi4=Vi4 在T 中的父节点。
[0061] 3.1.6判断是否有从Vi3出发未被访问的路径,若有则执行第3.1.7步,否则执行第 3.1.8 步。
[00创 3.1.7令Vi4 = Vi3,Vi3 = Vi3通过运条路径连接的节点,执行第3.1.3步。
[00创 3.1.8判断Vi3是否等于Vi,若是则表示得到了 T,转3.2步,否则执行第3.1.9步。
[0064] 3.1.9令¥13 = ¥14,心=¥14在1'中的父节点,执行第3.1.6步。
[0065] 3.2遍历树形结构T,得到T中所有叶节点^山,…,Lni, Nl为T中叶节点的个数。
[0066] 3.3从每个叶节点开始,向上捜索,若一个叶节点和它的某个祖先结点相同,则找 到该祖先节点到此叶节点的循环,将找到的循环存放在集合LOOP中。运一步的具体步骤为:
[0067] 3.3.1令巧=I,集合LQOP= 0。
[006引 3.3.2令Lf =以5的父节点。
[00例 3.3.3判断Lf是否等于LiS,若不等于则转3.3.4,若等于则找到一条从Lf到LiS的循 环,加入到集合LOOP中。
[0070] 3.3.4判断Lf是否等于树T的根节点Vq,若是则巧二巧+1,转3.3.5步,否则令Lf = Lf 在T中的父节点,执行第3.3.3步。
[0071] 3.3.5判断巧是否大于NI,若是则表示捜索完毕,得到了 LOOP,执行3.4步,否则执 行第3.3.2步。
[0072] 3.4从集合LOOP中筛选出可被编译优化的循环,并为运些循环的无存基本块做标 识。可被编译优化的循环是指在G(V,E)中除头节点具有多个入度外,其余节点入度为1,除 尾节点具有多出度外,其余节点出度为1的循环。具体步骤为:
[0073] 3.4.1判断LOOP是否为空集,若是则执行第四步,否则执行第3.4.2步。
[0074] 3.4.2选取LOOP 中的一个循环 1 i,LOOP = LOOP- {1 i}。
[0075] 3.4.3判断Ii是否可被编译优化,若不可则转第3.4.1步,若可被编译优化,执行 3.4.4 步。
[0076] 3.4.4为每个属于1 i的无存基本块做标识L,且为1 i的第一个和最后一个无存基本 块分别做标识H和T,转3.4.1步。
[0077] 第四步,对程序进行加固,即为无存基本块序列SBBi,SBB2,一SBBn添加合适的复算 指令和检测指令,添加的检测指令都采用优化检测指令方法进行优化W减少引入的跳转指 令,降低加固带来的性能开销。对于可被编译优化的循环采用延迟错误处理方法降低加固 带来的性能开销。第四步的具体过程为:
[007引 4.1 令 16 = 1。
[0079] 4.2对SBBiS除最后一条指令外的所有源程序指令MI,生成相应的副本指令SI插入 到对应的MI指令后面,采用指令等价变换方法对W下所述指令进行指令差异性复算,提高 错误检测能力,用执行时间短的指令替换执行时间长者,用可分配功能单元多的指令替换 可分配功能单元少的指令,降低加固带来的性能开销,令寄存器Al_c为寄存器Al的副本,令 寄存器42_〇为寄存器A2的副本,自然数n为立即数,其具体过程为:
[0080] 4.2.1若MI为''SUBAl,n,A2",贝lJSI等价变换为''A孤Al_c,-n,A2_c",转4.3。
[0081 ] 4.2.2若MI为''MPYAl,化,A2",贝lJSI等价变换为''甜LAl_c,n,A2_c",转4.3。
[0082] 4.2.3若11为11¥41,42",贝化1等价变换为"400 41_。,0,42_。",转4.3。
[0083] 4.2.4就〇为'证30 41",则51等价变换为乂〇?41_(3,0,31,41_(3",转4.3。
[0084] 4.2.5若MI为''ANDAl,2n-l,A2",则SI等价变换为乂LRAl_c,n,31,A2_c",转4.3。
[0085] 4.2.6若11为'伽41,2。"-1,42",贝化1等价变换为''沈141_。,0,11,42_。",转4.3。
[0086] 4.2.7若MI为''0RAl,2n,A2",现JSI等价变换为''SETAl_c,n,n,A2_c",转4.3。
[0087] 4.2.8若MI为。CMPGTAl,A2,A3",则SI等价变换为。CMPLTA2_c,Al_c,A3_c",转 4.3。
[008引 4.2.9若MI为。CM化TAl,A2,A3",则SI等价变换为。CMPGTA2_c,Al_c,A3_c",转 4.3。
[0089] 4.2.10若MI为"CMPGT2A1,A2,A3",则SI等价变换为"CMPLT2A2_c,Al_c,A3_c",转 4.3。
[0090] 4.2.11若MI为"CMPLT2A1,A2,A3",则SI等价变换为"CMPGT2A2_c,Al_c,A3_c",转 4.3。
[0091 ] 4.2.12若MI为"CMPGTU4A1,A2,A3",则SI等价变换为"CMPLTU4A2_c,Al_c,A3_c", 转 4.3。
[0092] 4.2.13若11为^^1;1'1]441,42,43",则51等价变换为^^61'1]442_。,41_〇,43_。", 转 4.3。
[0093] 4.2.14若MI为。CMPGTSPAl,A2,A3",则SI等价变换为。CM化TSPA2_c,Al_c,A3_ 〇',转4.3。
[0094] 4.2.15若MI为。CM化TSPAl,A2,A3",则SI等价变换为。CMPGTSPA2_c,Al_c,A3_ 〇',转4.3。
[0095] 4.2.16若MI为乂MPGTDPAl,A2,A3",则SI等价变换为乂MPLTDPA2_c,Al_c,A3_ 〇',转4.3。
[0096] 4.2.17若MI为乂MPLTDPAl,A2,A3",则SI等价变换为乂MPGTDPA2_c,Al_c,A3_ 〇',转4.3。
[0097] 4.2.18若MI不为W上17种情况,则SI与MI使用相同的指令码,SI中的操作数为MI 中操作数的副本,转4.3。
[0098] 4.3判断SBBiS是否具有标志L,若没有,执行第4.4步,若具有标志L,执行第4.5步。
[0099] 4.4SBBi6不具有标志L,表示此基本块所在的循环无法经编译器排出软件流水线, 按W下方法添加复算指令,其具体过程为:
[0100] 4.4.1判断SBBis最后一条指令的类型,若为存储指令,转4.4.3,若为跳转指令,贝U 转4.4.4,既不是存储指令又不是跳转指令,转4.4.2。
[0101 ] 4.4.2在运条指令后插入复算指令,复算指令与运条指令具有相同的指令码,复算 指令中的操作数为原指令操作数的副本,转4.6。
[0102] 4.4.3在运条指令前插入第=检测指令,第=检测指令是由一组异或指令和一条 固龄指令组成的指令,其功能是使用异或指令XOR检测存储指令的数据、内存地址、偏移量、 指令执行条件等变量的原始数据版本与副本数据版本的一致性,一致时程序正常继续执 行,当发现不一致时,由跳转指令转到错误处理函数。令寄存器40_(3为寄存器AO的副本,令 寄存器Al_c为寄存器Al的副本,寄存器42_(3为寄存器A2的副本,寄存器43_(:为寄存器A3的 副本,EQ是储存检测结果的寄存器,ERR为错误处理函数,运一步的具体过程为:
[0103] 4.4.3.1在存储指令之前依次插入比较语句ッ0RAl,Al_c,EQ"、"[!EQ]X0RA2, A2_c,EQ"和错误处理语句(跳转指令r[EQ]B ERR",A1、A2分别是数据操作数和地址操作 数。
[0104] 4.4.3.2若存储指令具有执行条件,假设其存储在寄存器AO中,则在错误处理语句 前插入比较语句1 !EQ]X0R AO,A0_c,EQ",转4.4.3.3,若存储指令没有执行条件,则直接转 4.4.3.3。
[0105] 4.4.3.3若存储指令具有偏移地址,假设其存储在寄存器A3中,则在错误处理语句 前插入比较语句T !EQ]X0R A3,A3_c,EQ",转4.6,若存储指令没有偏移地址,则直接转4.6。
[0106] 4.4.4在运条指令前插入第四检测指令,第四检测指令是由一组异或指令和一条 固龄指令组成的指令,其功能是使用异或指令XOR检测跳转的地址、指令的执行条件等变量 的原始数据版本与副本数据版本的一致性,一致时程序正常继续执行,当发现不一致时,由 跳转指令转到错误处理函数。运一步的具体过程为:
[0107] 4.4.4.1在跳转指令之前依次插入比较语句^OR AO,A0_c,EQ"和错误处理语句 "[EQ化ERR",A0中存储的是指令的执行条件,转4.4.4.2。
[0108] 4.4.4.2若跳转指令的目的地址存储在寄存器Al中,则在错误处理语句前插入比 较语句l!EQ]X0RAl,Al_c,EQ",转4.6,若跳转指令的目的地址没有存在寄存器中,则直接 转 4.6。
[0109] 4.5此时SBBis具有标志L,即此基本块所在的循环可W经编译器排出软件流水线, 则采用延迟错误处理方法,使用一个寄存器邸ROR记录循环内部检测的错误,并将运些错误 延迟到循环结束再处理。运一步的具体过程为:
[0110] 4.5.1若SBBiS还具有标志H,即SBBiS为循环的第一个无存基本块,则在SBBiS第一条 语句之前插入循环错误信息寄存器初始化语句"ZERO ERROR",转4.5.2。若SBBiS不具有标志 H,则直接转4.5.2。
[011U 4.5.2若SBBiS还具有标志T,即SBBiS为循环的最后一个无存基本块,则在SBBiS最后 一条语句之后插入调用错误处理例程语句"[ERROR化ERR",转4.5.3。若SBBiS不具有标志T, 则直接转4.5.3。
[0112] 4.5.3判断SBBis最后一条指令的类型,若为存储指令,则转4.5.5;若为跳转指令, 则转4.5.6,若既不是存储指令也不是跳转指令,转4.5.4。
[0113] 4.5.4为运条指令生成副本指令,副本指令和原指令具有相同的指令码,副本指令 中的操作数为原指令中操作数的副本,转4.6。
[0114] 4.5.5在运条指令前插入第五检测指令,第五检测指令是由一组异或指令、一条错 误信息记录指令和一条存储条件无效化指令组成的指令,其功能是使用异或指令XOR检测 存储指令的数据、内存地址、偏移量、指令执行条件等变量的原始数据版本与副本数据版本 的一致性,一致时程序正常继续执行,当发现不一致时,采用延迟错误处理方法将检测到的 错误记录到邸ROR寄存器中,并在循环结束的位置插入循环错误判断的指令,根据ERROR寄 存器的值进行错误处理。在检测到错误的情况下,为了防止错误向内存传播,使该存储指令 的执行条件为假。运一步的具体过程为:
[0115] 4.5.5.1在存储指令之前依次插入比较语句ッ0RAl,Al_c,EQ"、"[!EQ]X0RA2, A2_c,EQ"和错误信息记录语句1EQ]MVK Oxffff,邸ROr,A1、A2分别是数据操作数和地址 操作数。
[0116] 4.5.5.2若存储指令具有执行条件,假设其存储在寄存器AO中,则在错误信息记录 语句前插入比较语句1 !EQ]X0R A0,A0_c,EQ",在存储指令前插入存储指令执行条件无效 化语句"[ERROR]Z邸0 AO",转4.5.5.3。若存储指令不具有执行条件,则为运条存储指令添 加执行条件"[!ERROR]",使此存储指令根据ERROR寄存器的值按条件进行存储,转4.5.5.3。
[0117] 4.5.5.3若存储指令具有偏移地址,假设其存储在寄存器A3中,则在错误信息记录 语句前插入比较语句1 !EQ]X0R A3,A3_c,EQ",转4.6。若存储指令不具有偏移地址,则直接 转 4.6。
[0118] 4.5.6在运条指令前插入第六检测语句,第六检测指令是由一组异或指令、一条错 误信息记录指令和一条循环计数器清零指令组成的指令,其功能是使用异或指令XOR检测 跳转指令的地址、指令执行条件等变量的原始数据版本与副本数据版本的一致性,一致时 程序正常继续执行,当发现不一致时,采用延迟错误处理方法将检测到的错误记录到ERROR 寄存器中,并在循环结束的位置插入循环错误判断的指令,根据ERROR寄存器的值进行错误 处理。在检测到错误的情况下,为了降低错误处理延迟,将循环计数器清零从而结束循环。 运一步的具体过程为:
[0119] 4.5.6.1在跳转指令前依次插入比较语句^OR AO,A0_c,EQ"、错误信息记录语句 "[EQ]MVK Oxffff ,ERRO护和循环计数器清零语句1ERR0R]ZER0 AO",A0中存储的是指令的 执行条件,转4.5.6.2。
[0120] 4.5.6.2若跳转指令的目的地址存储在寄存器Al中,则在错误信息记录语句前插 入比较语句1!EQ]X0R Al,Al_c,EQ",转4.6。若跳转指令的目的地址没有存在寄存器中,贝U 直接转4.6。
[0121] 4.6i6 = i6+l。
[0122] 4.7判断i6是否大于N,若是则执行第五步,此时原始代码已经完成加固,否则执行 第4.2步。
[0123] 第五步,执行添加了错误检测能力的线形汇编程序(即完成了加固的线形汇编程 序),检测发生在运行时的软错误,具体步骤为:
[0124] 5.1判断程序是否检测出了软错误,若是则执行第5.3步,否则执行第5.2步。
[01巧]5.2程序正常执行,转5.7。
[0126] 5.3判断错误被检测出的位置,若错误发生在可被编译优化的循环外,则执行第 5.4步,否则执行第5.5步。
[0127] 5.4错误发生之后的检测指令将此错误检测出,转5.6。
[01%] 5.5循环内的检测指令将错误记录到ERROR寄存器中,并且跳过循环内的存储指 令,清零循环计数器,提前终止循环,转5.6。
[01巧]5.6进行错误处理。
[0130] 5.7 结束。
[0131] 与已有的DSP程序数据错误检测方法相比,采用本发明可W达到W下的技术效果:
[0132] (1)本发明第四步对程序进行加固是一种纯软件方法,不需要修改底层DSP硬件, 加固后的程序具有软错误检测能力,不需要操作系统的多线程支持。
[0133] (2)本发明由于第四步添加的检测指令采用的优化检测指令方法利用了 DSP线形 汇编指令条件执行的特点,将每个同步检查点多次比较和跳转指令合并为多次比较一次跳 转,从而显著降低加固的性能开销。
[0134] (3)本发明由于第4.2步采用了指令等价性变换方法,用指令执行周期少的指令替 换指令执行周期多者,用可选功能单元较多的等价指令替换可选功能单元较少者,更有利 于防止因功能单元分配不均导致的流水线阻塞,从而提高加固后程序的执行效率。
[0135] (4)本发明对数据错误的检测率很高,能够检测出很多硬件瞬时故障引起的程序 软错误。同时本发明由于第4.2步采用指令等价变换方法对部分指令进行指令差异性复算, 指令和其副本可能使用不同的指令码和功能单元,因此本发明还能检测出一部分硬件故障 引起的持续性错误,例如指令译码单元的错误和功能单元的错误。由于采用了指令差异性 复算,提高了原始指令和复算指令之间的差异性,达到了最大限度暴露软错误的目的,使得 本发明的数据错误检测率明显提高,在99.4 % W上。
[0136] (5)本发明由于第4.5步引入了延迟错误处理方法,针对循环内部的检查点会引入 控制跳转语句从而破坏循环软件流水线的建立运一影响性能的关键问题,使用一个寄存器 ERROR存储循环内部是否检测到错误运一信息,不是在循环内部检测到错误后立即跳转到 错误处理例程,而是等到循环结束后再根据邸ROR寄存器的信息去进行错误处理。使得添加 了数据错误检测功能的程序循环结构依然可W像加固前一样建立软件流水线,在不降低错 误检测率的同时W-定的错误处理延迟为代价,显著提高了加固后程序的执行速度,降低 了性能开销。
[0137] (6)本发明由于第四步结合使用了=大指令差异性变换方法:指令等价变换、优化 检测指令、延迟错误处理,显著提高了加固后代码的执行效率,降低了加固带来的性能开 销,同时增加指令之间的差异性,达到最大限度暴露故障的目的,提高了故障检测率。
【附图说明】
[013引图1是本发明的总流程图;
[0139] 图2是本发明的第二步基于无存基本块序列SBBi,SBB2,- 'SBBn,构造程序控制流图 G(V,E)的流程图;
[0140] 图3是本发明的第=步基于G(V,E),找到程序中所有可被编译优化的循环,并为运 些循环的无存基本块做标识的流程图;
[0141] 图4是本发明的第四步对程序进行加固,即为无存基本块序列SBBi,SBB2,…SBBn添 加合适的复算指令和检测指令的流程图;
[0142] 图5是本发明的第五步执行完成了加固的线形汇编程序,检测发生在运行时的软 错误的流程图;
[0143] 图6是本发明的第3.1步从Vi开始采用深度优先捜索遍历G(V,E),得到一个树形结 构T,T的叶节点是程序执行结束的节点或者是G(V,E)的深度优先捜索已经遍历过的节点的 流程图。
【具体实施方式】
[0144] 图1是本发明的总流程图,主要包括W下五个步骤:
[0145] 1.将线形汇编源程序划分为无存基本块序列SBBi,SB化,一SBBnd
[0146] 2.基于无存基本块序列SBBi,SB化,…SBBn,构造程序控制流图G(V,E)。
[0147] 3.基于程序控制流图G(V,E),找到程序中所有可被编译优化的循环,并为运些循 环的无存基本块做标识。
[0148] 4.对程序进行加固,为每个无存基本块添加合适的复算指令和检测指令。
[0149] 5.执行加固后的程序,检测发生在运行时的软错误。
[0150] 通过W上五步,就能实现DSP线形汇编程序的软错误检测。
[0151] 图2是本发明的第二步基于无存基本块序列SBBi,SBB2,…SBBn,构造程序控制流图 G(V,E)的流程图,主要包括九大步骤:
[0152] 2.1.将每个无存基本块作为G(V,E)的一个节点。
[0153] 2.2.令12 = 1。
[0154] 2.3.判断SBBi2最后一条指令的类型,若为无条件跳转指令则执行第2.4步,若为条 件跳转指令则执行第2.5步,若为函数调用指令则执行第2.7步,否则为普通指令,执行第 2.6 步。
[01W] 2.4.在G(V,E)中添加一条节点SBBi2到转移目标所在的基本块节点的有向边,转 2.8 步。
[0156] 2.5.在6(¥,6)中添加一条节点58812到转移目标所在的基本块节点的有向边,并且 添加一条节点58812到节点58812+1的有向边,转2.8步。
[0157] 2.6.在6八6)中添加一条节点58812到节点58812+1的有向边,转第2.8步。
[015引2.7.在6(¥,6)中从58812向被调用函数的入口无存基本块画一条有向边,并且从被 调用函数的退出无存基本块向SBBi2+i画一条有向边,表示函数返回的控制流转移,转2.8 步。
[0159] 2.8.i2 = i2+l。
[0160] 2.9.判断i2是否大于N,若是则得到G(V,E),执行第S步,否则执行第2.3步。
[0161] 图3是本发明的第=步基于G(V,E),找到程序中所有可被编译优化的循环,并为运 些循环的无存基本块做标识的流程图,主要包括四大步骤:
[0162] 3.1.从Vi开始采用深度优先捜索遍历G(V,E),得到一个树形结构T,T的叶节点是 程序执行结束的节点或者是G(V,E)的深度优先捜索已经遍历过的节点。
[0163] 3.2.遍历树形结构T,得到T中所有叶节点^,L2,…,Lni,N1为T中叶节点的个数。
[0164] 3.3.从每个叶节点开始,向上捜索,若一个叶节点和它的某个祖先结点相同,则找 到该祖先节点到此叶节点的循环,找到的循环存放在集合LOOP中。
[0165] 3.4.从集合LOOP中筛选出可被编译优化的循环,并为运些循环的无存基本块做标 识,转第四步。可被编译优化的循环是指在G(V,E)中除头节点具有多个入度外,其余节点入 度为1,除尾节点具有多出度外,其余节点出度为1的循环。
[0166] 图4是本发明的第四步对程序进行加固,为每个无存基本块添加合适的复算指令 和检测指令的流程图,主要包括屯大步骤:
[0167] 4.1.令 16 = 1。
[0168] 4.2.对SBBiS除最后一条指令外的所有源程序指令MI,生成相应的副本指令SI插入 到对应的M巧旨令后面,采用指令等价变换方法对部分指令进行复算。
[0169] 4.3.判断SBBiS是否具有标志L,若没有,执行第4.4步,若具有标志L,执行第4.5步。
[0170] 4.4. SBBis不具有标志L,表示此基本块所在的循环无法经编译器排出软件流水线, 按W下方法添加复算指令,其具体过程为:
[0171] 4.4.1.判断SBBis最后一条指令的类型,若为存储指令,转4.4.3,若为跳转指令,贝U 转4.4.4,既不是存储指令又不是跳转指令,转4.4.2。
[0172] 4.4.2.在运条指令后插入复算指令,复算指令与运条指令具有相同的指令码,复 算指令中的操作数为原指令操作数的副本,转4.6。
[0173] 4.4.3.在运条指令前插入第=检测指令,第=检测指令是由一组异或指令和一条 固龄指令组成的指令,其功能是使用异或指令XOR检测存储指令的数据、内存地址、偏移量、 指令执行条件等变量的原始数据版本与副本数据版本的一致性,一致时程序正常继续执 行,当发现不一致时,由跳转指令转到错误处理函数。转第4.6步。
[0174] 4.4.4.在运条指令前插入第四检测指令,第四检测指令是由一组异或指令和一条 固龄指令组成的指令,其功能是使用异或指令XOR检测跳转的地址、指令的执行条件等变量 的原始数据版本与副本数据版本的一致性,一致时程序正常继续执行,当发现不一致时,由 跳转指令转到错误处理函数。转第4.6步。
[0175] 4.5.此时SBBis具有标志L,即此基本块所在的循环可W经编译器排出软件流水线, 则采用延迟错误处理方法,使用一个寄存器邸ROR记录循环内部检测的错误,并将运些错误 延迟到循环结束再处理。运一步的具体过程为:
[0176] 4.5.1.若SBBiS还具有标志H,即SBBiS为循环的第一个无存基本块,则在SBBiS第一 条语句之前插入循环错误信息寄存器初始化语句"ZERO ERROR",转4.5.2。若SBBiS不具有标 志H,则直接转4.5.2。
[0177] 4.5.2.若SBBiS还具有标志T,即SBBiS为循环的最后一个无存基本块,则在SBBiS最 后一条语句之后插入调用错误处理例程语句"[ERROR化ERR",转4.5.3。若SBBiS不具有标志 T,则直接转4.5.3。4.5.3.判断SBBiS最后一条指令的类型,若为存储指令,则转4.5.5;若为 跳转指令,则转4.5.6,若既不是存储指令也不是跳转指令,转4.5.4。
[0178] 4.5.4.为运条指令生成副本指令,副本指令和原指令具有相同的指令码,副本指 令中的操作数为原指令中操作数的副本,转4.6。
[0179] 4.5.5.在运条指令前插入第五检测指令,第五检测指令是由一组异或指令、一条 错误信息记录指令和一条存储条件无效化指令组成的指令,其功能是使用异或指令XOR检 测存储指令的数据、内存地址、偏移量、指令执行条件等变量的原始数据版本与副本数据版 本的一致性,一致时程序正常继续执行,当发现不一致时,采用延迟错误处理方法将检测到 的错误记录到邸ROR寄存器中,并在循环结束的位置插入循环错误判断的指令,根据ERROR 寄存器的值进行错误处理。在检测到错误的情况下,为了防止错误向内存传播,使该存储指 令的执行条件为假。转第4.6步。
[0180] 4.5.6.在运条指令前插入第六检测语句,第六检测指令是由一组异或指令、一条 错误信息记录指令和一条循环计数器清零指令组成的指令,其功能是使用异或指令XOR检 测跳转指令的地址、指令执行条件等变量的原始数据版本与副本数据版本的一致性,一致 时程序正常继续执行,当发现不一致时,采用延迟错误处理方法将检测到的错误记录到 ERROR寄存器中,并在循环结束的位置插入循环错误判断的指令,根据ERROR寄存器的值进 行错误处理。在检测到错误的情况下,为了降低错误处理延迟,将循环计数器清零从而结束 循环。
[0181] 4.6.i6 = i6+l。
[0182] 4.7.判断i6是否大于N,若是则执行第五步,此时原始代码已经转换为具有软错误 检测能力的汇编程序,否则执行第4.2步。
[0183] 图5是本发明的第五步执行加固后的程序,检测发生在运行时的软错误的流程图, 主要包括屯大步骤:
[0184] 5.1.判断程序是否检测出了软错误,若是则执行第5.3步,否则执行第5.2步。
[01化]5.2.程序正常执行,转5.7。
[0186] 5.3.判断错误被检测出的位置,若错误发生在可被编译优化的循环外,则执行第 5.4步,否则执行第5.5步。
[0187] 5.4.错误发生之后的检测指令将此错误检测出,转5.6。
[018引5.5.循环内的检测指令将错误记录至化RROR寄存器中,并且跳过循环内的存储指 令,清零循环计数器,提前终止循环,转5.6。
[0189] 5.6.进行错误处理。
[0190] 5.7.结束。
[0191] 图6是本发明的第3.1步从Vi开始采用深度优先捜索遍历G(V,E),得到一个树形结 构T,T的叶节点是程序执行结束的节点或者是G(V,E)的深度优先捜索已经遍历过的节点的 流程图,主要包括九大步骤:
[0192] 3.1.1.建立树结构T,令根节点为Vo。
[0193] 3.1.2.令¥13 = ¥1,¥14 = ¥〇。
[0194] 3.1.3.将Vi3加入树形结构T,作为T中Vi4的子节点。
[01对 3.1.4.判断Vi3是否遍历过,若是则执行第3.1.5步,否则执行第3.1.6步。
[0196] 3.1.5.令Vi3 = Vi4,Vi4 = Vi4 在T 中的父节点。
[0197] 3.1.6.判断是否有从Vi3出发未被访问的路径,若有则执行第3.1.7步,否则执行第 3.1.8 步。
[019引 3.1.7.令Vi4 = Vi3, Vi3 = Vi3通过运条路径连接的节点,执行第3.1.3步。
[0199] 3.1.8.判断Vi3是否等于Vi,若是则表示得到了 T,转3.2步,否则执行第3.1.9步。
[0200] 3.1.9.令Vi3 = Vi4,Vi4 = Vi 庙T 中的父节点,执行第3.1.6步。
【主权项】
1. 一种基于线形汇编指令差异性变换的DSP软错误检测方法,其特征在于包括以下步 骤: 第一步,将程序划分为N个无存基本块SBB1,SBB2,…SBBn的序列,N为正整数,无存基本 块是程序中能够顺序执行的指令序列的集合,这组指令序列只有最后一条指令可以是存储 指令或程序控制指令,这组指令只有一个入口和一个出口,入口就是第一条指令,出口就是 最后一条指令; 第二步,基于无存基本块序列3881,5882,'"588〃,构造程序控制流图6(¥3),¥为节点集 合,取值为V1,V2,一VmW1为程序的入口节点,Vm为程序的出口节点,E为边集合; 第三步,基于G(V,E),找到程序中所有可被编译优化的循环,并为这些循环的无存基本 块做标识;可被编译优化的循环是指除了循环的第一个无存基本块外没有循环外部到其内 部的控制流转移,且除了循环的最后一个无存基本块外没有循环内部到外部的控制流转 移,体现在控制流图上即循环除头节点具有多个入度外,其余节点入度为1,除尾节点具有 多出度外,其余节点出度为1;这一步的具体过程为: 3.1从¥1开始采用深度优先搜索遍历6(¥3),得到一个树形结构1',1'的叶节点是程序执 行结束的节点或者是G (V,E)的深度优先搜索已经遍历过的节点; 3.2遍历树形结构T,得到T中所有叶节点L1,L2,…,Ln1,N1为T中叶节点的个数; 3.3从每个叶节点开始,向上搜索,若一个叶节点和它的某个祖先结点相同,则找到该 祖先节点到此叶节点的循环,将找到的循环存放在集合LOOP中; 3.4从集合LOOP中筛选出可被编译优化的循环,并为这些循环的无存基本块做标识;可 被编译优化的循环是指在G(V,E)中除头节点具有多个入度外,其余节点入度为1,除尾节点 具有多出度外,其余节点出度为1的循环;具体步骤为: 3.4.1判断LOOP是否为空集,若是则执行第四步,否则执行第3.4.2步; 3 · 4 · 2选取LOOP 中的一个循环 I i,LOOP = LOOP- {I i}; 3.4.3判断Ii是否可被编译优化,若不可则转第3.4.1步,若可被编译优化,执行3.4.4 步; 3.4.4为每个属于Ii的无存基本块做标识L,且为Ii的第一个和最后一个无存基本块分 别做标识H和T,转3.4.1步; 第四步,对程序进行加固,即为无存基本块序列SBB1,SBB2,…SBBn添加复算指令和检测 指令,添加的检测指令都采用优化检测指令方法进行优化,对于可被编译优化的循环采用 延迟错误处理方法降低加固带来的性能开销;第四步的具体过程为: 4 · 1令i6 = 1; 4.2对SBBi6除最后一条指令外的所有源程序指令MI,生成相应的副本指令SI插入到对 应的MI指令后面,采用指令等价变换方法对指令进行指令差异性复算,用执行时间短的指 令替换执行时间长者,用可分配功能单元多的指令替换可分配功能单元少的指令; 4.3判断SBBi6是否具有标志L,若没有,执行第4.4步,若具有标志L,执行第4.5步; 4.4SBBl6不具有标志L,表示此基本块所在的循环无法经编译器排出软件流水线,按以 下方法添加复算指令,其具体过程为: 4.4.1判断SBBi6最后一条指令的类型,若为存储指令,转4.4.3,若为跳转指令,则转 4.4.4,既不是存储指令又不是跳转指令,转4.4.2; 4.4.2在这条指令后插入复算指令,复算指令与这条指令具有相同的指令码,复算指令 中的操作数为原指令操作数的副本,转4.6; 4.4.3在这条指令前插入第三检测指令,第三检测指令是由一组异或指令和一条跳转 指令组成的指令,其功能是使用异或指令XOR检测存储指令的数据、内存地址、偏移量、指令 执行条件等变量的原始数据版本与副本数据版本的一致性,一致时程序正常继续执行,当 发现不一致时,由跳转指令转到错误处理函数;令ERR为错误处理函数,转4.6; 4.4.4在这条指令前插入第四检测指令,第四检测指令是由一组异或指令和一条跳转 指令组成的指令,其功能是使用异或指令XOR检测跳转的地址、指令的执行条件等变量的原 始数据版本与副本数据版本的一致性,一致时程序正常继续执行,当发现不一致时,由跳转 指令转到错误处理函数;转4.6; 4.5此时58816具有标志L,即此基本块所在的循环可以经编译器排出软件流水线,则采 用延迟错误处理方法,使用一个寄存器ERROR记录循环内部检测的错误,并将这些错误延迟 到循环结束再处理;这一步的具体过程为: 4.5.1若SBBi6还具有标志H,即SBBi6为循环的第一个无存基本块,则在SBB i6第一条语句 之前插入循环错误信息寄存器初始化语句"ZERO ERROR",转4.5.2;若SBBi6不具有标志H,则 直接转4.5.2; 4.5.2若SBBi6还具有标志T,即SBBi6为循环的最后一个无存基本块,则在SBB i6最后一条 语句之后插入调用错误处理例程语句"[ERR0R]B ERR",转4.5.3;若SBBi6不具有标志T,则直 接转4.5.3; 4.5.3判断SBBi6最后一条指令的类型,若为存储指令,则转4.5.5;若为跳转指令,则转 4.5.6,若既不是存储指令也不是跳转指令,转4.5.4; 4.5.4为这条指令生成副本指令,副本指令和原指令具有相同的指令码,副本指令中的 操作数为原指令中操作数的副本,转4.6; 4.5.5在这条指令前插入第五检测指令,第五检测指令是由一组异或指令、一条错误信 息记录指令和一条存储条件无效化指令组成的指令,其功能是使用异或指令XOR检测存储 指令的数据、内存地址、偏移量、指令执行条件等变量的原始数据版本与副本数据版本的一 致性,一致时程序正常继续执行,当发现不一致时,采用延迟错误处理方法将检测到的错误 记录到ERROR寄存器中,并在循环结束的位置插入循环错误判断的指令,根据ERROR寄存器 的值进行错误处理;在检测到错误的情况下,为了防止错误向内存传播,使该存储指令的执 行条件为假;转4.6; 4.5.6在这条指令前插入第六检测语句,第六检测指令是由一组异或指令、一条错误信 息记录指令和一条循环计数器清零指令组成的指令,其功能是使用异或指令XOR检测跳转 指令的地址、指令执行条件等变量的原始数据版本与副本数据版本的一致性,一致时程序 正常继续执行,当发现不一致时,采用延迟错误处理方法将检测到的错误记录到ERROR寄存 器中,并在循环结束的位置插入循环错误判断的指令,根据ERROR寄存器的值进行错误处 理;在检测到错误的情况下,为了降低错误处理延迟,将循环计数器清零从而结束循环;转 4.6; 4.6i6 = i6+l; 4.7判断i6是否大于N,若是则执行第五步,否则执行第4.2步; 第五步,执行完成了加固的线形汇编程序,检测发生在运行时的软错误,具体步骤为: 5.1判断程序是否检测出了软错误,若是则执行第5.3步,否则执行第5.2步; 5.2程序正常执行,转5.7; 5.3判断错误被检测出的位置,若错误发生在可被编译优化的循环外,则执行第5.4步, 否则执行第5.5步; 5.4错误发生之后的检测指令将此错误检测出,转5.6; 5.5循环内的检测指令将错误记录到ERROR寄存器中,并且跳过循环内的存储指令,清 零循环计数器,提前终止循环,转5.6; 5.6进行错误处理; 5.7结束。2. 如权利要求1所述的一种基于线形汇编指令差异性变换的DSP软错误检测方法,其特 征在于第二步所述基于无存基本块序列SBBl,SBB2,…SBBN,构造 G(V,E)的具体过程为:2.1 将每个无存基本块作为G (V,E)的一个节点; 2.2 令 i2 = l; 2.3判断SBB12最后一条指令的类型,若为无条件跳转指令则执行第2.4步,若为条件跳 转指令则执行第2.5步,若为函数调用指令则执行第2.7步,否则为普通指令,执行第2.6步; 2.4在G(V,E)中添加一条节点SBB i2到转移目标所在的基本块节点的有向边,转2.8步; 2.5在G(V,E)中添加一条节点SBBi2到转移目标所在的基本块节点的有向边,并且添加 一条节点SBBi2到节点SBBi2+j^有向边,转2.8步; 2.6在G (V,E)中添加一条节点SBBi2到节点SBBi2+1的有向边,转第2.8步; 2.7在G(V,E)中从SBBi2向被调用函数的入口无存基本块画一条有向边,并且从被调用 函数的退出无存基本块向SBBl2+1画一条有向边,表示函数返回的控制流转移,转2.8步; 2.8i2 = i2+l; 2.9判断12是否大于1若是则得到6以3);否则执行第2.3步。3. 如权利要求1所述的一种基于线形汇编指令差异性变换的DSP软错误检测方法,其特 征在于第三步的3.1步所述从Vi开始深度优先搜索遍历G(V,E),得到树形结构T的具体步骤 为: 3.1.1建立树结构T,令根节点为V0; 3.1.2令Vi3 = V1^=Vo; 3.1.3将Vi3加入树形结构T,作为T中Vi4的子节点; 3.1.4判断V13是否遍历过,若是则执行第3.1.5步,否则执行第3.1.6步; 3.1.5令Vi3 = Vi4, Vi4=Vi4 在T 中的父节点; 3.1.6判断是否有从V13出发未被访问的路径,若有则执行第3.1.7步,否则执行第3.1.8 步; 3.1.7令Vi4=Vi3,Vi3 = Vi3通过这条路径连接的节点,执行第3.1.3步; 3.1.8判断V13是否等于化,若是则表示得到了 T,结束,否则执行第3.1.9步; 3.1.9令Vi3 = Vi4,Vi4=Vi4在T中的父节点,执行第3.1.6步。4. 如权利要求1所述的一种基于线形汇编指令差异性变换的DSP软错误检测方法,其特 征在于第三步的3.3步所述从每个叶节点开始,向上搜索,将找到的循环存放在集合LOOP中 的具体步骤为: 3.3.1令15 = 1,集合1^〇(沖=0; 3.3.2令Lf = Li5的父节点; 3.3.3判断Lf是否等于L15,若不等于则转3.3.4,若等于则找到一条从Lf到L 15的循环,加 入到集合LOOP中; 3.3.4判断Lf是否等于树T的根节点Vo,若是则i5 = i5+l,转3.3.5步,否则令Lf = Lf在T中 的父节点,执行第3.3.3步; 3.3.5判断i5是否大于Nl,若是则表示搜索完毕,结束,否则执行第3.3.2步。5. 如权利要求1所述的一种基于线形汇编指令差异性变换的DSP软错误检测方法,其特 征在于第四步的4.2步所述采用指令等价变换方法对指令进行指令差异性复算的具体过程 如下,其中寄存器Al_c为寄存器Al的副本,寄存器A2_cS寄存器A2的副本,自然数η为立即 数: 4.2.1若肌为"31^41,1^2",则51等价变换为100厶1_(:,-1^2_(3",结束; 4.2.2若肌为"10^41,211,42",则31等价变换为"31八1_(3,11,42_(3",结束; 4.2.3若[为"1^厶1,42",则31等价变换为100 41_〇,0,42_〇",结束; 4.2.4若MI为"ZERO Α1",则SI等价变换为"CLR △1_(3,0,31,八1_(:",结束; 4.2.5若MI为"AND Al,2n-1,A2",则SI等价变换为"CLR Al_c,n,31,A2_c",结束; 4 · 2 ·6若MI为 "OR Al,2n+1-l,A2",则SI等价变换为 "SET Al_c,0,n,A2_c",结束; 4·2·7若MI为"0RAl,2n,A2",则SI等价变换为"SETAl_c,n,n,A2_c",结束 ; 4.2.8若MI为"CMPGT A1,A2,A3",则SI等价变换为"CMPLT A2_c,Al_c,A3_c",结束; 4.2.9若肌为"〇1031^八1,厶2,厶3",则51等价变换为"〇10^了八2_(:,厶1_(3,厶3_(3",结束 ; 4 · 2 · 10若MI为 "CMPGT2A1,A2,A3",则SI等价变换为 "CMPLT2A2_c,Al_c,A3_c",结束; 4 · 2 · 11若MI为 "CMPLT2A1,A2,A3",则SI等价变换为 "CMPGT2A2_c,Al_c,A3_c",结束; 4 · 2 · 12若MI为 "CMPGTU4A1,A2,A3",则SI等价变换为 "CMPLTU4A2_c,Al_c,A3_c",结束; 4 · 2 · 13若MI为 "CMPLTU4A1,A2,A3",则SI等价变换为 "CMPGTU4A2_c,Al_c,A3_c",结束; 4.2.14若羾为"〇10^了5?八1,八2,八3",则51等价变换为"〇1031^5?八2_(:,八1_(3,八3_(3",结 束; 4.2.15若羾为"〇1031^5?八1,八2,八3",则51等价变换为"〇10^了5?八2_(:,八1_(3,八3_(3",结 束; 4.2.16若羾为"〇10^了0?厶1,厶2,厶3",则51等价变换为"〇1031^0?厶2_(:,厶1_(3,厶3_(3",结 束; 4.2.17若羾为"〇1031^0?八1,八2,八3",则51等价变换为"〇10^了0?八2_(:,八1_(3,八3_(3",结 束; 4.2.18若MI不为以上17种情况,则SI与MI使用相同的指令码,SI中的操作数为MI中操 作数的副本,结束。6. 如权利要求1所述的一种基于线形汇编指令差异性变换的DSP软错误检测方法,其特 征在于第四步的4.4.3步所述在指令前插入第三检测指令的具体过程为: 4 · 4 · 3 · 1在存储指令之前依次插入比较语句"XOR Al,Al_c,EQ"、"[ !EQ]X0R A2,A2_c, EQ"和错误处理语句"[EQ]B ERR",A1、A2分别是数据操作数和地址操作数; 4.4.3.2若存储指令具有执行条件,假设其存储在寄存器AO中,则在错误处理语句前插 入比较语句"[!EQ]XOR AO,A0_c,EQ",转4.4.3.3,若存储指令没有执行条件,则直接转 4.4.3.3; 4.4.3.3若存储指令具有偏移地址,假设其存储在寄存器A3中,则在错误处理语句前插 入比较语句"[!EQ]XOR A3,A3_c,EQ",结束,若存储指令没有偏移地址,则直接结束。7. 如权利要求1所述的一种基于线形汇编指令差异性变换的DSP软错误检测方法,其特 征在于第四步的4.4.4步所述在指令前插入第四检测指令的具体过程为: 4.4.4.1在跳转指令之前依次插入比较语句"XOR AO,A0_c,EQ"和错误处理语句"[EQ]B ERR",A0中存储的是指令的执行条件,转4.4.4.2; 4.4.4.2若跳转指令的目的地址存储在寄存器Al中,则在错误处理语句前插入比较语 句"[!EQ]XOR Al,Al_c,EQ",结束,若跳转指令的目的地址没有存在寄存器中,则直接结束。8. 如权利要求1所述的一种基于线形汇编指令差异性变换的DSP软错误检测方法,其特 征在于第四步的4.5.5步所述在指令前插入第五检测指令的具体过程为: 4.5.5.1在存储指令之前依次插入比较语句"XOR Al,Al_c,EQ"、"[ !EQ]XOR A2,A2_c, EQ"和错误信息记录语句"[EQ]MVK Oxffff ,ERROR",Al、A2分别是数据操作数和地址操作 数; 4.5.5.2若存储指令具有执行条件,假设其存储在寄存器AO中,则在错误信息记录语句 前插入比较语句"[!EQ]X0R AO,A0_c,EQ",在存储指令前插入存储指令执行条件无效化语 句"[ERROR]ZERO A0",转4.5.5.3;若存储指令不具有执行条件,则为这条存储指令添加执 行条件"[!ERROR]",使此存储指令根据ERROR寄存器的值按条件进行存储,转4.5.5.3; 4.5.5.3若存储指令具有偏移地址,假设其存储在寄存器A3中,则在错误信息记录语句 前插入比较语句"[!EQ]X0R A3,A3_c,EQ",结束;若存储指令不具有偏移地址,则直接结束。9. 如权利要求1所述的一种基于线形汇编指令差异性变换的DSP软错误检测方法,其特 征在于第四步的4.5.6步所述在指令前插入第六检测语句的具体过程为: 4.5.6.1在跳转指令前依次插入比较语句"XOR AO,A0_c,EQ"、错误信息记录语句"[EQ] MVK Oxffff ,ERROR"和循环计数器清零语句"[ERR0R]ZER0 A0",A0中存储的是指令的执行 条件,转4.5.6.2; 4.5.6.2若跳转指令的目的地址存储在寄存器Al中,则在错误信息记录语句前插入比 较语句"[!EQ]X0R Al,Al_c,EQ",结束;若跳转指令的目的地址没有存在寄存器中,则直接 结束。
【文档编号】G06F11/22GK106021040SQ201610290829
【公开日】2016年10月12日
【申请日】2016年5月4日
【发明人】谭庆平, 邵则铭, 徐建军, 宁洪, 姜晶菲, 孟宪凯, 张南, 邓锦洲, 曾平, 张浩宇
【申请人】中国人民解放军国防科学技术大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1