摘 要:在對(duì)網(wǎng)絡(luò)通信可靠性要求高的系統(tǒng)中,需要對(duì)網(wǎng)卡進(jìn)行雙冗余備份。當(dāng)正常通信的網(wǎng)卡或線路出現(xiàn)故障時(shí)能自動(dòng)地切換到備份網(wǎng)卡。本文詳述了實(shí)時(shí)操作系統(tǒng)
VxWorks下一種雙網(wǎng)卡冗余備份技術(shù)的實(shí)現(xiàn)。
關(guān)鍵詞:實(shí)時(shí)操作系統(tǒng)VxWorks;網(wǎng)絡(luò)控制器;雙冗余備份
1引言
隨著網(wǎng)絡(luò)技術(shù)的成熟,以太網(wǎng)已成為各種控制系統(tǒng)接口互連的主要媒介。在某些特殊的應(yīng)用場(chǎng)合,為了提高系統(tǒng)的可靠性和抗毀性,需采用雙冗余網(wǎng)絡(luò)技術(shù)。在雙冗余網(wǎng)絡(luò)中,每個(gè)節(jié)點(diǎn)都采用兩塊網(wǎng)卡(或單板雙卡),中間用兩個(gè)HUB或交換機(jī)互連。當(dāng)某個(gè)節(jié)點(diǎn)一塊網(wǎng)卡故障,或網(wǎng)線損壞,或其中一個(gè)HUB或交換機(jī)故障時(shí),網(wǎng)絡(luò)仍能正常運(yùn)作。
雙冗余網(wǎng)絡(luò)雖有兩塊網(wǎng)卡,兩條通道,但對(duì)于高層應(yīng)用系統(tǒng)來(lái)說(shuō),仍呈現(xiàn)單網(wǎng)卡的特征。具體來(lái)講,每個(gè)節(jié)點(diǎn)的兩塊網(wǎng)卡只能有一個(gè)物理地址,一個(gè)IP地址,否則網(wǎng)絡(luò)就不能進(jìn)行正常通信。
現(xiàn)在大多數(shù)操作系統(tǒng)(如Windows、Unix、Linux等)均支持多網(wǎng)卡,但均非冗余設(shè)計(jì),每塊網(wǎng)卡都有獨(dú)立的物理地址和IP地址,以獨(dú)立的形式讓?xiě)?yīng)用系統(tǒng)使用。根據(jù)目前海軍對(duì)高性能實(shí)時(shí)系統(tǒng)的要求,我們對(duì)VxWorks環(huán)境下的雙網(wǎng)卡的切換以及冗余備份的設(shè)計(jì)方法及要點(diǎn)進(jìn)行介紹。
2VxWorks介紹[1][2][3]
VxWorks操作系統(tǒng)是一種具有工業(yè)領(lǐng)導(dǎo)地位的高性能嵌入式實(shí)時(shí)操作系統(tǒng),是嵌入式開(kāi)發(fā)環(huán)境Tornado的關(guān)鍵組成部分,它為程序員提供了良好的可靠性和卓越的實(shí)時(shí)性,因此被廣泛地應(yīng)用在通信、軍事、航空、航天等高精尖技術(shù)及實(shí)時(shí)性要求極高的領(lǐng)域中。
就廣泛使用的Unix和Windows操作系統(tǒng)來(lái)說(shuō),它們都是很好的應(yīng)用開(kāi)發(fā)和交互式應(yīng)用的操作系統(tǒng)平臺(tái),然而他們并不適合于實(shí)時(shí)應(yīng)用。而從另一方面考慮,以前出現(xiàn)的實(shí)時(shí)操作系統(tǒng)都沒(méi)有為應(yīng)用開(kāi)發(fā)和應(yīng)用的非實(shí)時(shí)組件(譬如向GUI)提供很好的運(yùn)行環(huán)境。而Wind River的哲學(xué)是利用兩個(gè)相互協(xié)作的操作系統(tǒng)來(lái)互相補(bǔ)充對(duì)方的不足(譬如VxWorks和Windows),讓他們各盡所長(zhǎng)。VxWorks為應(yīng)用提供實(shí)時(shí)性,而主機(jī)被用來(lái)進(jìn)行應(yīng)用開(kāi)發(fā)和運(yùn)行非實(shí)時(shí)的應(yīng)用程序。
3冗余切換
在系統(tǒng)的運(yùn)行中設(shè)備由于硬件或軟件原因出現(xiàn)故障是時(shí)有發(fā)生的事。采用有效的防錯(cuò)容錯(cuò)機(jī)制對(duì)一個(gè)需要穩(wěn)定運(yùn)行的系統(tǒng)是必需的。冗余備份技術(shù)是對(duì)容易出錯(cuò)的硬件設(shè)備進(jìn)行冗余備份。當(dāng)其中一個(gè)設(shè)備由于某種原因不能正常工作時(shí),另一個(gè)設(shè)備馬上就可以代替這個(gè)設(shè)備完成相同的功能。本文只是針對(duì)網(wǎng)絡(luò)因素導(dǎo)致系統(tǒng)故障的情況分析對(duì)網(wǎng)絡(luò)適配器的一種可行的錯(cuò)誤保護(hù)機(jī)制。
通常如果在某一系統(tǒng)中安裝兩塊網(wǎng)卡,它們分別有不同的物理和IP地址。當(dāng)其中一塊網(wǎng)卡出現(xiàn)故障時(shí),另一塊網(wǎng)卡不能實(shí)時(shí)地代替它繼續(xù)工作,這是因?yàn)樗鼈兊奈锢淼刂凡煌运荒芙邮艿桨l(fā)向前一塊網(wǎng)卡的數(shù)據(jù)。但在對(duì)網(wǎng)絡(luò)通信可靠性要求高的系統(tǒng)中,需要對(duì)網(wǎng)卡進(jìn)行雙冗余備份,一塊網(wǎng)卡在正常工作時(shí)使用,另一塊網(wǎng)卡作為備份。備份用的網(wǎng)卡不發(fā)送或接收數(shù)據(jù),但已經(jīng)處于激活狀態(tài)。在正常通信的網(wǎng)卡出現(xiàn)故障時(shí),備份用的網(wǎng)卡能實(shí)時(shí)地、自動(dòng)地切換過(guò)來(lái)繼續(xù)工作。顯然,這就要求兩塊網(wǎng)卡只能使用同一個(gè)物理地址和同一個(gè)IP地址。從應(yīng)用程序的角度看,只會(huì)看見(jiàn)一塊網(wǎng)卡在工作。應(yīng)用程序不關(guān)心是哪塊網(wǎng)卡在工作,也不關(guān)心網(wǎng)卡之間是如何切換的。
在VxWorks系統(tǒng)中,相同類型的網(wǎng)卡使用同一個(gè)驅(qū)動(dòng)程序,網(wǎng)卡之間由NDIS提供的句柄來(lái)區(qū)別。NDIS調(diào)用NIC驅(qū)動(dòng)程序的接口函數(shù)時(shí),都會(huì)把網(wǎng)卡的句柄傳入函數(shù)中。這就為在驅(qū)動(dòng)程序中實(shí)現(xiàn)冗余備份提供了基礎(chǔ)。雙網(wǎng)卡驅(qū)動(dòng)程序?qū)崿F(xiàn)后與高層協(xié)議驅(qū)動(dòng)程序綁定在一起,對(duì)應(yīng)用程序完全透明。因此要實(shí)現(xiàn)網(wǎng)卡的雙冗余備份,最理想的辦法是在NIC驅(qū)動(dòng)程序中實(shí)現(xiàn)。但是如果采取這樣的方式我們必須要有VxWorks下的所用網(wǎng)卡的驅(qū)動(dòng)程序,而對(duì)于一般的用戶而言,開(kāi)發(fā)這樣一個(gè)驅(qū)動(dòng)程序的難度是很大的。目前也有一些研究單位完成了這些工作,但是它們要求的價(jià)格過(guò)高,軟硬件共需要15000元左右,這對(duì)于一般小型用戶是比較高的。所以我們選擇在基本不影響冗余備份效果的基礎(chǔ)上,在高層的用戶程序中實(shí)現(xiàn)這一目標(biāo)。
在早期的VxWorks5.1.x中,系統(tǒng)是不支持多網(wǎng)卡的。通常,VxWorks在啟動(dòng)時(shí)僅僅對(duì)引導(dǎo)它啟動(dòng)的那塊網(wǎng)卡進(jìn)行初始化。如果需要在某一特定的目標(biāo)機(jī)上從一塊網(wǎng)卡換到另一塊網(wǎng)卡(例如從ene型換到ENP型的網(wǎng)卡),我們可以通過(guò)系統(tǒng)提供的函數(shù)以及來(lái)實(shí)現(xiàn)網(wǎng)卡間的切換。我們所需要做的是連接所需要的網(wǎng)卡并刪除前一個(gè)網(wǎng)卡的路由。我們可以調(diào)用特定網(wǎng)卡的連接函數(shù):enpattach(),enettach()等等。例如enpattach()函數(shù)為網(wǎng)卡連接中斷并建立enpsoftc,系統(tǒng)將為該網(wǎng)卡作相應(yīng)的初始化。
enpattach (0,0xffde0000,192,3);
/*參數(shù)依次為:網(wǎng)卡在系統(tǒng)中的單元號(hào),enp's的共享內(nèi)存地址,要連接的中斷向量,中斷級(jí)*/
需要說(shuō)明的是,在VxWorks 5.1下雖然這些連接函數(shù)都有一個(gè)unitNum參數(shù),似乎可以支持多個(gè)網(wǎng)卡。但其實(shí)并非這樣,在后面的敘述中我們可以看到它沒(méi)有IP MAX UNITS這個(gè)宏的定義,所以并不支持多網(wǎng)卡,unitNum的值一直是0,讀者們可以在源代碼中查看一下。
因?yàn)楫?dāng)VxWorks啟動(dòng)時(shí)它將一個(gè)缺省的網(wǎng)絡(luò)接口加載到網(wǎng)絡(luò)接口表中,所以在連接到需要的網(wǎng)卡后需要再調(diào)用ifRouteDelete()函數(shù)以刪除連接到某一指定網(wǎng)卡上的路由。
這樣就完成了VxWorks5.1下多網(wǎng)卡之間的的切換。
就VxWorks 5.4來(lái)說(shuō),它本身是支持多網(wǎng)卡的。以下我們描述SBS PC104系統(tǒng)如何在VxWorks下支持多個(gè)網(wǎng)絡(luò)適配器的軟件冗余切換(以ne2000型為例)。
首先我們需要通過(guò)網(wǎng)卡配置程序?qū)τ布h(huán)境中的所有網(wǎng)絡(luò)適配器進(jìn)行IO基址和IO中斷的配置。本文假設(shè)系統(tǒng)中只有兩個(gè)網(wǎng)絡(luò)適配器,其IO基址和IO中斷號(hào)如下所述。實(shí)際系統(tǒng)中可能會(huì)有多個(gè)網(wǎng)絡(luò)適配器,其配置方法可依法類推,只要網(wǎng)卡的IO基址和IO中斷不會(huì)和系統(tǒng)中的其他設(shè)備沖突即可。