嵌入式系统故障注入技术研究
2022-04-12刘宪忠赵昶宇
刘宪忠,赵昶宇
(1.海军装备部驻天津地区第二军事代表室,天津 300308;2.天津津航计算技术研究所,天津 300308)
由于嵌入式系统需要软件和硬件协同工作,因此,嵌入式系统的测试难度比传统的纯软件测试要高得多。对于嵌入式系统来说,测试难度最大同时也是最容易出问题的部位在于对异常和故障的测试。这其中不仅包括软件异常,还包括硬件故障,这些异常和故障通常在测试时很难被测试覆盖到,这就会给嵌入式系统测试带来不确定的隐患因素。
为了消除嵌入式系统测试中不稳定的隐患因素,进一步提高测试的覆盖性,尤其是提高对软件异常和硬件故障处理的测试覆盖性,可以采用故障注入的方法来模拟真实的软件异常和硬件故障情况。在嵌入式系统中通过硬件或者软件的手段,对被测试对象“注入”提前设计好的异常和故障测试用例,通过运行这些测试用例来测试和评估被测试软件代码的容错性和异常处理能力。
本文对故障注入的原理进行了阐述,并列举了几种常用的基于故障注入测试方法。采用了故障注入的方法对嵌入式系统进行测试,能够极大地提高测试效率和测试覆盖率,从而有效提高系统可靠性。
1 故障注入原理
故障注入是指向被测试系统注入某些特定的故障样本或用例,使得被测系统产生预期的故障现象的过程,它是验证被测系统测试性水平的关键技术。
故障注入技术主要用于进行系统可靠性验证,它根据建立的故障注入模型,通常采用人为的向待测系统输入故障信息,加速待测系统故障或失效,并通过观察和分析待测系统对输入故障信息的反馈结果,对待测系统进行定量和定性的验证和评价[1]。
故障注入技术的验证过程通常需要依赖整个系统的原理、功能、特性,FMEA和FMECA的结果,领域专家的相关经验以及以往故障率数据等信息。在进行故障注入时,首先需要执行故障注入者选择故障模型,然后基于选择的故障模型对被测试系统执行故障注入活动,通过运行工作负载的目标系统,获取系统的运行状态,并对被测系统的反馈结果进行验证评估。故障注入的原理如图1所示。
图1 故障注入原理
1.1 输入和目标系统
嵌入式系统故障注入的输入包括整个系统的原理、功能、特性,FMEA和FMECA的结果,领域专家的相关经验以及以往故障率数据等信息。执行故障注入的测试人员不仅要提供故障注入模型和注入结果分析的度量,还要采取措施保证每次故障注入过程的完整。运行工作负载的目标系统可以是系统模拟模型,也可以是真实系统原型。
1.2 选择故障模型
选择故障模型的主要功能是确定产生故障的属性,并将选择的故障模型作为“执行故障注入”环节的输入。如果被选中的故障模型能够最大限度覆盖真实系统运行时的故障,则被测系统的反馈结果就会越精确。
故障模型的建立通常与目标系统类型、故障注入方式以及验证评估的结果相关。其中,硬件故障模型的属性分为故障类型、故障发生时间、故障持续时间以及故障位置等,故障发生时间可以根据给定的分布或者按照工作负载的运行状态确定,故障持续时间包括瞬时、间歇和永久3种,故障位置与目标系统有关。软件故障模型的建立主要依赖于专家的经验和测试结果,软件故障注入用于测试被测系统的容错机制。
由于测试是无止境的,因此必须采取策略从庞大的故障测试用例中选取一个测试子集完成故障注入,一般采用多级抽样、分层抽样或者典型抽样的方法来进行故障测试用例的筛选。
1.3 执行故障注入
在当前步骤中需要将上一步骤中选择的故障模型转变为可注入的故障形式,并选择适当的方法将故障集注入目标系统中。故障注入方法的选择与目标系统的类型密切相关,若目标系统是系统模拟模型,可针对目标系统模拟层次的不同选用不同级别的注入方法,这种模拟注入的方式能够测试到真实系统原型无法覆盖的内部功能,实现对被测系统的精确注入监控。若目标系统是真实系统原型,可采取基于软硬件的物理故障注入方法,用来评估系统原型的可信性和验证被测系统的容错性。
1.4 获取系统状态和验证评估结果
获取系统状态和验证评估结果是一次完整的故障注入活动中向测试人员提供被测系统反馈结果的最后步骤。在该步骤中需要测试人员判断是否终止验证评估,其判断依据包括是否满足置信区间、测试得到的概率分布是否稳定以及测试参数是否超过设定阈值等。若终止验证评估,则需验证评估分析所有的测试结果,反馈被测系统测试结果。通常采用概率统计的方法进行测试结果的验证评估和分析。
2 故障注入技术分类
按照故障注入方法的不同将故障注入技术分为基于硬件的故障注入、基于模拟的故障注入和基于软件的故障注入。故障注入技术分类如图2所示。
图2 故障注入技术分类图
基于硬件的故障注入是指在被测系统的硬件中加入额外的硬件电路。该方法适用于对某些原型系统的可信性进行研究。基于硬件故障注入的位置将该方法分为接触式和非接触式2种。接触式故障注入方法可采取直接与被测系统电路的引脚相连接的方式,或是在被测系统芯片内部植入对应的故障模块。该方法的优点在于无需对被测系统进行修改和建模验证,即可实现对被测系统的永久性故障注入。缺点是容易造成系统硬件损坏,增加了硬件设计的结构复杂性和芯片设计难度。非接触式故障注入方法中故障注入器和被测系统之间没有物理连接,因此,它无法准确把握故障注入的时间和位置。
基于模拟的故障注入是指在被测系统开发设计阶段通过建立解析和模拟模型来获取被测系统中大多数可信性度量信息,通常在功能级别测试系统的各种性能是否满足要求。模拟模型可实现对被测系统的细节设计的模拟,这样便于对注入故障进行精确监控。基于功能级别的模拟故障注入可将故障注入到被测系统的CPU、通信部件、存储部件或软件模块上,因此,需要对被注入的部件或模块分别建立不同的故障模型。该方法一般应用于系统早期设计阶段,能够较好地模拟内存Bit位翻转和硬件寄存器故障,缺点是建模难度和工作量较大,且容易产生“组合爆炸”问题。
基于软件的故障注入是指在无需额外硬件设备辅助的情况下,通过设置程序指令或修改被测系统的内存来模拟被测系统CPU、内存、寄存器或网络硬件故障,通过在软件编译前调整软件结构或是运行时改变程序变量或状态来模拟系统软件故障[2]。该方法可以在被测系统的操作系统中设计故障注入层,或者直接将故障注入到应用程序中,它既能模拟部分硬件故障,也能设计软件方面的故障。该方法的最大优点是故障注入成本低,易于实现,并且不会破坏被测系统的硬件环境。但是也存在着缺点,比如只能对软件能够访问的位置或部件进行故障注入,有时会改变被测系统原始软件结构,干扰被测系统软件运行,还有就是时间精度和分辨率较小,导致无法准确捕捉到异常和错误情况等。根据故障注入的时机将将基于软件的故障注入方法分为编译时故障注入和运行时故障注入2种。编译时故障注入是指在被测系统的程序目标码被加载执行前,将软件故障注入到程序源代码中以模拟被测系统软硬件故障。它需修改被测系统的软件源代码,当被测系统的软件运行后,则不会受到外界干扰,缺点是无法实现故障的实时模拟。运行时故障是指当被测系统中的软件运行后,采用特定方式将故障注入被测系统中。它无需修改被测系统的软件源代码,可以实时模拟软硬件故障,缺点是无法模拟永久性故障。
本文重点阐述基于软件的故障注入方法及其在工程中的实际应用。
3 嵌入式系统故障注入方法
嵌入式系统中常用的基于软件的故障注入方法有修改软件源程序法、基于开发环境故障注入、设备驱动故障注入和其他故障注入方法。
3.1 修改软件源程序实现故障注入
通过修改软件源程序进行故障注入是目前最常用的注入故障方法。这种方法的最大优点是无需借助外部资源和测试工具,同时也无需在软件源程序中设置断点,只需修改源程序中进入并执行异常处理的判断条件,即可实现对故障的灵活注入[3]。但是该方法也存在以下不足。
对嵌入式系统进行故障注入时,需要软件测试人员和软件设计人员同时在场,软件测试人员需在软件设计人员的指导下完成源程序修改和故障注入工作。该方法在处理和时序相关的故障注入时,需要对源程序进行较大的改动,极有可能在改动源程序时产生新的系统故障。基于不同的故障注入模式,需要修改并生成多个版本的软件源程序,增加了软件版本管理的工作量和复杂程度。
3.2 基于开发环境的故障注入方法
在嵌入式系统软件的编码和调试阶段,通常基于软件开发环境对系统进行故障注入。在开发环境中通过设置调试断点的方式,或者在开发环境和目标机之间建立网络连接的方式来修改嵌入式系统软件内存或者寄存器状态。该方法最大的优点是无需修改嵌入式软件源程序,在进行故障注入时可以极大地减少软件设计人员的占用率。该方法也存在以下的局限性和不足。
该方法在利用通用的软件开发环境对具有同步功能的嵌入式余度系统进行故障注入时,具有较大的局限性。通过开发环境进行系统故障注入,通常不能保证故障注入的连续执行,而且无法处理多线程或者中断程序的故障注入。由于该方法不能对目标机进行连续故障注入测试,因此,采用该方法得到的故障注入结果不能够真实反映嵌入式系统在实际工作时对故障的反馈状态。
3.3 基于驱动的故障注入方法
当嵌入式系统软件包含底层驱动模块软件时,通常可通过底层驱动模块软件向嵌入式系统应用层软件注入故障。该方法需要在底层驱动模块软件中预留故障注入测试接口,通过故障注入工具向底层驱动模块软件中注入故障。该方法最大的优点是无需改动嵌入式系统应用层软件源程序,也不会对被测试嵌入式系统应用层软件的工作负载产生影响,该方法生成的故障更加接近真实硬件产生的故障。该方法最大的不足是由于需要在底层驱动模块软件中预留故障注入测试接口,在对系统进行故障注入前需要投入较大工作量[4]。
3.4 其他故障注入方法
其他的故障注入方法包括超时触发法、异常或陷阱触发法和代码插入触发法等。
超时触发法。该方法采用硬件或者软件定时器触发故障注入。该定时器预先设定好定时时间,当定时时间到后产生中断信号,在中断处理程序中激活故障注入。该方法无需修改被测系统的软件源代码或者工作负载。由于定时时间可以任意设定,因此,该方法可能会对被测试的嵌入式系统产生不可预知的故障影响和行为,尤其适用于模拟瞬时故障或者间隔式硬件故障。
异常或陷阱触发法。该方法采用硬件异常或者软件陷阱来触发故障注入。与超时触发方法不同,它不用设置定时器就能利用硬件异常或软件陷阱在任意时间或条件下实施故障注入。当发生硬件异常或是执行软件陷阱时,调用中断服务程序激活故障注入。
代码插入触发法。该方法是在被测系统运行时,在不改变被测系统原始软件源代码的情况下,在原始软件源代码的某条特定代码之前动态的插入新的指令并执行故障注入。这些动态插入的新指令作为被测系统软件源代码的一部分。通常情况下,被测系统是在特定的工作模式下采用代码插入触发法执行故障注入,在被测系统正常的工作模式下一般不采用这种方法[5]。
4 结束语
本文阐述的基于软件的故障注入方法具有对硬件资源依赖较少,简单易用,并且具有良好的可扩展性,可在系统设计的任何阶段采用该方法来测试系统中的未知故障,并提高系统的健壮性和可靠性。
随着计算机技术在嵌入式系统中的不断发展和广泛应用,尤其是在航空和航天等安全关键技术领域的深入推广,人们对嵌入式系统的可靠性提出了越来越高的要求。目前国内嵌入式系统的故障注入技术仍处于不断探索和发展过程中,尤其在一些军用领域还没有通用的故障注入设备,无法高效完成装备的测试性验证试验。所以完善和优化故障注入方法,研究通用的故障注入设备,将成为所有科研人员的努力方向。