文献标识码:A
文章编号: 0258-7998(2015)01-0021-04
0 引言
随着嵌入式技术的不断发展,嵌入式系统越来越多地应用在工业控制、航空航天等对系统的可靠性和容错性要求极高的领域中。故障注入技术是评价嵌入式系统的可靠性与容错性的一项重要手段。该技术是一种可靠性验证技术,通过受控实验向系统中刻意引入故障,并观察系统中存在故障时的行为。故障注入技术一般分为基于物理硬件的故障注入、基于软件的故障注入以及基于仿真的故障注入[1]。
基于物理硬件的故障注入通过改变物理环境参数(重离子辐射、电磁干扰、激光照射、电源干扰等)干扰硬件或者通过改变集成电路芯片管脚输入值以达到故障注入的效果[2]。基于软件的故障注入在软件级生成故障,譬如通过应用软件生成故障、通过底层软件(如操作系统等)生成故障。基于仿真的故障注入技术是在模拟测试的计算机原型上,通过在仿真过程中改变逻辑值达到故障注入的效果[2]。
基于仿真的故障注入技术有很多优点。第一,该类型的故障注入可以在不同的抽象层次上进行仿真,支持不同的故障模式。第二,基于仿真的故障注入具有非入侵式特点,从目标系统的角度来看,它是即刻且透明地发生的。第三,基于仿真的故障注入能够实现目标系统和故障注入机制的可观测性以及可控制性。
基于仿真的故障注入技术也有它的局限性。首先,建立一个目标系统的模型通常会消耗大量的时间和精力,并且模拟的结果完全依赖于所建模型的质量。其次,实际的设计缺陷可能不会出现在系统的仿真模型中。
本文论述的串口和网络相关的故障注入基于风河系统公司提供的Model Library Intel Core i7 with X58 and ICH10 4.6(下文简称x86-X58-ICH10)硬件目标设备模型。该硬件目标设备模型可以仿真一个具有Intel Core i7处理器、X58北桥高速芯片组以及ICH10南桥的硬件系统。开发者不必花费大量的时间和精力创建硬件模型。该模型在发布之前经过了缜密的内部测试,即使在实际应用中出现了bug,风河系统公司也能够及时修复,因此该模型的质量有保障。由此可见,使用x86-X58-ICH10硬件模型可以避免基于仿真的故障注入技术带来的局限性。
1 串口相关的故障注入
x86-X58-ICH10硬件模型使用的是NS16550 UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)。在Simics上查看NS16550的寄存器值,并参考NS16550数据手册,整理NS16550的寄存器详细信息如表1所示[3]。
开发者可以在Simics全系统仿真环境下,模拟串口相关的寄存器因受到外界物理环境因素干预,寄存器值发生改变,从而引发寄存器级的故障。以LCR线路控制寄存器为例,说明此类故障注入的具体操作方法。LCR线路控制寄存器格式如表2所示。
在Simics命令行窗口中查看com[0]对应的LCR的值为3,即字符长度为8:
running> viper.mb.sb.com[0]->regs_lcr
3
修改LCR寄存器的值为1,即将原字符长度由8设置为6,停止位设置为0。在VxWorks串口控制台上执行help指令,由于发送和接收字符长度不匹配,所以串口接收字符显示为乱码,如图1所示。
running> viper.mb.sb.com[0]->regs_lcr = 1
恢复LCR寄存器的值为3,串口控制台可以正常接收help命令,如图2所示。
running> viper.mb.sb.com[0]->regs_lcr = 3
2 网络相关的故障注入
x86-X58-ICH10硬件模型可以支持多种以太网控制器[4],本文论述的是基于ICH10南桥内嵌的82567LF-2[5]以太网控制器的故障注入。
2.1 VxWorks操作系统访问真实物理网络的故障注入
Simics支持多种方式与开发主机进行真实物理网路互联,譬如端口转发、网络桥接、IP路由和主机直连等[6]。此处采用端口转发的方式将x86-X58-ICH10硬件模型与真实物理网络连接,并使用Simics命令行接口提供的相关命令进行故障注入。
首先,启动viper-vxworks-6.9.simics脚本,加载默认IP地址为172.90.0.21的VxWorks文件,并在Simics命令行窗口中执行如下命令:
simics> connect-real-network 172.90.0.21
No ethernet link found, created default_eth_switch0.
Connected viper.mb.sb.eth_slot to default_eth_switch0
Created instantiated ′std-service-node′ component ′default_
service_node0′
……
Real DNS enabled at fe80::2220:20ff:fe20:2000/64 on link
default_eth_switch0.link.
上述命令创建了具有类似交换机功能的以太网连接器default_eth_switch0,并将default_eth_switch0与硬件模型上的以太网接口相连。然后创建了标准服务节点组件default_service_node0,将之与default_eth_switch0相连,并将default_eth_switch0连接器的网关设置为172.90.0.1/24。接着完成了主机到运行在硬件平台上VxWorks之间的FTP、SSH、Telnet、HTTP的端口映射。最后在default_eth_
switch0.link上启动了DNS功能。
执行如下命令,在VxWorks上添加到开发主机上的网关:
routec“add –net –netmask 255.255.255.0 172.21.28.208 172.90.0.1”
启动Windows 7开发主机上的telnet服务。主机端开启telnet服务后,在VxWorks执行telnet“172.21.28.208”命令,登录开发主机,如图3所示。
在Simics命令行窗口中设置Wireshark软件的安装路径,并启动Wireshark软件,监控default_eth_switch0的网络状态。
running>prefs->wireshark_path="C:\\Program Files\\Wireshark"
running>wireshark link = default_eth_switch0
Starting capture on
对数据包接收控制寄存器RCTL进行故障注入。RCTL是一个32位寄存器,负责控制MAC接收端的相关功能。在Simics命令行窗口中执行如下命令,查看RCTL寄存器的值:
running>viper.mb.sb.lan->csr_rctl
67141634
将RCTL寄存器的值转化成16进制为04008002H,查询RCTL寄存器格式可知,RCTL的接收允许位(RCTL.EN)被设置为1,即允许接收网络数据包。
在VxWorks上执行“telnet 172.21.28.110”命令,telnet到真实网络中IP地址为172.21.28.110的Windows 7主机,同时启动Wireshark软件进行抓包。telnet成功后,执行chkdsk命令。在chkdsk命令的执行过程中,执行如下命令进行故障注入,即重新赋值RCTL为04008000H,将接收允许位置0,不允许接收网络数据包:
running>viper.mb.sb.lan->csr_rctl = 0x4008000
如图4所示,在25 s时对RCTL寄存器进行了故障注入。在25 s之前,网络数据包能够正常收发。故障注入完成后,VxWorks端不能正常接收网络数据包,Windows 7主机端将间隔3 s、6 s、12 s、24 s后尝试重新向VxWorks端发送数据包。具体地,在26 s左右时,Windows 7主机端第一次尝试向VxWorks端重新发送网络数据包。然后在29 s、35 s、47 s、71 s左右时,分别进行了第2次、第3次、第4次和第5次重新向VxWorks端发送网络数据包。而在26 s~71 s之间的时间段内,收发成功的网络数据包数量为0。由于在第4次到第5次重新发送之间,恢复了RCTL寄存器的初始值,所以第5次重新发送网络数据包成功。
同样,可以对网络数据包发送控制寄存器TCTL进行故障注入。其故障注入过程和结果与RCTL故障注入非常类似,在此不再赘述。
2.2 VxWorks操作系统访问虚拟网络的故障注入
启动viper- multi-vxworks-6.9.simics脚本,该脚本将加载两个默认IP地址为172.90.0.21的VxWorks映像文件VxWorks_A和VxWorks_B。
首先,将VxWorks_B的IP地址设置为172.90.0.22,在VxWorks_B上执行如下命令:
ifconfig“gei0 172.90.0.22”
在Simics命令行窗口中执行如下命令,加载网络连接器模块:
simics> load-module eth-links
在Simics命令行窗口中使用命令创建集线器组件,并命名为myhub;然后将VxWorks_A和VxWorks_B的网络接口与myhub连接,并查看myhub的运行状态:
simics> new-ethernet-hub myhub
Created instantiated ′ethernet_hub′component ′myhub′
simics> connect VxWorks_A.mb.sb.eth_slot myhub.device0
simics> connect VxWorks_B.mb.sb.eth_slot myhub.device1
simics>myhub.link.status
在Simics命令行窗口中执行如下命令,使用pcap-dump工具在myhub上抓取网络数据包,并保存为.pcap格式的文件:
simics>myhub.pcap-dump my_package.pcap
Starting capture on
simics> c
接着在VxWorks_B上执行如下命令,连续ping 20次VxWorks_A:
ping“-c 20 172.90.0.21”
然后停止使用pcap-dump抓包,执行如下命令。抓取到的网络数据包my_package.pcap文件保存在用户设置的simics-workspace目录下:
running>pcap-dump-stop
Stopping capture on
在Simics命令行窗口中执行如下命令,加载网络流量注入组件,新建网络数据包注入组件myinjector。使用Wireshark工具监控myhub上的网络数据包,并向myhub注入捕捉到的my_package.pcap网络数据包:
simics> load-module eth_injector_comp
simics> new-eth-injector-comp name = myinjector
Created instantiated ′eth_injector_comp′ component ′myinjector′
simics>myhub.connect component = myinjector
simics> c
running>prefs->wireshark_path="C:\\Program Files\\Wireshark"
running>myhub.wireshark
Starting capture on
running>myinjector.injector.start file = "my_package.pcap"
然后,在VxWorks_B上执行如下命令,telnet到VxWorks_A上,输入用户名target和密码password。telnet登录成功后,执行help命令。help命令执行完毕后,继续执行exit命令,退出telnet登录。同时,在Simics命令行窗口中执行如下命令,停止向myhub注入my_package.pcap网络数据包,并将Wireshark抓到的网络数据包保存为inject_package.pcapng文件:
running>pcap-dump-stop
Stopping capture on
使用Wireshark统计工具分析inject_package.pcapng文件的结果如图5所示。图中的实线代表myhub上流经的总的数据包。由于my_package.pcap截获的是执行ping命令时的数据包,ping属于ICMP协议,阴影部分表示外部注入的my_package.pcap数据包。脉冲状的竖线表示VxWorks_B执行telnet时流经myhub上的数据包,这些数据包属于TCP协议,非ICMP协议的数据包。
由此可见,自定义的数据包可以成功注入到基于Simics的虚拟网络中,用来模拟网络过载等网络故障。这种方法有助于开发者分析网络故障、排除故障,提高网络系统的稳定性和健壮性。
3 总结
本文主要论述了在Simics全系统仿真环境下,对VxWorks嵌入式操作系统的串口故障注入、VxWorks访问真实网络的故障注入以及VxWorks访问真实网络的故障注入的原理和具体实现方法。这种基于仿真的故障注入技术对于研究嵌入式系统的可靠性和容错性具有一定的参考意义。
参考文献
[1] 吴正辉,金丰,银恺.某型起落架转弯控制器余度设计及机内测试[J].机械设计与研究,2013,29(3):116.
[2] 李林虎.基于编译中间代码的关键变量容错技术[D].长沙:国防科学技术大学,2010.
[3] National Semiconductor.NS16550N datasheet[Z].2003:1-5.
[4] Wind River.Wind river Simics x86-X58-ICH10 target guide 4.6[Z].2014:7-8.
[5] Intel.82567 GbE physical layer transceiver(PHY)[Z].2009:6-11.
[6] Wind River.Wind river Simics ethernet networking user′s guide 4.6[Z].2012:6-11.