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