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