可靠性是评估软件质量的重要属性,关键安全系统(Safety Critical Systems,SCS)对可靠性的要求尤为严格,因其一旦失效,将可能对生命、财产或环境造成重大损害。以汽车为例,ISO26262中ASIL D要求相关系统失效率低于10 Fit(Failure in time),即每千件产品在10∧9小时内的故障数需低于10件。
测试软件可靠性的诸多方法中,较为常见的一种为故障注入测试——根据选定的故障模型选择故障注入工具,人为地将故障注入系统并采集系统反应行为信息,从而进行可靠性分析。
学术上,故障注入技术可根据方式的不同分为基于硬件的故障注入、基于仿真的故障注入和基于软件的故障注入三大类;实际应用中,可根据应用场景的不同分为基于仿真的故障注入与基于原型的故障注入两大类。
本文将从学术领域与实际应用两大角度出发,详述各类故障注入技术的方法与工具。
一、学术领域
*学术领域将故障注入划分为基于硬件、基于仿真与基于软件三大类,由于实际应用中也有仿真类别的分类,本章节仅针对软件与硬件类展开叙述。
▲故障注入系统
故障注入系统通常由目标系统和故障输入系统组成。从物理上看,控制器是可以单独在目标系统或计算机上运行的程序。故障注入器为定制的硬件或软件,本身支持不同的故障类型、位置、时间和部分适配的硬件语义或软件结构,注入的内容则来自故障库。图示中的故障库是一个具备更大灵活性和可移植性的单独组件。
软件故障注入和硬件故障注入在前期选择上,主要受故障类型影响。陷入类故障(如迫使软件中某个点保持永久值),则最好选用硬件注入方法;数据损坏类的故障选用软件注入方法足矣。其他诸如储存单位中的位翻转等故障则可采用任意一种方式进行故障注入,此类情况下,成本、准确性、可重复性等都会影响最终方法的选择。
适合硬件故障注入的故障类型有:
- 开短路故障
- 桥接故障
- 固定型故障(电路中的某个信号不可控,永远固定在同一值)
- 杂散电流故障(指在设计电路外,因泄漏导致流动的电流)
- 电涌故障(指电压瞬间超过了正常工作电压)
适合软件故障注入的故障类型有:
- 存储数据损坏(如寄存器、内存、磁盘)
- 通信数据丢失(如总线和通信网络)
- 软件缺陷(机器级或更高级的软件缺陷)
1.硬件故障注入
硬件故障注入需要使用额外的硬件将故障引入目标系统的硬件,通常可根据注入故障的类型及其注入位置,分为接触式与非接触式两大类。
接触式故障注入使用与电路引脚直接接触目标系统硬件,通常也被称为“引脚级注入”,是硬件故障注入最为常见的方法。可以使用有源探头或插拔式技术来改变引脚处的电流和电压,几乎不对目标系统产生影响。
非接触式故障注入通过产生重离子辐射将故障注入到目标硬件,重离子会穿过靶器件的耗尽区,虽然能够模仿自然的物理现象,但因无法控制重离子发射或电磁场产生的准确时刻而很难准确控制故障注入的时间和位置。
常见的硬件故障注入工具有:
法国图卢兹大学的国家科学研究中心系统分析与架构实验室(LAAC-CNRS)所研发的引脚级故障注入工具Messaline,已成功应用与铁路控制系统的集中式联锁系统及“Esprit Delta-4”项目的分布式系统。
▲Messaline总体架构及环境
瑞典查尔姆斯理工大学开发的用于研究瞬时故障效应的故障插入系统FIST(Fault Injection System for Study of Transient Fault Effect),可同时使用非接触式与接触式方法来模拟目标系统内的瞬时故障,还支持放置MOS三极管控制电压降幅来实现故障干扰。
▲FIST环境配置情况
维也纳科技大学所研发的容错分布系统MARS(Maintainable Real-Time System),除使用FIST所使用的重离子辐射外,还可使用电磁场进行非接触式故障注入。
2.软件故障注入
由于无需昂贵的硬件便可进行测试,软件故障注入在近年来受到了较大关注,尤其是其能够针对应用程序及操作系统等硬件故障注入无法触达的部分。虽然软件故障注入的灵活性较强,但仍有访问位置受限、加重系统工作负载及改变原始软件结构的风险。
软件故障注入可按注入时间分为编译时故障注入与运行时故障注入。工具选择上,通常有以下几种:
德克萨斯大学奥斯汀分校所开发的Ferrari(Fault and Error Automatic Real-Time Injection)系统,能够向CPU、内存与总线注入故障,由初始化与激活器、用户信息、故障注入器及数据收集分析器所组成。
伊利诺伊大学所开发的容错与性能评估器Ftape(Fault Tolerance and Performance Evaluator),可将故障以逐位翻转的方式注入至CPU、内存与磁盘子系统中的可访问寄存器。
▲Ferrari环境配置情况
密歇根大学所开发的Doctor(Integrated Software Fault Injection Environment),使用超时、陷阱与代码修改三种方式实现故障注入的触发,允许注入CPU、内存及网络通信故障。
科英布拉大学所开发的Xception,可通过现代处理器中的高级调试及性能监控功能注入更为真实的故障。Xception故障是基于特定地址访问来触发的,因此更具可重复性。可通过以下事件触发故障出入:
①从指定地址获取操作码或加载操作数
②操作数存储到指定地址
③启动后经过的指定时间
④上述故障触发的组合。
3.软硬件故障注入的比较
通过上表可以发现,硬件故障注入和软件故障注入之间的差距主要在于可访问的故障注入点、成本和干扰水平。
硬件方法可以将故障注入芯片引脚和内部组件,例如软件故障注入无法寻址的组合电路和寄存器,可用于评估低级别的错误检测和屏蔽机制。软件故障注入可直接在软件状态级别(例如存储器、寄存器)直接产生变化,更适合于测试更高级别的机制,但需要注意直接在目标系统上运行所导致的更高额的干扰开销。
二、实际应用
实际应用中,故障注入方法可根据应用场景的不同分为基于仿真的故障注入与基于原型的故障注入两大类。
基于原型的故障注入:指向软件或硬件注入故障,仅适用于研究模拟故障。对诸如汽车、航空、航天等领域庞大而又复杂的应用场景而言,其硬件与软件的生产成本高昂,因此现下成本更低、效率更高的基于仿真的故障注入方法更受青睐。
基于仿真的故障注入:指通过建立目标系统的“数字孪生”模型,在模型中引入故障来得到故障注入的结果。这种方法无需特定的硬件设备,也不会对目标系统造成损伤,有助于评估容错机制的有效性及系统可靠性,但大型复杂设备的仿真模型往往开发量庞大,众多企业苦其久矣。
SkyEye,中文全称天目全数字实时仿真软件,能够有效解决仿真故障注入的弊端。作为基于可视化建模的硬件行为级仿真平台,SkyEye可轻松实现复杂模型的搭建,快速落实“数字孪生”模型。
基于SkyEye所搭建的全数字实时仿真模型,用户可进行以下几种模式的故障注入:
1.物理层故障模式
物理层故障模式主要包括断路控制、短路控制、信号串扰、噪声信号、串行以及并行阻抗控制等,用于模拟通信总线上常见的线路故障。
SkyEye中,总线设备被设计为独立的模块,并在虚拟目标硬件脚本中创建总线设备并与内存总线连接。断路故障模式通过外部数据激励软件设计总线故障处理模块,可以在总线设备模块中实现与数据激励软件的通信接口,并使用总线故障处理模块向总线设备发送断路命令。设备接收到该命令后,即不会再接收处理任何来自内存总线发送的地址读写请求。
SkyEye的断路故障模拟设计如下所示。
首先通过Python脚本提供的API接口调用上述的内存监视接口,实现内存监视功能,访问该内存时便会执行注册的回调接口来完成相关功能。
可由此实现故障模拟:通过该API接口注册故障模拟回调接口,当设置该内存地址为断开故障时,每当处理器访问至该地址便会在该回调接口中输出故障信息。用户还可调用SkyEye运行控制接口来暂停运行工程。
2.电气层故障模式
电气层故障模式包括输出幅度调节、占空比调节、信号延迟调节、上升下降沿调节及斜率调节、毛刺模拟等。
真实硬件中电气层故障注入是通过总线信号发生器实现,由高速DAC芯片、SRAM、运算放大器组成。电气层中的输出电压幅度调节可通过DAC和运算放大器实现,输出信号占空比可以通过FPGA控制DAC来实现,输出信号的延迟可以通过采样数据进行缓存来实现。
在SkyEye虚拟仿真环境下,用户可通过配置总线寄存器来修改电平值、边沿时间、占空比等,实现输出电压幅度的调节。
电气层故障注入,包括寄存器故障注入和内存故障注入。
▲寄存器故障注入
▲内存故障注入
3.协议层故障模式
协议层故障模式包括命令字、数据字、状态字奇偶校验、编码错误以及数据替换等。
协议层故障注入是基于不同的总线协议实现的。通过解析总线传输的数据来判断传输信息的类型以及不同类型所需要做的数据处理,可实现需要进行故障注入的通信协议数据分析。与物理层故障模式相似,也可使用SkyEye提供的数据激励软件注入总线的通信协议数据来实现故障注入。
参考文献
[1]https://course.ece.cmu.edu/~ece846/docs/faultInjectionSurvey.pdf
[2] 车建华, 何钦铭, 陈建海, 等. 基于软件模拟的虚拟机系统故障插入工具[J].浙江大学学报 (工学版), 2011, 4: 004.
[3]徐仁佐. 软件可靠性工程[M]. 北京:清华大学出版社,2007.
[4]张玲玲,王林章.基于故障剖面的安全关键系统可靠性测试与评估[J].计算机与数字工程,2014,42(12):2304-2310,2320.
[5]麻彦东.面向虚拟化系统的故障注入平台的研究与设计[D].哈尔滨:哈尔滨工业大学,2015.