CN106021040A - 一种基于线形汇编指令差异性变换的dsp软错误检测方法 - Google Patents
一种基于线形汇编指令差异性变换的dsp软错误检测方法 Download PDFInfo
- Publication number
- CN106021040A CN106021040A CN201610290829.9A CN201610290829A CN106021040A CN 106021040 A CN106021040 A CN 106021040A CN 201610290829 A CN201610290829 A CN 201610290829A CN 106021040 A CN106021040 A CN 106021040A
- Authority
- CN
- China
- Prior art keywords
- instruction
- node
- sbb
- error
- xor
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/22—Detection or location of defective computer hardware by testing during standby operation or during idle time, e.g. start-up testing
- G06F11/2273—Test methods
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/22—Detection or location of defective computer hardware by testing during standby operation or during idle time, e.g. start-up testing
- G06F11/2205—Detection or location of defective computer hardware by testing during standby operation or during idle time, e.g. start-up testing using arrangements specific to the hardware being tested
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种基于线形汇编指令差异性变换的DSP软错误检测方法,目的是解决现有DSP软错误检测方法性能开销大的问题。技术方案是将程序划分为无存基本块,构建程序控制流图,识别出循环,筛选出可编排软件流水的循环;对程序进行加固,为程序添加错误检测指令,采用指令差异性变换方法对部分指令进行等价性变换,对其余指令进行复算,并在存储指令及跳转指令前插入检测指令,利用DSP指令条件执行的特点及等价变换方法优化检测指令,针对可编排软件流水的循环采用延迟错误处理方法降低加固带来的性能开销;执行加固后的程序,检测发生在运行时的软错误。本发明是一种纯软件的DSP加固方法,对数据错误的检测率高,且加固的性能开销低。
Description
技术领域
本发明涉及一种针对数字信号处理器DSP(Digital Signal Processor)程序的错误检测方法,尤其是针对空间高能粒子辐射引发的软错误进行检测的方法。
背景技术
近年来,随着集成电路工艺技术的发展,处理器设计人员采用越来越高的时钟频率、越来越低的电压水平以及越来越小的工艺尺寸。这些技术在带来更高性能与更低功耗的同时,也使得处理器对瞬态故障更加敏感,威胁到程序执行的正确性。这些瞬态故障通常是由外部环境中高能粒子辐射和电压扰动、电磁干扰等诱发。与永久性故障导致的硬件错误相比,这种错误具有瞬态、发生时间和位置随机、可恢复等特点,因此被称为“软错误”。工程人员提出了很多技术来处理软错误的问题,这些技术主要可分为两类:硬件技术和软件技术。
硬件技术主要采用体系结构冗余的思想实现容错。例如,一些存储结构比如缓存和内存包含ECC(Error Correcting Code),可以用来检测甚至改正错误,此外较为常用的错误校验码技术还包括EDAC,它们是通过设置冗余的二进制位来实现的。也可以通过设置专门的硬件检测电路实现容错,如采用专用处理器来检测总线上数据正确性的看门狗技术WatchDog。在一些可靠性要求较高的系统中,TMR(Triple-Modular Redundancy)应用比较广泛,它通过三个同时工作的部件以投票的形式实现错误的检测和恢复,是部件级别的冗余。硬件容错技术思想简单,可以显著的提高系统的可靠性,但同时会在体积、功耗等方面引入巨大的硬件开销,这在很多嵌入式系统的设计中是无法接受的。
为了缓解硬件容错技术硬件开销大的问题,同时也是对硬件容错技术更好的完善和拓展,软件容错技术成为了研究热点。软件容错技术,也称为软加固技术。计算机发展的历史表明,很多原本用硬件实现的方法同样可以用软件实现。随着处理器性能的极大提升,在满足时间约束的前提下,通过程序复算牺牲部分性能来换取高可靠性的软件容错技术展现出了很强的吸引力。
软件容错技术包括错误检测、定位、回复等技术,其中错误检测是错误定位和恢复的基础。空间辐射环境中的单粒子效应可能改变寄存器、存储器、Cache中存储的数据、运算单元执行结果,导致执行结果出错,这一类软错误属于数据错误。数据错误主要通过指令复算的方式实现错误检测,其检测原理如下:由于软错误具有瞬时性、偶发性和随机性等特点,指令同一时间在不同功能部件上多次执行,或者不同时间在相同功能部件上多次执行的过程中,发生相同错误的概率非常低,因此将这多次执行的结果进行比较,若相符则认为指令执行结果正确,否则说明至少在一次执行过程中发生了软错误。通过指令复算,一般可以检测出瞬时故障导致的软错误。
2002年《IEEE Transactions on Reliability》第51卷第1期发表的作者为Stanford大学CRC实验室的N.Oh、P.P.Shirvani、E.J.McCluskey的论文“Error detection by duplicatedinstructions in super-scalar processors”提出的EDDI方法是常用的数据流检错方法。EDDI通过复制程序指令来实现冗余,进而通过插入点比较来实现容错。故障注入实验表明:使用EDDI后,程序的平均出错概率从20%下降到1.5%以下。EDDI方法的基本步骤是:
第一步,将程序划分为N个无存基本块SBB1,SBB2,…SBBN的序列,N为正整数,无存基本块是程序中能够顺序执行的指令序列的集合,这组指令序列只有最后一条指令可以是存储指令或程序控制指令,这组指令只有一个入口和一个出口,入口就是第一条指令,出口就是最后一条指令。划分无存基本块序列的具体步骤是:
1.1确定程序的每个无存基本块的入口指令,它们是:
●程序的第一条指令;或者
●存储指令、条件转移指令或无条件转移指令跳转到的指令;或者
●紧跟在存储指令、转移指令或函数调用后面的指令;或者
●被调用函数的第一条指令。
1.2对每个入口指令,确定其对应的出口指令,它们是:
●入口指令后除当前入口指令外的第一个入口指令前的指令;或者
●入口指令后的第一个存储指令、转移指令或函数调用指令;或者
●程序的结束指令。
1.3分别将每个入口指令和其对应的出口指令之间的程序块划分为一个无存基本块。
第二步,对程序进行加固,即为每个无存基本块添加合适的复算指令或检测指令,复算指令与原指令具有相同的指令码,复算指令中的操作数为原指令中操作数的副本,具体做法为:
2.1令i1=1。
2.2在SBBi1除最后一条指令外的每一条指令后面插入对应的复算指令。
2.3若SBBi1最后一条指令不为跳转指令或存储指令,则在这条指令后面插入对应的复算指令,转2.6。
2.4若SBBi1最后一条指令为存储指令,则在这条指令前插入第一检测指令(第一检测指令的功能是检测存储指令的数据、内存地址、偏移量、指令执行条件等变量原始数据与副本数据是否一致,不一致则表示检测到错误),转2.6。
2.5若SBBi1最后一条指令为跳转指令,则在这条指令前插入第二检测指令(第二检测指令的功能是检测跳转指令的指令执行条件、内存地址等变量原始数据与副本数据是否一致,不一致则表示检测到错误),转2.6。
2.6i1=i1+1。
2.7判断i1是否大于N,若是则执行第三步,否则转第2.2步。
第三步,执行加固后的程序,检测发生在运行时的软错误,具体步骤为:
3.1若加固后的程序执行过程中没有发生单粒子翻转等原因导致的软错误,则原指令和副本指令具有相同的执行结果,加固后的程序不会检测到错误,加固后的程序正常执行与加固前的执行结果相同,转第四步。
3.2若加固后的程序执行过程中发生单粒子翻转等原因导致的软错误,使得原指令与副本指令执行结果不同,则加固后的程序检测到此软错误,转第四步。
第四步,结束。
CRC实验室在EDDI基础上引入数据差异性概念(Data Diversity),于2002年在《IEEETransactions on Computer》第51卷第2期发表论文“ED4I:Error Detection by Diverse Dataand Duplicated Instructions”提出ED4I方法。ED4I与EDDI方法在步骤上基本相同,但其中的SI不再是MI的单纯复制,而是将MI中的输入数据乘以一个差异因子k作为SI中的输入数据,若输出数据依然保持k倍的关系,则认为指令执行过程中没有发生错误。由于数据差异因子的引入,使得ED4I可以检测一部分持续性故障和永久性故障。数据差异因子的选择对ED4I方法的故障检测能力影响很大,最优k值也难以求出。另外,数据都乘以k倍可能会导致数据溢出的问题。原文章建议将k值选为-1,即将所有数据求反,但论证结果表明很多时候-1并不是最佳差异因子。虽然ED4I方法在EDDI方法的基础上进一步提高了错误检测率,但也引入了更多的性能开销。
2008年国防科技大学李建立的硕士学位论文《空间辐射环境下软件实现的硬件故障检测技术研究》中第三章提出了基于逆向恢复的故障检测方法EDCC(Error Detection byConverse Computing),思想也是对SI做差异性变换,以提高软错误检测率和检测永久性故障错误的能力。EDCC方法的主要原理是计算的可逆性,通过对程序进行逆向恢复运算,使得SI变成与MI完全不同的指令,增加了指令之间的差异性,达到最大限度暴露故障的目的,提高了故障检测率,同时克服了ED4I数据溢出的问题。但逆向恢复运算都是针对运算指令进行的,对于运算操作比例不高的程序,EDCC会插入很多比较指令却只能检测相对较少的运算错误,故障检测能力因此会有所下降。
高性能数字信号处理器DSP由于其处理复杂信号能力强、灵活性高等优点,已经越来越多地应用到星载信号处理系统中。然而,高性能DSP空间应用受到了可靠性的制约。空间探测活动投入大、风险高,对可靠性有着极高的要求。太空中影响空间探测器安全的主要因素是宇宙射线的辐射,因为这些宇宙射线中的高能带电粒子流会使电子器件出现硬件故障,因此航天应用等特殊领域需要针对DSP程序进行容错加固。
从并行处理的角度分析,新型的TMS320C6000系列DSP的主要特点是采用了超长指令字VLIW(Very Long Instruction Words)的体系结构。在C6000片内共有8个并发工作的功能单元,单指令字长为32bit,8条指令组成一个指令包,一个指令包字长为256bit。芯片内部设置了专门的指令分配模块,可以将256bit的指令包同时分配给8个功能单元,一个周期最多可以同时执行8条指令。VLIW结构中,指令并行性和数据传送完全是在编译时确定的,这与运行时的资源调度和同步不同,这种结构中每条指令的等效周期数很低,即运行速度很快。VLIW结构中指令获取、指令分配、指令执行、数据存储等阶段需要进行多级流水,不同指令执行的流水延迟时间也不相等。这种深流水线给编程和编译带来困难,指令安排稍有不当将破坏流水线,使得性能下降。因此VLIW结构执行代码效率很大程度上取决于程序中循环的软件流水排布。
为了提高程序的性能,可以将程序用线形汇编实现。线形汇编是一种TI(TexasInstrument)公司提供的CCS(Code Composer Studio)环境支持的可用于DSP平台的编程语言。线形汇编使用汇编指令集,但因其不用指定所使用的功能单元、物理寄存器以及指令并行,所以更加利于编程实现。线形汇编代码经过汇编器编译可生成最终执行的高度并行的汇编代码。在编译过程中,汇编器为线形汇编指令分配物理寄存器、指定运行的功能单元,为循环编排软件流水线。线形汇编代码经过汇编器编译后可以生成高度并行的汇编代码。
传统的指令级错误检测方法针对编译后的目标代码进行加固。编译后的DSP汇编代码并行度很高,若插入加固指令很有可能破坏DSP软件流水线,致使性能显著降低。且编译后的程序几乎占用了所有的物理寄存器和功能单元,在此基础上很难插入加固指令。因此,使用传统的针对目标代码的指令级错误检测方法很难对DSP程序进行软加固。
如何解决DSP软加固问题是本领域技术人员极为关注的热点问题。但总的来说,DSP程序的软错误检测方法还存在以下几个方面的问题:
(1)加固后的程序可能破坏DSP的软件流水线,使得程序运行时间开销显著提高。
(2)复算指令和原指令具有相同的指令码,使用相同的功能单元,容易形成流水线堵塞,降低程序运行速度。
(3)无法检测出发生在指令译码单元和功能单元中的软错误,因为复算指令和原指令具有相同的指令码,使用相同的功能单元,若错误会导致原数据和副本数据发生相同的错误结果。
因为已有软件实现的软错错误检测方法在DSP中存在上述问题,必须研究检测效率更高而对程序本身性能影响较小的软错误检测方法。
发明内容
本发明要解决的技术问题是,克服已有的软错误检测方法不适用于DSP以及基于源代码级方法执行性能开销大的问题,提供一种基于线形汇编指令差异性变换的DSP软错误检测方法,将线形汇编源程序转换为具有软错误检测能力的线形汇编程序,通过三大指令差异性变换方法:指令等价变换、优化检测指令、延迟错误处理,显著提高加固后代码的执行效率,同时增加指令之间的差异性,达到最大限度暴露故障的目的,提高软错误检测率。指令等价变换方法是对DSP线形汇编指令进行语义等价变化,用执行时间短的指令替换执行时间长的指令,用可分配功能单元多的指令替换可分配功能单元少的指令,显著降低加固的性能开销,同时增加指令码的差异性。优化检测指令方法是在检测指令中用异或指令XOR取代比较指令CMPEQ来进行检测(因XOR相较于CMPEQ更利于功能单元的分配和软件流水线的编排),同时利用DSP指令条件执行的特点,将同一组检测指令中的若干跳转指令合并为一条跳转指令,从而显著降低加固的性能开销。延迟错误处理方法是针对可被编译优化的循环,使用一个寄存器ERROR记录循环内部检测到的错误,并将这些错误延迟到循环结束再处理,从而显著降低加固的性能开销。
本发明的技术方案是:针对原始线形汇编程序,将程序划分为无存基本块序列;以无存基本块序列构建程序控制流图;基于程序控制流图,识别出循环,并筛选出可编排软件流水的循环,为这种循环的基本块做标识;对程序进行加固,为每个无存基本块添加错误检测指令,采用指令差异性变换方法,对部分指令进行等价性变换,用执行时间短的指令替换执行时间长的指令,用可分配功能单元多的指令替换可分配功能单元少的指令,对其余指令进行复算,并在存储指令以及跳转指令前插入检测指令,利用DSP指令条件执行的特点以及等价变换方法优化检测指令,并针对标识循环的基本块采用延迟错误处理方法,降低加固带来的性能开销;执行加固后的程序,检测发生在运行时的软错误。
具体技术方案为:
第一步,将程序划分为N个无存基本块SBB1,SBB2,…SBBN的序列,具体方法与背景技术所述EDDI方法第一步相同。
第二步,基于无存基本块序列SBB1,SBB2,…SBBN,构造程序控制流图G(V,E),V为节点集合,取值为V1,V2,…VM,V1为程序的入口节点,VM为程序的出口节点,E为边集合。具体过程为:
2.1将每个无存基本块作为G(V,E)的一个节点。
2.2令i2=1。2.3判断SBBi2最后一条指令的类型,若为无条件跳转指令则执行第2.4步,若为条件跳转指令则执行第2.5步,若为函数调用指令则执行第2.7步,否则为普通指令,执行第2.6步。
2.4在G(V,E)中添加一条节点SBBi2到转移目标所在的基本块节点的有向边,转2.8步。
2.5在G(V,E)中添加一条节点SBBi2到转移目标所在的基本块节点的有向边,并且添加一条节点SBBi2到节点SBBi2+1的有向边,转2.8步。
2.6在G(V,E)中添加一条节点SBBi2到节点SBBi2+1的有向边,转第2.8步。
2.7在G(V,E)中从SBBi2向被调用函数的入口无存基本块画一条有向边,并且从被调用函数的退出无存基本块向SBBi2+1画一条有向边,表示函数返回的控制流转移,转2.8步。
2.8i2=i2+1。
2.9判断i2是否大于N,若是则得到G(V,E),执行第三步,否则执行第2.3步。
第三步,基于G(V,E),找到程序中所有可被编译优化的循环,并为这些循环的无存基本块做标识。可被编译优化的循环即除了循环的第一个无存基本块外没有循环外部到其内部的控制流转移,且除了循环的最后一个无存基本块外没有循环内部到外部的控制流转移,体现在控制流图上即循环除头节点具有多个入度外,其余节点入度为1,除尾节点具有多出度外,其余节点出度为1。这一步的具体过程为:
3.1从V1开始采用深度优先搜索遍历G(V,E),得到一个树形结构T,T的叶节点是程序执行结束的节点或者是G(V,E)的深度优先搜索已经遍历过的节点。具体步骤为:
3.1.1建立树结构T,令根节点为V0。
3.1.2令Vi3=V1,Vi4=V0。
3.1.3将Vi3加入树形结构T,作为T中Vi4的子节点。
3.1.4判断Vi3是否遍历过,若是则执行第3.1.5步,否则执行第3.1.6步。
3.1.5令Vi3=Vi4,Vi4=Vi4在T中的父节点。
3.1.6判断是否有从Vi3出发未被访问的路径,若有则执行第3.1.7步,否则执行第3.1.8步。
3.1.7令Vi4=Vi3,Vi3=Vi3通过这条路径连接的节点,执行第3.1.3步。
3.1.8判断Vi3是否等于V1,若是则表示得到了T,转3.2步,否则执行第3.1.9步。
3.1.9令Vi3=Vi4,Vi4=Vi4在T中的父节点,执行第3.1.6步。
3.2遍历树形结构T,得到T中所有叶节点L1,L2,…,LN1,N1为T中叶节点的个数。
3.3从每个叶节点开始,向上搜索,若一个叶节点和它的某个祖先结点相同,则找到该祖先节点到此叶节点的循环,将找到的循环存放在集合LOOP中。这一步的具体步骤为:
3.3.1令i5=1,集合
3.3.2令Lf=Li5的父节点。
3.3.3判断Lf是否等于Li5,若不等于则转3.3.4,若等于则找到一条从Lf到Li5的循环,加入到集合LOOP中。
3.3.4判断Lf是否等于树T的根节点V0,若是则i5=i5+1,转3.3.5步,否则令Lf=Lf在T中的父节点,执行第3.3.3步。
3.3.5判断i5是否大于N1,若是则表示搜索完毕,得到了LOOP,执行3.4步,否则执行第3.3.2步。
3.4从集合LOOP中筛选出可被编译优化的循环,并为这些循环的无存基本块做标识。可被编译优化的循环是指在G(V,E)中除头节点具有多个入度外,其余节点入度为1,除尾节点具有多出度外,其余节点出度为1的循环。具体步骤为:
3.4.1判断LOOP是否为空集,若是则执行第四步,否则执行第3.4.2步。
3.4.2选取LOOP中的一个循环li,LOOP=LOOP-{li}。
3.4.3判断li是否可被编译优化,若不可则转第3.4.1步,若可被编译优化,执行3.4.4步。
3.4.4为每个属于li的无存基本块做标识L,且为li的第一个和最后一个无存基本块分别做标识H和T,转3.4.1步。
第四步,对程序进行加固,即为无存基本块序列SBB1,SBB2,…SBBN添加合适的复算指令和检测指令,添加的检测指令都采用优化检测指令方法进行优化以减少引入的跳转指令,降低加固带来的性能开销。对于可被编译优化的循环采用延迟错误处理方法降低加固带来的性能开销。第四步的具体过程为:
4.1令i6=1。
4.2对SBBi6除最后一条指令外的所有源程序指令MI,生成相应的副本指令SI插入到对应的MI指令后面,采用指令等价变换方法对以下所述指令进行指令差异性复算,提高错误检测能力,用执行时间短的指令替换执行时间长者,用可分配功能单元多的指令替换可分配功能单元少的指令,降低加固带来的性能开销,令寄存器A1_c为寄存器A1的副本,令寄存器A2_c为寄存器A2的副本,自然数n为立即数,其具体过程为:
4.2.1若MI为“SUB A1,n,A2”,则SI等价变换为“ADD A1_c,-n,A2_c”,转4.3。
4.2.2若MI为“MPY A1,2n,A2”,则SI等价变换为“SHL A1_c,n,A2_c”,转4.3。
4.2.3若MI为“MV A1,A2”,则SI等价变换为“ADD A1_c,0,A2_c”,转4.3。
4.2.4若MI为“ZERO A1”,则SI等价变换为“CLR A1_c,0,31,A1_c”,转4.3。
4.2.5若MI为“AND A1,2n-1,A2”,则SI等价变换为“CLR A1_c,n,31,A2_c”,转4.3。
4.2.6若MI为“OR A1,2n+1-1,A2”,则SI等价变换为“SET A1_c,0,n,A2_c”,转4.3。
4.2.7若MI为“OR A1,2n,A2”,则SI等价变换为“SET A1_c,n,n,A2_c”,转4.3。
4.2.8若MI为“CMPGT A1,A2,A3”,则SI等价变换为“CMPLT A2_c,A1_c,A3_c”,转4.3。
4.2.9若MI为“CMPLT A1,A2,A3”,则SI等价变换为“CMPGT A2_c,A1_c,A3_c”,转4.3。
4.2.10若MI为“CMPGT2A1,A2,A3”,则SI等价变换为“CMPLT2A2_c,A1_c,A3_c”,转4.3。
4.2.11若MI为“CMPLT2A1,A2,A3”,则SI等价变换为“CMPGT2A2_c,A1_c,A3_c”,转4.3。
4.2.12若MI为“CMPGTU4A1,A2,A3”,则SI等价变换为“CMPLTU4A2_c,A1_c,A3_c”,转4.3。
4.2.13若MI为“CMPLTU4A1,A2,A3”,则SI等价变换为“CMPGTU4A2_c,A1_c,A3_c”,转4.3。
4.2.14若MI为“CMPGTSP A1,A2,A3”,则SI等价变换为“CMPLTSP A2_c,A1_c,A3_c”,转4.3。
4.2.15若MI为“CMPLTSP A1,A2,A3”,则SI等价变换为“CMPGTSP A2_c,A1_c,A3_c”,转4.3。
4.2.16若MI为“CMPGTDP A1,A2,A3”,则SI等价变换为“CMPLTDP A2_c,A1_c,A3_c”,转4.3。
4.2.17若MI为“CMPLTDP A1,A2,A3”,则SI等价变换为“CMPGTDP A2_c,A1_c,A3_c”,转4.3。
4.2.18若MI不为以上17种情况,则SI与MI使用相同的指令码,SI中的操作数为MI中操作数的副本,转4.3。
4.3判断SBBi6是否具有标志L,若没有,执行第4.4步,若具有标志L,执行第4.5步。
4.4SBBi6不具有标志L,表示此基本块所在的循环无法经编译器排出软件流水线,按以下方法添加复算指令,其具体过程为:
4.4.1判断SBBi6最后一条指令的类型,若为存储指令,转4.4.3,若为跳转指令,则转4.4.4,既不是存储指令又不是跳转指令,转4.4.2。
4.4.2在这条指令后插入复算指令,复算指令与这条指令具有相同的指令码,复算指令中的操作数为原指令操作数的副本,转4.6。
4.4.3在这条指令前插入第三检测指令,第三检测指令是由一组异或指令和一条跳转指令组成的指令,其功能是使用异或指令XOR检测存储指令的数据、内存地址、偏移量、指令执行条件等变量的原始数据版本与副本数据版本的一致性,一致时程序正常继续执行,当发现不一致时,由跳转指令转到错误处理函数。令寄存器A0_c为寄存器A0的副本,令寄存器A1_c为寄存器A1的副本,寄存器A2_c为寄存器A2的副本,寄存器A3_c为寄存器A3的副本,EQ是储存检测结果的寄存器,ERR为错误处理函数,这一步的具体过程为:
4.4.3.1在存储指令之前依次插入比较语句“XOR A1,A1_c,EQ”、“[!EQ]XOR A2,A2_c,EQ”和错误处理语句(跳转指令)“[EQ]B ERR”,A1、A2分别是数据操作数和地址操作数。
4.4.3.2若存储指令具有执行条件,假设其存储在寄存器A0中,则在错误处理语句前插入比较语句“[!EQ]XOR A0,A0_c,EQ”,转4.4.3.3,若存储指令没有执行条件,则直接转4.4.3.3。
4.4.3.3若存储指令具有偏移地址,假设其存储在寄存器A3中,则在错误处理语句前插入比较语句“[!EQ]XOR A3,A3_c,EQ”,转4.6,若存储指令没有偏移地址,则直接转4.6。
4.4.4在这条指令前插入第四检测指令,第四检测指令是由一组异或指令和一条跳转指令组成的指令,其功能是使用异或指令XOR检测跳转的地址、指令的执行条件等变量的原始数据版本与副本数据版本的一致性,一致时程序正常继续执行,当发现不一致时,由跳转指令转到错误处理函数。这一步的具体过程为:
4.4.4.1在跳转指令之前依次插入比较语句“XOR A0,A0_c,EQ”和错误处理语句“[EQ]B ERR”,A0中存储的是指令的执行条件,转4.4.4.2。
4.4.4.2若跳转指令的目的地址存储在寄存器A1中,则在错误处理语句前插入比较语句“[!EQ]XOR A1,A1_c,EQ”,转4.6,若跳转指令的目的地址没有存在寄存器中,则直接转4.6。
4.5此时SBBi6具有标志L,即此基本块所在的循环可以经编译器排出软件流水线,则采用延迟错误处理方法,使用一个寄存器ERROR记录循环内部检测的错误,并将这些错误延迟到循环结束再处理。这一步的具体过程为:
4.5.1若SBBi6还具有标志H,即SBBi6为循环的第一个无存基本块,则在SBBi6第一条语句之前插入循环错误信息寄存器初始化语句“ZERO ERROR”,转4.5.2。若SBBi6不具有标志H,则直接转4.5.2。
4.5.2若SBBi6还具有标志T,即SBBi6为循环的最后一个无存基本块,则在SBBi6最后一条语句之后插入调用错误处理例程语句“[ERROR]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.5.5.1在存储指令之前依次插入比较语句“XOR A1,A1_c,EQ”、“[!EQ]XOR A2,A2_c,EQ”和错误信息记录语句“[EQ]MVK 0xffff,ERROR”,A1、A2分别是数据操作数和地址操作数。
4.5.5.2若存储指令具有执行条件,假设其存储在寄存器A0中,则在错误信息记录语句前插入比较语句“[!EQ]XOR A0,A0_c,EQ”,在存储指令前插入存储指令执行条件无效化语句“[ERROR]ZERO A0”,转4.5.5.3。若存储指令不具有执行条件,则为这条存储指令添加执行条件“[!ERROR]”,使此存储指令根据ERROR寄存器的值按条件进行存储,转4.5.5.3。
4.5.5.3若存储指令具有偏移地址,假设其存储在寄存器A3中,则在错误信息记录语句前插入比较语句“[!EQ]XOR A3,A3_c,EQ”,转4.6。若存储指令不具有偏移地址,则直接转4.6。
4.5.6在这条指令前插入第六检测语句,第六检测指令是由一组异或指令、一条错误信息记录指令和一条循环计数器清零指令组成的指令,其功能是使用异或指令XOR检测跳转指令的地址、指令执行条件等变量的原始数据版本与副本数据版本的一致性,一致时程序正常继续执行,当发现不一致时,采用延迟错误处理方法将检测到的错误记录到ERROR寄存器中,并在循环结束的位置插入循环错误判断的指令,根据ERROR寄存器的值进行错误处理。在检测到错误的情况下,为了降低错误处理延迟,将循环计数器清零从而结束循环。这一步的具体过程为:
4.5.6.1在跳转指令前依次插入比较语句“XOR A0,A0_c,EQ”、错误信息记录语句“[EQ]MVK 0xffff,ERROR”和循环计数器清零语句“[ERROR]ZERO A0”,A0中存储的是指令的执行条件,转4.5.6.2。
4.5.6.2若跳转指令的目的地址存储在寄存器A1中,则在错误信息记录语句前插入比较语句“[!EQ]XOR A1,A1_c,EQ”,转4.6。若跳转指令的目的地址没有存在寄存器中,则直接转4.6。
4.6i6=i6+1。
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结束。
与已有的DSP程序数据错误检测方法相比,采用本发明可以达到以下的技术效果:
(1)本发明第四步对程序进行加固是一种纯软件方法,不需要修改底层DSP硬件,加固后的程序具有软错误检测能力,不需要操作系统的多线程支持。
(2)本发明由于第四步添加的检测指令采用的优化检测指令方法利用了DSP线形汇编指令条件执行的特点,将每个同步检查点多次比较和跳转指令合并为多次比较一次跳转,从而显著降低加固的性能开销。
(3)本发明由于第4.2步采用了指令等价性变换方法,用指令执行周期少的指令替换指令执行周期多者,用可选功能单元较多的等价指令替换可选功能单元较少者,更有利于防止因功能单元分配不均导致的流水线阻塞,从而提高加固后程序的执行效率。
(4)本发明对数据错误的检测率很高,能够检测出很多硬件瞬时故障引起的程序软错误。同时本发明由于第4.2步采用指令等价变换方法对部分指令进行指令差异性复算,指令和其副本可能使用不同的指令码和功能单元,因此本发明还能检测出一部分硬件故障引起的持续性错误,例如指令译码单元的错误和功能单元的错误。由于采用了指令差异性复算,提高了原始指令和复算指令之间的差异性,达到了最大限度暴露软错误的目的,使得本发明的数据错误检测率明显提高,在99.4%以上。
(5)本发明由于第4.5步引入了延迟错误处理方法,针对循环内部的检查点会引入控制跳转语句从而破坏循环软件流水线的建立这一影响性能的关键问题,使用一个寄存器ERROR存储循环内部是否检测到错误这一信息,不是在循环内部检测到错误后立即跳转到错误处理例程,而是等到循环结束后再根据ERROR寄存器的信息去进行错误处理。使得添加了数据错误检测功能的程序循环结构依然可以像加固前一样建立软件流水线,在不降低错误检测率的同时以一定的错误处理延迟为代价,显著提高了加固后程序的执行速度,降低了性能开销。
(6)本发明由于第四步结合使用了三大指令差异性变换方法:指令等价变换、优化检测指令、延迟错误处理,显著提高了加固后代码的执行效率,降低了加固带来的性能开销,同时增加指令之间的差异性,达到最大限度暴露故障的目的,提高了故障检测率。
附图说明
图1是本发明的总流程图;
图2是本发明的第二步基于无存基本块序列SBB1,SBB2,…SBBN,构造程序控制流图G(V,E)的流程图;
图3是本发明的第三步基于G(V,E),找到程序中所有可被编译优化的循环,并为这些循环的无存基本块做标识的流程图;
图4是本发明的第四步对程序进行加固,即为无存基本块序列SBB1,SBB2,…SBBN添加合适的复算指令和检测指令的流程图;
图5是本发明的第五步执行完成了加固的线形汇编程序,检测发生在运行时的软错误的流程图;
图6是本发明的第3.1步从V1开始采用深度优先搜索遍历G(V,E),得到一个树形结构T,T的叶节点是程序执行结束的节点或者是G(V,E)的深度优先搜索已经遍历过的节点的流程图。
具体实施方式
图1是本发明的总流程图,主要包括以下五个步骤:
1.将线形汇编源程序划分为无存基本块序列SBB1,SBB2,…SBBN。
2.基于无存基本块序列SBB1,SBB2,…SBBN,构造程序控制流图G(V,E)。
3.基于程序控制流图G(V,E),找到程序中所有可被编译优化的循环,并为这些循环的无存基本块做标识。
4.对程序进行加固,为每个无存基本块添加合适的复算指令和检测指令。
5.执行加固后的程序,检测发生在运行时的软错误。
通过以上五步,就能实现DSP线形汇编程序的软错误检测。
图2是本发明的第二步基于无存基本块序列SBB1,SBB2,…SBBN,构造程序控制流图G(V,E)的流程图,主要包括九大步骤:
2.1.将每个无存基本块作为G(V,E)的一个节点。
2.2.令i2=1。
2.3.判断SBBi2最后一条指令的类型,若为无条件跳转指令则执行第2.4步,若为条件跳转指令则执行第2.5步,若为函数调用指令则执行第2.7步,否则为普通指令,执行第2.6步。
2.4.在G(V,E)中添加一条节点SBBi2到转移目标所在的基本块节点的有向边,转2.8步。
2.5.在G(V,E)中添加一条节点SBBi2到转移目标所在的基本块节点的有向边,并且添加一条节点SBBi2到节点SBBi2+1的有向边,转2.8步。
2.6.在G(V,E)中添加一条节点SBBi2到节点SBBi2+1的有向边,转第2.8步。
2.7.在G(V,E)中从SBBi2向被调用函数的入口无存基本块画一条有向边,并且从被调用函数的退出无存基本块向SBBi2+1画一条有向边,表示函数返回的控制流转移,转2.8步。
2.8.i2=i2+1。
2.9.判断i2是否大于N,若是则得到G(V,E),执行第三步,否则执行第2.3步。
图3是本发明的第三步基于G(V,E),找到程序中所有可被编译优化的循环,并为这些循环的无存基本块做标识的流程图,主要包括四大步骤:
3.1.从V1开始采用深度优先搜索遍历G(V,E),得到一个树形结构T,T的叶节点是程序执行结束的节点或者是G(V,E)的深度优先搜索已经遍历过的节点。
3.2.遍历树形结构T,得到T中所有叶节点L1,L2,…,LN1,N1为T中叶节点的个数。
3.3.从每个叶节点开始,向上搜索,若一个叶节点和它的某个祖先结点相同,则找到该祖先节点到此叶节点的循环,找到的循环存放在集合LOOP中。
3.4.从集合LOOP中筛选出可被编译优化的循环,并为这些循环的无存基本块做标识,转第四步。可被编译优化的循环是指在G(V,E)中除头节点具有多个入度外,其余节点入度为1,除尾节点具有多出度外,其余节点出度为1的循环。
图4是本发明的第四步对程序进行加固,为每个无存基本块添加合适的复算指令和检测指令的流程图,主要包括七大步骤:
4.1.令i6=1。
4.2.对SBBi6除最后一条指令外的所有源程序指令MI,生成相应的副本指令SI插入到对应的MI指令后面,采用指令等价变换方法对部分指令进行复算。
4.3.判断SBBi6是否具有标志L,若没有,执行第4.4步,若具有标志L,执行第4.5步。
4.4.SBBi6不具有标志L,表示此基本块所在的循环无法经编译器排出软件流水线,按以下方法添加复算指令,其具体过程为:
4.4.1.判断SBBi6最后一条指令的类型,若为存储指令,转4.4.3,若为跳转指令,则转4.4.4,既不是存储指令又不是跳转指令,转4.4.2。
4.4.2.在这条指令后插入复算指令,复算指令与这条指令具有相同的指令码,复算指令中的操作数为原指令操作数的副本,转4.6。
4.4.3.在这条指令前插入第三检测指令,第三检测指令是由一组异或指令和一条跳转指令组成的指令,其功能是使用异或指令XOR检测存储指令的数据、内存地址、偏移量、指令执行条件等变量的原始数据版本与副本数据版本的一致性,一致时程序正常继续执行,当发现不一致时,由跳转指令转到错误处理函数。转第4.6步。
4.4.4.在这条指令前插入第四检测指令,第四检测指令是由一组异或指令和一条跳转指令组成的指令,其功能是使用异或指令XOR检测跳转的地址、指令的执行条件等变量的原始数据版本与副本数据版本的一致性,一致时程序正常继续执行,当发现不一致时,由跳转指令转到错误处理函数。转第4.6步。
4.5.此时SBBi6具有标志L,即此基本块所在的循环可以经编译器排出软件流水线,则采用延迟错误处理方法,使用一个寄存器ERROR记录循环内部检测的错误,并将这些错误延迟到循环结束再处理。这一步的具体过程为:
4.5.1.若SBBi6还具有标志H,即SBBi6为循环的第一个无存基本块,则在SBBi6第一条语句之前插入循环错误信息寄存器初始化语句“ZERO ERROR”,转4.5.2。若SBBi6不具有标志H,则直接转4.5.2。
4.5.2.若SBBi6还具有标志T,即SBBi6为循环的最后一个无存基本块,则在SBBi6最后一条语句之后插入调用错误处理例程语句“[ERROR]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.i6=i6+1。
4.7.判断i6是否大于N,若是则执行第五步,此时原始代码已经转换为具有软错误检测能力的汇编程序,否则执行第4.2步。
图5是本发明的第五步执行加固后的程序,检测发生在运行时的软错误的流程图,主要包括七大步骤:
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.结束。
图6是本发明的第3.1步从V1开始采用深度优先搜索遍历G(V,E),得到一个树形结构T,T的叶节点是程序执行结束的节点或者是G(V,E)的深度优先搜索已经遍历过的节点的流程图,主要包括九大步骤:
3.1.1.建立树结构T,令根节点为V0。
3.1.2.令Vi3=V1,Vi4=V0。
3.1.3.将Vi3加入树形结构T,作为T中Vi4的子节点。
3.1.4.判断Vi3是否遍历过,若是则执行第3.1.5步,否则执行第3.1.6步。
3.1.5.令Vi3=Vi4,Vi4=Vi4在T中的父节点。
3.1.6.判断是否有从Vi3出发未被访问的路径,若有则执行第3.1.7步,否则执行第3.1.8步。
3.1.7.令Vi4=Vi3,Vi3=Vi3通过这条路径连接的节点,执行第3.1.3步。
3.1.8.判断Vi3是否等于V1,若是则表示得到了T,转3.2步,否则执行第3.1.9步。
3.1.9.令Vi3=Vi4,Vi4=Vi4在T中的父节点,执行第3.1.6步。
Claims (9)
1.一种基于线形汇编指令差异性变换的DSP软错误检测方法,其特征在于包括以下步骤:
第一步,将程序划分为N个无存基本块SBB1,SBB2,…SBBN的序列,N为正整数,无存基本块是程序中能够顺序执行的指令序列的集合,这组指令序列只有最后一条指令可以是存储指令或程序控制指令,这组指令只有一个入口和一个出口,入口就是第一条指令,出口就是最后一条指令;
第二步,基于无存基本块序列SBB1,SBB2,…SBBN,构造程序控制流图G(V,E),V为节点集合,取值为V1,V2,…VM,V1为程序的入口节点,VM为程序的出口节点,E为边集合;
第三步,基于G(V,E),找到程序中所有可被编译优化的循环,并为这些循环的无存基本块做标识;可被编译优化的循环是指除了循环的第一个无存基本块外没有循环外部到其内部的控制流转移,且除了循环的最后一个无存基本块外没有循环内部到外部的控制流转移,体现在控制流图上即循环除头节点具有多个入度外,其余节点入度为1,除尾节点具有多出度外,其余节点出度为1;这一步的具体过程为:
3.1从V1开始采用深度优先搜索遍历G(V,E),得到一个树形结构T,T的叶节点是程序执行结束的节点或者是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中的一个循环li,LOOP=LOOP-{li};
3.4.3判断li是否可被编译优化,若不可则转第3.4.1步,若可被编译优化,执行3.4.4步;
3.4.4为每个属于li的无存基本块做标识L,且为li的第一个和最后一个无存基本块分别做标识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.4SBBi6不具有标志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此时SBBi6具有标志L,即此基本块所在的循环可以经编译器排出软件流水线,则采用延迟错误处理方法,使用一个寄存器ERROR记录循环内部检测的错误,并将这些错误延迟到循环结束再处理;这一步的具体过程为:
4.5.1若SBBi6还具有标志H,即SBBi6为循环的第一个无存基本块,则在SBBi6第一条语句之前插入循环错误信息寄存器初始化语句“ZERO ERROR”,转4.5.2;若SBBi6不具有标志H,则直接转4.5.2;
4.5.2若SBBi6还具有标志T,即SBBi6为循环的最后一个无存基本块,则在SBBi6最后一条语句之后插入调用错误处理例程语句“[ERROR]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+1;
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软错误检测方法,其特征在于第二步所述基于无存基本块序列SBB1,SBB2,…SBBN,构造G(V,E)的具体过程为:2.1将每个无存基本块作为G(V,E)的一个节点;
2.2令i2=1;
2.3判断SBBi2最后一条指令的类型,若为无条件跳转指令则执行第2.4步,若为条件跳转指令则执行第2.5步,若为函数调用指令则执行第2.7步,否则为普通指令,执行第2.6步;
2.4在G(V,E)中添加一条节点SBBi2到转移目标所在的基本块节点的有向边,转2.8步;
2.5在G(V,E)中添加一条节点SBBi2到转移目标所在的基本块节点的有向边,并且添加一条节点SBBi2到节点SBBi2+1的有向边,转2.8步;
2.6在G(V,E)中添加一条节点SBBi2到节点SBBi2+1的有向边,转第2.8步;
2.7在G(V,E)中从SBBi2向被调用函数的入口无存基本块画一条有向边,并且从被调用函数的退出无存基本块向SBBi2+1画一条有向边,表示函数返回的控制流转移,转2.8步;
2.8i2=i2+1;
2.9判断i2是否大于N,若是则得到G(V,E);否则执行第2.3步。
3.如权利要求1所述的一种基于线形汇编指令差异性变换的DSP软错误检测方法,其特征在于第三步的3.1步所述从V1开始深度优先搜索遍历G(V,E),得到树形结构T的具体步骤为:
3.1.1建立树结构T,令根节点为V0;
3.1.2令Vi3=V1,Vi4=V0;
3.1.3将Vi3加入树形结构T,作为T中Vi4的子节点;
3.1.4判断Vi3是否遍历过,若是则执行第3.1.5步,否则执行第3.1.6步;
3.1.5令Vi3=Vi4,Vi4=Vi4在T中的父节点;
3.1.6判断是否有从Vi3出发未被访问的路径,若有则执行第3.1.7步,否则执行第3.1.8步;
3.1.7令Vi4=Vi3,Vi3=Vi3通过这条路径连接的节点,执行第3.1.3步;
3.1.8判断Vi3是否等于V1,若是则表示得到了T,结束,否则执行第3.1.9步;
3.1.9令Vi3=Vi4,Vi4=Vi4在T中的父节点,执行第3.1.6步。
4.如权利要求1所述的一种基于线形汇编指令差异性变换的DSP软错误检测方法,其特征在于第三步的3.3步所述从每个叶节点开始,向上搜索,将找到的循环存放在集合LOOP中的具体步骤为:
3.3.1令i5=1,集合
3.3.2令Lf=Li5的父节点;
3.3.3判断Lf是否等于Li5,若不等于则转3.3.4,若等于则找到一条从Lf到Li5的循环,加入到集合LOOP中;
3.3.4判断Lf是否等于树T的根节点V0,若是则i5=i5+1,转3.3.5步,否则令Lf=Lf在T中的父节点,执行第3.3.3步;
3.3.5判断i5是否大于N1,若是则表示搜索完毕,结束,否则执行第3.3.2步。
5.如权利要求1所述的一种基于线形汇编指令差异性变换的DSP软错误检测方法,其特征在于第四步的4.2步所述采用指令等价变换方法对指令进行指令差异性复算的具体过程如下,其中寄存器A1_c为寄存器A1的副本,寄存器A2_c为寄存器A2的副本,自然数n为立即数:
4.2.1若MI为“SUB A1,n,A2”,则SI等价变换为“ADD A1_c,-n,A2_c”,结束;
4.2.2若MI为“MPY A1,2n,A2”,则SI等价变换为“SHL A1_c,n,A2_c”,结束;
4.2.3若MI为“MV A1,A2”,则SI等价变换为“ADD A1_c,0,A2_c”,结束;
4.2.4若MI为“ZERO A1”,则SI等价变换为“CLR A1_c,0,31,A1_c”,结束;
4.2.5若MI为“AND A1,2n-1,A2”,则SI等价变换为“CLR A1_c,n,31,A2_c”,结束;
4.2.6若MI为“OR A1,2n+1-1,A2”,则SI等价变换为“SET A1_c,0,n,A2_c”,结束;
4.2.7若MI为“OR A1,2n,A2”,则SI等价变换为“SET A1_c,n,n,A2_c”,结束;
4.2.8若MI为“CMPGT A1,A2,A3”,则SI等价变换为“CMPLT A2_c,A1_c,A3_c”,结束;
4.2.9若MI为“CMPLT A1,A2,A3”,则SI等价变换为“CMPGT A2_c,A1_c,A3_c”,结束;
4.2.10若MI为“CMPGT2A1,A2,A3”,则SI等价变换为“CMPLT2A2_c,A1_c,A3_c”,结束;
4.2.11若MI为“CMPLT2A1,A2,A3”,则SI等价变换为“CMPGT2A2_c,A1_c,A3_c”,结束;
4.2.12若MI为“CMPGTU4A1,A2,A3”,则SI等价变换为“CMPLTU4A2_c,A1_c,A3_c”,结束;
4.2.13若MI为“CMPLTU4A1,A2,A3”,则SI等价变换为“CMPGTU4A2_c,A1_c,A3_c”,结束;
4.2.14若MI为“CMPGTSP A1,A2,A3”,则SI等价变换为“CMPLTSP A2_c,A1_c,A3_c”,结束;
4.2.15若MI为“CMPLTSP A1,A2,A3”,则SI等价变换为“CMPGTSP A2_c,A1_c,A3_c”,结束;
4.2.16若MI为“CMPGTDP A1,A2,A3”,则SI等价变换为“CMPLTDP A2_c,A1_c,A3_c”,结束;
4.2.17若MI为“CMPLTDP A1,A2,A3”,则SI等价变换为“CMPGTDP A2_c,A1_c,A3_c”,结束;
4.2.18若MI不为以上17种情况,则SI与MI使用相同的指令码,SI中的操作数为MI中操作数的副本,结束。
6.如权利要求1所述的一种基于线形汇编指令差异性变换的DSP软错误检测方法,其特征在于第四步的4.4.3步所述在指令前插入第三检测指令的具体过程为:
4.4.3.1在存储指令之前依次插入比较语句“XOR A1,A1_c,EQ”、“[!EQ]XOR A2,A2_c,EQ”和错误处理语句“[EQ]B ERR”,A1、A2分别是数据操作数和地址操作数;
4.4.3.2若存储指令具有执行条件,假设其存储在寄存器A0中,则在错误处理语句前插入比较语句“[!EQ]XOR A0,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 A0,A0_c,EQ”和错误处理语句“[EQ]B ERR”,A0中存储的是指令的执行条件,转4.4.4.2;
4.4.4.2若跳转指令的目的地址存储在寄存器A1中,则在错误处理语句前插入比较语句“[!EQ]XOR A1,A1_c,EQ”,结束,若跳转指令的目的地址没有存在寄存器中,则直接结束。
8.如权利要求1所述的一种基于线形汇编指令差异性变换的DSP软错误检测方法,其特征在于第四步的4.5.5步所述在指令前插入第五检测指令的具体过程为:
4.5.5.1在存储指令之前依次插入比较语句“XOR A1,A1_c,EQ”、“[!EQ]XOR A2,A2_c,EQ”和错误信息记录语句“[EQ]MVK 0xffff,ERROR”,A1、A2分别是数据操作数和地址操作数;
4.5.5.2若存储指令具有执行条件,假设其存储在寄存器A0中,则在错误信息记录语句前插入比较语句“[!EQ]XOR A0,A0_c,EQ”,在存储指令前插入存储指令执行条件无效化语句“[ERROR]ZERO A0”,转4.5.5.3;若存储指令不具有执行条件,则为这条存储指令添加执行条件“[!ERROR]”,使此存储指令根据ERROR寄存器的值按条件进行存储,转4.5.5.3;
4.5.5.3若存储指令具有偏移地址,假设其存储在寄存器A3中,则在错误信息记录语句前插入比较语句“[!EQ]XOR A3,A3_c,EQ”,结束;若存储指令不具有偏移地址,则直接结束。
9.如权利要求1所述的一种基于线形汇编指令差异性变换的DSP软错误检测方法,其特征在于第四步的4.5.6步所述在指令前插入第六检测语句的具体过程为:
4.5.6.1在跳转指令前依次插入比较语句“XOR A0,A0_c,EQ”、错误信息记录语句“[EQ]MVK 0xffff,ERROR”和循环计数器清零语句“[ERROR]ZERO A0”,A0中存储的是指令的执行条件,转4.5.6.2;
4.5.6.2若跳转指令的目的地址存储在寄存器A1中,则在错误信息记录语句前插入比较语句“[!EQ]XOR A1,A1_c,EQ”,结束;若跳转指令的目的地址没有存在寄存器中,则直接结束。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610290829.9A CN106021040B (zh) | 2016-05-04 | 2016-05-04 | 一种基于线形汇编指令差异性变换的dsp软错误检测方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610290829.9A CN106021040B (zh) | 2016-05-04 | 2016-05-04 | 一种基于线形汇编指令差异性变换的dsp软错误检测方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN106021040A true CN106021040A (zh) | 2016-10-12 |
CN106021040B CN106021040B (zh) | 2019-07-16 |
Family
ID=57081468
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201610290829.9A Active CN106021040B (zh) | 2016-05-04 | 2016-05-04 | 一种基于线形汇编指令差异性变换的dsp软错误检测方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN106021040B (zh) |
Cited By (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108171016A (zh) * | 2017-11-30 | 2018-06-15 | 中国人民解放军国防科技大学 | 一种线性汇编级的可配置容错方法、计算机、计算机程序 |
CN110059391A (zh) * | 2019-04-10 | 2019-07-26 | 北京中科寒武纪科技有限公司 | 待测器件验证装置及相关产品 |
CN110059390A (zh) * | 2019-04-10 | 2019-07-26 | 北京中科寒武纪科技有限公司 | 待测器件验证装置及相关产品 |
CN110261758A (zh) * | 2019-06-10 | 2019-09-20 | 北京中科寒武纪科技有限公司 | 待测器件验证装置及相关产品 |
CN110529975A (zh) * | 2019-08-16 | 2019-12-03 | 特灵空调系统(中国)有限公司 | 故障诊断方法、装置、机器可读存储介质 |
CN111090466A (zh) * | 2019-12-20 | 2020-05-01 | 北京字节跳动网络技术有限公司 | 调用指令的优化方法、装置、设备和存储介质 |
CN111176785A (zh) * | 2019-12-02 | 2020-05-19 | 东巽科技(北京)有限公司 | 一种基于操作链接的机器指令码取词方法 |
CN111221670A (zh) * | 2019-10-21 | 2020-06-02 | 西安空间无线电技术研究所 | 一种缓解检测冲突的单粒子软错误防护设计方法 |
CN112257870A (zh) * | 2019-11-08 | 2021-01-22 | 安徽寒武纪信息科技有限公司 | 机器学习指令的转换方法及装置、板卡、主板、电子设备 |
CN112278328A (zh) * | 2020-10-28 | 2021-01-29 | 北京和德宇航技术有限公司 | 卫星姿控软件防护方法、装置、设备及存储介质 |
CN112612999A (zh) * | 2020-12-30 | 2021-04-06 | 中国人民解放军战略支援部队信息工程大学 | 基于树结构的多样化变体生成方法及系统 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101751334A (zh) * | 2009-12-30 | 2010-06-23 | 中国人民解放军国防科学技术大学 | 一种基于还原程序的硬件故障检测方法 |
CN101944064A (zh) * | 2010-10-12 | 2011-01-12 | 中国人民解放军国防科学技术大学 | 一种基于重构控制流图的控制流错误检测优化方法 |
CN103345445A (zh) * | 2013-07-02 | 2013-10-09 | 华中科技大学 | 基于控制流检测的抗错误注入攻击的安全芯片设计方法 |
CN104021073A (zh) * | 2014-05-06 | 2014-09-03 | 南京大学 | 一种基于指针分析的软件漏洞检测方法 |
-
2016
- 2016-05-04 CN CN201610290829.9A patent/CN106021040B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101751334A (zh) * | 2009-12-30 | 2010-06-23 | 中国人民解放军国防科学技术大学 | 一种基于还原程序的硬件故障检测方法 |
CN101944064A (zh) * | 2010-10-12 | 2011-01-12 | 中国人民解放军国防科学技术大学 | 一种基于重构控制流图的控制流错误检测优化方法 |
CN103345445A (zh) * | 2013-07-02 | 2013-10-09 | 华中科技大学 | 基于控制流检测的抗错误注入攻击的安全芯片设计方法 |
CN104021073A (zh) * | 2014-05-06 | 2014-09-03 | 南京大学 | 一种基于指针分析的软件漏洞检测方法 |
Cited By (21)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108171016B (zh) * | 2017-11-30 | 2021-04-09 | 中国人民解放军国防科技大学 | 一种线性汇编级的可配置容错方法、计算机、计算机程序 |
CN108171016A (zh) * | 2017-11-30 | 2018-06-15 | 中国人民解放军国防科技大学 | 一种线性汇编级的可配置容错方法、计算机、计算机程序 |
CN110059391A (zh) * | 2019-04-10 | 2019-07-26 | 北京中科寒武纪科技有限公司 | 待测器件验证装置及相关产品 |
CN110059390A (zh) * | 2019-04-10 | 2019-07-26 | 北京中科寒武纪科技有限公司 | 待测器件验证装置及相关产品 |
CN110059391B (zh) * | 2019-04-10 | 2022-12-09 | 中科寒武纪科技股份有限公司 | 待测器件验证装置及相关产品 |
CN110059390B (zh) * | 2019-04-10 | 2022-12-09 | 中科寒武纪科技股份有限公司 | 待测器件验证装置及相关产品 |
CN110261758A (zh) * | 2019-06-10 | 2019-09-20 | 北京中科寒武纪科技有限公司 | 待测器件验证装置及相关产品 |
CN110261758B (zh) * | 2019-06-10 | 2021-09-21 | 中科寒武纪科技股份有限公司 | 待测器件验证装置及相关产品 |
CN110529975A (zh) * | 2019-08-16 | 2019-12-03 | 特灵空调系统(中国)有限公司 | 故障诊断方法、装置、机器可读存储介质 |
CN111221670B (zh) * | 2019-10-21 | 2023-03-28 | 西安空间无线电技术研究所 | 一种缓解检测冲突的单粒子软错误防护设计方法 |
CN111221670A (zh) * | 2019-10-21 | 2020-06-02 | 西安空间无线电技术研究所 | 一种缓解检测冲突的单粒子软错误防护设计方法 |
CN112257870A (zh) * | 2019-11-08 | 2021-01-22 | 安徽寒武纪信息科技有限公司 | 机器学习指令的转换方法及装置、板卡、主板、电子设备 |
CN112257870B (zh) * | 2019-11-08 | 2024-04-09 | 安徽寒武纪信息科技有限公司 | 机器学习指令的转换方法及装置、板卡、主板、电子设备 |
CN111176785B (zh) * | 2019-12-02 | 2023-08-29 | 东巽科技(北京)有限公司 | 一种基于操作链接的机器指令码取词方法 |
CN111176785A (zh) * | 2019-12-02 | 2020-05-19 | 东巽科技(北京)有限公司 | 一种基于操作链接的机器指令码取词方法 |
CN111090466B (zh) * | 2019-12-20 | 2022-03-18 | 北京字节跳动网络技术有限公司 | 调用指令的优化方法、装置、设备和存储介质 |
CN111090466A (zh) * | 2019-12-20 | 2020-05-01 | 北京字节跳动网络技术有限公司 | 调用指令的优化方法、装置、设备和存储介质 |
CN112278328B (zh) * | 2020-10-28 | 2021-07-06 | 北京和德宇航技术有限公司 | 卫星姿控软件防护方法、装置、设备及存储介质 |
CN112278328A (zh) * | 2020-10-28 | 2021-01-29 | 北京和德宇航技术有限公司 | 卫星姿控软件防护方法、装置、设备及存储介质 |
CN112612999A (zh) * | 2020-12-30 | 2021-04-06 | 中国人民解放军战略支援部队信息工程大学 | 基于树结构的多样化变体生成方法及系统 |
CN112612999B (zh) * | 2020-12-30 | 2022-11-15 | 中国人民解放军战略支援部队信息工程大学 | 基于树结构的多样化变体生成方法及系统 |
Also Published As
Publication number | Publication date |
---|---|
CN106021040B (zh) | 2019-07-16 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106021040B (zh) | 一种基于线形汇编指令差异性变换的dsp软错误检测方法 | |
Zhang et al. | DAFT: Decoupled acyclic fault tolerance | |
Schuette et al. | Processor control flow monitoring using signatured instruction streams | |
Alkhalifa et al. | Design and evaluation of system-level checks for on-line control flow error detection | |
Reis et al. | Design and evaluation of hybrid fault-detection systems | |
Donaldson et al. | Automatic analysis of scratch-pad memory code for heterogeneous multicore processors | |
Park et al. | BLoG: Post-silicon bug localization in processors using bug localization graphs | |
Donaldson et al. | Automatic analysis of DMA races using model checking and k-induction | |
CN104090798B (zh) | 动静态结合的中断驱动程序数据竞争检测方法 | |
Zarandi et al. | Two efficient software techniques to detect and correct control-flow errors | |
CN110192186A (zh) | 使用矢量处理电路的错误检测 | |
Wu et al. | Automating CUDA synchronization via program transformation | |
Jiang et al. | CTOS: Compiler testing for optimization sequences of LLVM | |
Pattabiraman et al. | Automated derivation of application-aware error detectors using static analysis: The trusted illiac approach | |
Tan et al. | CFEDR: Control-flow error detection and recovery using encoded signatures monitoring | |
Jianli et al. | A software-implemented configurable control flow checking method | |
Six | Optimized and formally-verified compilation for a VLIW processor | |
Didehban et al. | Generic Soft Error Data and Control Flow Error Detection by Instruction Duplication | |
Vankeirsbilck et al. | Automatic implementation of control flow error detection techniques | |
Henderson et al. | On the use of diagnostic dependence-analysis tools in parallel programming: Experiences using PTOOL | |
Maghsoudloo et al. | An efficient adaptive software-implemented technique to detect control-flow errors in multi-core architectures | |
Tan et al. | Lightweight fault detection in parallelized programs | |
CN108171016B (zh) | 一种线性汇编级的可配置容错方法、计算机、计算机程序 | |
Chen et al. | Compiler-assisted multiple instruction word retry for VLIW architectures | |
Nazarian et al. | Low-cost software control-flow error recovery |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |