2015年8月5日 西米奇

故障注射重新讨论 - 视频

由Jakob Engblom.

jakob-engblom-intro-picture

故障注入是一种非常强大的能力西米奇和一般的模拟。西米奇5介绍一个新的框架,使其更容易创建支持记录,重放,重复性和反向调试的故障注射器,并使用户更容易发现并将故障注射器应用于其系统。此博客文章详细介绍了这一点,以及您可以使用故障注入和模拟可以做的事情。查看显示的随附的视频西米奇5故障注入动作。

新的错误注入框架的目的是标准化错误注入器的编写方式、如何将它们附加到系统,以及如何启用和禁用实际的错误。以前,错误通常是通过命令行脚本和Python的混合实现的,以特定于每种情况的特殊方式实现。每个错误注入器都有自己独特的用户界面,不可能列出特定Simics安装中可用的所有错误注入器。在新的框架中,故障注入器应该更加规则,并且统一地支持一些特性,比如记录注入的故障以便精确回放。

故障注入是一个宽泛的术语,但通常它意味着以超出预期操作的方式更改硬件设置或存储或读取值。我们期望错误会导致软件检测到问题并以某种方式处理它——或者软件做一些完全不受控制的事情,因为它没有为问题中的错误做好准备。一个令人遗憾的事实是,错误处理代码通常是系统中测试最少的部分,但当事情真的变坏时,它也是系统中必须介入的部分。因此,我们所能做的任何改进错误处理代码的测试都有利于产品质量和最终用户。

下面是一些典型的故障和故障处理示例,以及如何模拟它们。

  • 宇宙射线在内存中诱发位翻转,内存控制器ECC(纠错码)功能检测到错误已经发生。如果我们假设错误是不可纠正的,硬件中的ECC函数将在ECC寄存器中设置一些标志和值,并在处理器上触发一个中断。然后处理器将跳转到ECC错误处理程序,该处理程序将读取硬件寄存器以确定故障的性质,然后采取一些适当的操作——重新启动系统,记录错误,从一些辅助内存中恢复,等等。在Simics中模拟这个问题是将正确的错误报告值放入ECC寄存器,并触发中断。在Simics抽象级别上,没有必要对翻转的实际位和ECC校验和进行建模。
  • 由于软件驱动程序不好和网络意外输入,机架中的一个板崩溃。最终,其余的系统通知,电路板已经离线了,因为它停止广播其心跳消息。根据恢复设计,另一个板接管了第一板的作用,系统恢复。在SIMICS中测试这一点可以简单地停止故障板上的所有处理器或从背板网络断开连接。
  • IOT传感器节点唤醒拍摄样本,并尝试传输它,但附近的微波炉是活动的,并且噪声阻止所有尝试传输。软件通知,即现在似乎无望的情况,在尝试重新译构之前等待一分钟。模拟这种情况在SIMICS中很简单,只需从节点中停止所有传出数据包,配置无线网络适配器模型以告诉软件无线电环境充满噪音。看到“物联网自动测试-使用模拟“有关SIMICS的IOT模拟更多。
  • 由电子控制系统控制的汽车发动机会发生物理故障,性能迅速下降。控制软件检测到的变化行为,试图控制律补偿,但这未能纠正的情况时,错误处理代码调用关闭发动机一个假定的失败安全模式,并立即通知车的主人要求援助,让车车库。在模拟中,通过向发动机控制系统输入一系列与故障对应的传感器读数,可以很容易地模拟出这种情况。看到“仿真的三位一体获取更多关于Simics与物理模拟器集成的信息。
  • 恶意的畸形TCP/IP报文被发送到嵌入式Linux系统,导致网络堆栈崩溃。对于堆栈中那些特定类型的坏数据包没有适当的处理方法,现在已经证明了这一点。在Simics中对此进行测试就像从一个模糊器或其他错误数据来源发送数据包流一样简单。记录发送的数据包的顺序对于重现错误是至关重要的。

在所有这些情况下,能够精确地重播和特定的故障场景是非常重要的,这样就可以调查故障处理代码的任何失败。能够重播错误还可以将错误注入作为自动回归测试,以确保故障处理不会因为缺乏测试而随着时间的推移而变坏。

我们如何在Simics 5中改进故障注入?基本上,通过提供一个易于使用的框架来标准化应该如何编写错误注入器,以及它们对用户的用户界面。作为框架的一部分,记录和回放错误注入操作非常容易。其结果是这样的标准流程:

  • 故障注射器是适当的模块,而不仅仅是脚本。
  • 因此,用户可以采用可用故障注射器的库存,并决定使用哪一个。
  • 一旦用户决定使用哪一个,它就被加载到Simics中。
  • 然后创建错误注入器的一个新实例。
  • 然后将新实例附加到系统的某个部分。这是一个关键的步骤,因为附加错误注入器可能涉及创建新的对象、重新连接系统的设置以添加拦截点,以及将错误注入器放入要破坏的数据路径中。有时非常简单,有时非常复杂,这取决于故障的性质。
  • 一旦注入器被连接,可以启用和禁用单个故障。正确的启用和禁用逻辑取决于故障注入器,但其工作原理应该是相同的。

我们发布的演示视频Youtube演示一个简单的内存错误注入器是如何工作的。视频中的注入器是基于在内存写操作中植入断点,并改变所写的值,以便以后的读操作返回坏值。模拟设置是这样的:

fi-1

有一个测试程序运行,它将值写入内存并检查回读取相同的值:

fi-2

演示的故障很容易在模拟器中实现,但需要在硬件上进行大量工作。所建模的故障本质上是内存芯片坏了,并开始不能正确地存储写入它们的值。这就是为什么有必要拦截写入并更改写入的值——除非被拦截,否则测试程序对测试模式的写入将删除错误的任何痕迹。

视频中显示的录制和重放显示了模拟器侧(设置新故障)和目标侧的操作(按键以使测试程序重新运行)。这种联合录音对于确保可以在以后再现特定执行以调查发生的事情。

在视频中,所有的动作都是手动和交互式地执行,以显示事情是如何完成的。在这个功能的实际使用中,错误的整个设置和应用程序都是脚本化和自动化的。任何可以通过Simics命令行交互完成的操作都可以从脚本完成并自动完成

总之,故障注入是基于模拟器的测试实验室的一个非常强大的功能,通过Simics 5,我们可以更容易地创建和重用故障注入器,并支持围绕故障注入活动的结果的协作工作流。

更多阅读

如果您想阅读更多关于故障注入和Simics的内容,我们有一些较早的博客文章。

以前的你的实验室在云端吗
下一个仿佛就在昨天…