文獻標識碼: A
文章編號: 0258-7998(2015)01-0021-04
0 引言
隨著嵌入式技術的不斷發(fā)展,嵌入式系統(tǒng)越來越多地應用在工業(yè)控制、航空航天等對系統(tǒng)的可靠性和容錯性要求極高的領域中。故障注入技術是評價嵌入式系統(tǒng)的可靠性與容錯性的一項重要手段。該技術是一種可靠性驗證技術,通過受控實驗向系統(tǒng)中刻意引入故障,并觀察系統(tǒng)中存在故障時的行為。故障注入技術一般分為基于物理硬件的故障注入、基于軟件的故障注入以及基于仿真的故障注入[1]。
基于物理硬件的故障注入通過改變物理環(huán)境參數(shù)(重離子輻射、電磁干擾、激光照射、電源干擾等)干擾硬件或者通過改變集成電路芯片管腳輸入值以達到故障注入的效果[2]?;谲浖墓收献⑷朐谲浖壣晒收?,譬如通過應用軟件生成故障、通過底層軟件(如操作系統(tǒng)等)生成故障?;诜抡娴墓收献⑷爰夹g是在模擬測試的計算機原型上,通過在仿真過程中改變邏輯值達到故障注入的效果[2]。
基于仿真的故障注入技術有很多優(yōu)點。第一,該類型的故障注入可以在不同的抽象層次上進行仿真,支持不同的故障模式。第二,基于仿真的故障注入具有非入侵式特點,從目標系統(tǒng)的角度來看,它是即刻且透明地發(fā)生的。第三,基于仿真的故障注入能夠實現(xiàn)目標系統(tǒng)和故障注入機制的可觀測性以及可控制性。
基于仿真的故障注入技術也有它的局限性。首先,建立一個目標系統(tǒng)的模型通常會消耗大量的時間和精力,并且模擬的結果完全依賴于所建模型的質量。其次,實際的設計缺陷可能不會出現(xiàn)在系統(tǒng)的仿真模型中。
本文論述的串口和網(wǎng)絡相關的故障注入基于風河系統(tǒng)公司提供的Model Library Intel Core i7 with X58 and ICH10 4.6(下文簡稱x86-X58-ICH10)硬件目標設備模型。該硬件目標設備模型可以仿真一個具有Intel Core i7處理器、X58北橋高速芯片組以及ICH10南橋的硬件系統(tǒng)。開發(fā)者不必花費大量的時間和精力創(chuàng)建硬件模型。該模型在發(fā)布之前經(jīng)過了縝密的內部測試,即使在實際應用中出現(xiàn)了bug,風河系統(tǒng)公司也能夠及時修復,因此該模型的質量有保障。由此可見,使用x86-X58-ICH10硬件模型可以避免基于仿真的故障注入技術帶來的局限性。
1 串口相關的故障注入
x86-X58-ICH10硬件模型使用的是NS16550 UART(Universal Asynchronous Receiver/Transmitter,通用異步收發(fā)器)。在Simics上查看NS16550的寄存器值,并參考NS16550數(shù)據(jù)手冊,整理NS16550的寄存器詳細信息如表1所示[3]。
開發(fā)者可以在Simics全系統(tǒng)仿真環(huán)境下,模擬串口相關的寄存器因受到外界物理環(huán)境因素干預,寄存器值發(fā)生改變,從而引發(fā)寄存器級的故障。以LCR線路控制寄存器為例,說明此類故障注入的具體操作方法。LCR線路控制寄存器格式如表2所示。
在Simics命令行窗口中查看com[0]對應的LCR的值為3,即字符長度為8:
running> viper.mb.sb.com[0]->regs_lcr
3
修改LCR寄存器的值為1,即將原字符長度由8設置為6,停止位設置為0。在VxWorks串口控制臺上執(zhí)行help指令,由于發(fā)送和接收字符長度不匹配,所以串口接收字符顯示為亂碼,如圖1所示。
running> viper.mb.sb.com[0]->regs_lcr = 1
恢復LCR寄存器的值為3,串口控制臺可以正常接收help命令,如圖2所示。
running> viper.mb.sb.com[0]->regs_lcr = 3
2 網(wǎng)絡相關的故障注入
x86-X58-ICH10硬件模型可以支持多種以太網(wǎng)控制器[4],本文論述的是基于ICH10南橋內嵌的82567LF-2[5]以太網(wǎng)控制器的故障注入。
2.1 VxWorks操作系統(tǒng)訪問真實物理網(wǎng)絡的故障注入
Simics支持多種方式與開發(fā)主機進行真實物理網(wǎng)路互聯(lián),譬如端口轉發(fā)、網(wǎng)絡橋接、IP路由和主機直連等[6]。此處采用端口轉發(fā)的方式將x86-X58-ICH10硬件模型與真實物理網(wǎng)絡連接,并使用Simics命令行接口提供的相關命令進行故障注入。
首先,啟動viper-vxworks-6.9.simics腳本,加載默認IP地址為172.90.0.21的VxWorks文件,并在Simics命令行窗口中執(zhí)行如下命令:
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.
上述命令創(chuàng)建了具有類似交換機功能的以太網(wǎng)連接器default_eth_switch0,并將default_eth_switch0與硬件模型上的以太網(wǎng)接口相連。然后創(chuàng)建了標準服務節(jié)點組件default_service_node0,將之與default_eth_switch0相連,并將default_eth_switch0連接器的網(wǎng)關設置為172.90.0.1/24。接著完成了主機到運行在硬件平臺上VxWorks之間的FTP、SSH、Telnet、HTTP的端口映射。最后在default_eth_
switch0.link上啟動了DNS功能。
執(zhí)行如下命令,在VxWorks上添加到開發(fā)主機上的網(wǎng)關:
routec“add –net –netmask 255.255.255.0 172.21.28.208 172.90.0.1”
啟動Windows 7開發(fā)主機上的telnet服務。主機端開啟telnet服務后,在VxWorks執(zhí)行telnet“172.21.28.208”命令,登錄開發(fā)主機,如圖3所示。
在Simics命令行窗口中設置Wireshark軟件的安裝路徑,并啟動Wireshark軟件,監(jiān)控default_eth_switch0的網(wǎng)絡狀態(tài)。
running>prefs->wireshark_path="C:\\Program Files\\Wireshark"
running>wireshark link = default_eth_switch0
Starting capture on <the ethernet_switch ′default_eth_switch0′>
對數(shù)據(jù)包接收控制寄存器RCTL進行故障注入。RCTL是一個32位寄存器,負責控制MAC接收端的相關功能。在Simics命令行窗口中執(zhí)行如下命令,查看RCTL寄存器的值:
running>viper.mb.sb.lan->csr_rctl
67141634
將RCTL寄存器的值轉化成16進制為04008002H,查詢RCTL寄存器格式可知,RCTL的接收允許位(RCTL.EN)被設置為1,即允許接收網(wǎng)絡數(shù)據(jù)包。
在VxWorks上執(zhí)行“telnet 172.21.28.110”命令,telnet到真實網(wǎng)絡中IP地址為172.21.28.110的Windows 7主機,同時啟動Wireshark軟件進行抓包。telnet成功后,執(zhí)行chkdsk命令。在chkdsk命令的執(zhí)行過程中,執(zhí)行如下命令進行故障注入,即重新賦值RCTL為04008000H,將接收允許位置0,不允許接收網(wǎng)絡數(shù)據(jù)包:
running>viper.mb.sb.lan->csr_rctl = 0x4008000
如圖4所示,在25 s時對RCTL寄存器進行了故障注入。在25 s之前,網(wǎng)絡數(shù)據(jù)包能夠正常收發(fā)。故障注入完成后,VxWorks端不能正常接收網(wǎng)絡數(shù)據(jù)包,Windows 7主機端將間隔3 s、6 s、12 s、24 s后嘗試重新向VxWorks端發(fā)送數(shù)據(jù)包。具體地,在26 s左右時,Windows 7主機端第一次嘗試向VxWorks端重新發(fā)送網(wǎng)絡數(shù)據(jù)包。然后在29 s、35 s、47 s、71 s左右時,分別進行了第2次、第3次、第4次和第5次重新向VxWorks端發(fā)送網(wǎng)絡數(shù)據(jù)包。而在26 s~71 s之間的時間段內,收發(fā)成功的網(wǎng)絡數(shù)據(jù)包數(shù)量為0。由于在第4次到第5次重新發(fā)送之間,恢復了RCTL寄存器的初始值,所以第5次重新發(fā)送網(wǎng)絡數(shù)據(jù)包成功。
同樣,可以對網(wǎng)絡數(shù)據(jù)包發(fā)送控制寄存器TCTL進行故障注入。其故障注入過程和結果與RCTL故障注入非常類似,在此不再贅述。
2.2 VxWorks操作系統(tǒng)訪問虛擬網(wǎng)絡的故障注入
啟動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上執(zhí)行如下命令:
ifconfig“gei0 172.90.0.22”
在Simics命令行窗口中執(zhí)行如下命令,加載網(wǎng)絡連接器模塊:
simics> load-module eth-links
在Simics命令行窗口中使用命令創(chuàng)建集線器組件,并命名為myhub;然后將VxWorks_A和VxWorks_B的網(wǎng)絡接口與myhub連接,并查看myhub的運行狀態(tài):
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命令行窗口中執(zhí)行如下命令,使用pcap-dump工具在myhub上抓取網(wǎng)絡數(shù)據(jù)包,并保存為.pcap格式的文件:
simics>myhub.pcap-dump my_package.pcap
Starting capture on <the ethernet_hub ′myhub′>
simics> c
接著在VxWorks_B上執(zhí)行如下命令,連續(xù)ping 20次VxWorks_A:
ping“-c 20 172.90.0.21”
然后停止使用pcap-dump抓包,執(zhí)行如下命令。抓取到的網(wǎng)絡數(shù)據(jù)包my_package.pcap文件保存在用戶設置的simics-workspace目錄下:
running>pcap-dump-stop
Stopping capture on <the ethernet_hub ′myhub′>
在Simics命令行窗口中執(zhí)行如下命令,加載網(wǎng)絡流量注入組件,新建網(wǎng)絡數(shù)據(jù)包注入組件myinjector。使用Wireshark工具監(jiān)控myhub上的網(wǎng)絡數(shù)據(jù)包,并向myhub注入捕捉到的my_package.pcap網(wǎng)絡數(shù)據(jù)包:
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上執(zhí)行如下命令,telnet到VxWorks_A上,輸入用戶名target和密碼password。telnet登錄成功后,執(zhí)行help命令。help命令執(zhí)行完畢后,繼續(xù)執(zhí)行exit命令,退出telnet登錄。同時,在Simics命令行窗口中執(zhí)行如下命令,停止向myhub注入my_package.pcap網(wǎng)絡數(shù)據(jù)包,并將Wireshark抓到的網(wǎng)絡數(shù)據(jù)包保存為inject_package.pcapng文件:
running>pcap-dump-stop
Stopping capture on <the ethernet_hub 'myhub'>
使用Wireshark統(tǒng)計工具分析inject_package.pcapng文件的結果如圖5所示。圖中的實線代表myhub上流經(jīng)的總的數(shù)據(jù)包。由于my_package.pcap截獲的是執(zhí)行ping命令時的數(shù)據(jù)包,ping屬于ICMP協(xié)議,陰影部分表示外部注入的my_package.pcap數(shù)據(jù)包。脈沖狀的豎線表示VxWorks_B執(zhí)行telnet時流經(jīng)myhub上的數(shù)據(jù)包,這些數(shù)據(jù)包屬于TCP協(xié)議,非ICMP協(xié)議的數(shù)據(jù)包。
由此可見,自定義的數(shù)據(jù)包可以成功注入到基于Simics的虛擬網(wǎng)絡中,用來模擬網(wǎng)絡過載等網(wǎng)絡故障。這種方法有助于開發(fā)者分析網(wǎng)絡故障、排除故障,提高網(wǎng)絡系統(tǒng)的穩(wěn)定性和健壯性。
3 總結
本文主要論述了在Simics全系統(tǒng)仿真環(huán)境下,對VxWorks嵌入式操作系統(tǒng)的串口故障注入、VxWorks訪問真實網(wǎng)絡的故障注入以及VxWorks訪問真實網(wǎng)絡的故障注入的原理和具體實現(xiàn)方法。這種基于仿真的故障注入技術對于研究嵌入式系統(tǒng)的可靠性和容錯性具有一定的參考意義。
參考文獻
[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.