论文部分内容阅读
辐射环境中高能带电粒子撞击设备的逻辑单元导致单粒子效应,而单粒子效应造成的瞬时性故障称为软错误。软错误是影响航天计算可靠性的重要因素。随着芯片集成晶体管数呈指数级增长,软错误率按照摩尔定律快速增长,使得航天计算可靠性问题日益严峻。软错误检测技术是解决航天计算可靠性问题的关键环节。硬件层面的软错误检测技术水平目前还难以达到防护的要求,软件层面的软错误检测技术具备制造成本低、独立于底层硬件设计和配置灵活的特点。软件层面的软错误检测技术成为航天计算可靠性的研究重点之一。本文主要研究软件层面的软错误检测问题。针对现有检测方法在检出率、检测代价等方面存在的不足,本文的目标是研究高检出率、低检测代价的检测方法,从而在现有硬件水平基础上,提高航天计算的可靠性,保障卫星在轨期间稳定提供服务。在四种软错误造成的后果类型中,结果错误(Silent Data Corruption,后文简称SDC)是最难检测的一种。当SDC发生时,整个执行过程与正常运行时没有区别,只是程序的输出结果发生了错误。本文重点开展针对SDC的错误传播机理和检测方法研究,并通过错误注入实验评估方法的有效性。本论文的主要工作和贡献包括:(1)通过错误注入实验分析了软错误对栈行为的影响,总结了栈操作常用指针导致SDC的条件和错误传播路径。程序的执行由一系列的函数调用组成,而函数调用一般由栈来实现。栈操作常用的指针包括栈指针、栈帧基址指针和返回地址。栈指针和栈帧基址指针分别存放在寄存器ESP和寄存器EBP。ESP、EBP和返回地址在程序运行中起重要作用,ESP和EBP被频繁地用来寻址,返回地址改变了程序的控制流,但还没有研究工作分析错误的ESP、EBP和返回地址对程序执行的影响。针对返回地址、寄存器ESP和寄存器EBP展开了一系列错误注入实验,分析了错误的返回地址、ESP和EBP导致SDC的条件和错误传播路径,发现控制RET型ESP和EBP只有满足特定条件才会造成SDC,控制RET型ESP导致SDC仅当执行RET指令前ESP指向返回地址;指出了注入时机和翻转位对于注入结果的影响;造成控制RET型EBP发生挂起的原因是返回环路,分析了返回环路的形成过程并给出了其必要条件。(2)通过错误传播分析设计了 SDC脆弱指令的识别方法,研究了 SDC脆弱指令的分布特征和传播特征。SDC脆弱指令是指在其操作数发生软错误会导致SDC的指令。分析SDC脆弱指令对于软错误检测设计及优化都有重要的参考价值。现有寻找SDC脆弱指令方法需要进行巨量的错误注入,时间代价巨大。根据数据关联图建立了指令的数据依赖关系,研究了函数间和函数内部错误传播过程;进而推导出判定SDC脆弱指令的充分条件,提出了 SDC脆弱指令识别方法。该方法根据已执行的错误注入实验信息动态推测潜在的SDC脆弱指令,由此减少未进行的错误注入。在保证较高准确率和覆盖率的前提下,时间代价显著减少。通过分析得到SDC脆弱指令,发现导致SDC的静态指令和源代码的分布集中,并且传播路径上的关键位置是接口指令和比较指令。这些结论为检测器的放置位置提供了依据。(3)针对SDC难以检测的问题,通过引入软件测试中的不变量设计了一种源码级断言检测方法。不变量是运行时刻保持不变的程序特征。在软错误发生后,由于程序受到影响,不变量一般不再满足。根据该原理,在源代码中插入以不变量为内容的断言,利用发生软错误后断言报错来检测软错误。根据SDC脆弱指令分析确定了检测位置,提取了检测位置的不变量;定义了表征不变量检测能力的渗透率,在同一检测位置依据渗透率将不变量转化为断言。通过错误注入实验验证了该检测方法的有效性。相比于源码级断言检测方法的典型工作FaultScrccning,检出代价基本相同,SDC检出率提高了 21%。根据该检测方法实现了针对c程序的程序加固系统1.0版本Radish。Radish通过添加基于不变量的断言对c程序源文件进行加固。基于程序不变量的断言检测方法在检测器的形式上进行了创新,断言包含的关系更丰富、检出率更高,为检测SDC提供新的解决思路。(4)虽然部署了基于不变量的断言,但是错误可能会在未被保护的区域传播。针对此问题,通过设计指令复算改进了基于不变量的断言检测方法。指令复算的检测粒度比断言更细,通过添加指令复算保护了基于不变量的断言未防护的区域,实现了指令复算和基于不变量的断言两种方法的协同。错误注入实验结果表明:相比于原有断言检测方法,添加指令复算后SDC检出率提高了15.5%。根据指令复算实现了程序加固系统2.0版本Radish_D。Radish_D系统包括原有的Radish系统和指令复算模块,加固后输出部署了基于不变量断言和指令复算的可执行文件。