文獻標識碼: 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 <the ethernet_switch ′default_eth_switch0′>
對數據包接收控制寄存器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 <the ethernet_hub ′myhub′>
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 <the ethernet_hub ′myhub′>
在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 <the ethernet_hub ′myhub′>
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 <the ethernet_hub 'myhub'>
使用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.