從三個方面探討VxWorks網絡協議棧
在多種網絡協議以及產品的支持下,讓我們的生活工作有了更多的選擇。那么這里我們就將介紹一下VxWorks網絡協議棧等相關的內容。VxWorks是美國Wind River System公司(風河公司)推出的一個運行在目標機上的高性能、可裁減的嵌入式實時操作系統.它以其良好的可靠性和卓越的實時性被廣泛地應用在通信、軍 事、航空、航天等高精尖技術及實時性要求極高的領域中,如衛星通信、軍事演習、彈道制導、飛機導航等.VxWorks操作系統包括進程管理、存儲管理、設 備管理、文件系統管理、網絡協議及系統應用等幾個部分.VxWorks只占用很小的存儲空間,并可高度裁減,保證了系統能以較高的效率運行.它可以根據用 戶需求進行組合,其開放式結構對工業標準的支持使開發者只須做最少的工作即可設計有效的適合于不同用戶的要求.
1 VxWorks的網絡協議棧和MUX接口
VxWorks中的網絡協議棧叫作SENS(Scalable Enhanced Network Stack),即可裁減強網絡協議棧.SENS是基于4.4BSD TCP/IP協議棧發展而來的,包含了許多4.4BSD TCP/IP協議棧沒的協議;而且SENS在實現一些協議功能時增加了許多新特性,如在IP協議實現時增加了多播功能.SENS協議棧層次如圖1所示.
SENS的基本特征和傳統的TCP/IP網絡協議棧相似,但從圖1中可以看出SENS最大的特點是在數據鏈路層和網絡協議層之間多了MUX層.在SENS中,網絡接口的驅動程序是叫作END(Enhanced Network Driver),即增強型網絡驅動程序,它處于數據鏈路層.IP層和TCP/UDP層合稱為網絡協議層.在數據鏈路層和網絡協議層之間有應用程序接口(API),這個接口在SENS中叫作MUX(Multiplexer)接口.MUX接口如圖2所示.
在網絡協議層,VxWorks典型地使用TCP/IP協議(也支持其它協議);在數據鏈路層典型地使用Ethernet,也支持其它數據傳輸的物理媒體, 例如遠距離連接使用的串行線路接入方式,如PPP等.但是,無論使用什么物理媒體,網絡接口驅動都要用到MUX去與網絡協議層通信(數據鏈路層是一個抽象 概念,網絡接口驅動程序則是這種抽象概念所描述的功能實現的代碼).
在4.3BSD中,VxWorks的網絡接口驅動和協議是緊密結合在一起的,它們通過傳遞特定的數據結構互通信;而在MUX基礎上,它們只是通過MUX間 接地相互作用.例如,在收到一個包后,網絡接口驅動并沒直接與協議層連接.同樣地,當網絡接口驅動準備好向協議層發送數據時,驅動程序會調用一個MUX提 供的功能(函數).這個功能(函數)具體負責將數據傳給協議層的動作細節.應用MUX的主要目的是把網絡接口驅動和協議層分開,這樣就使得網絡接口驅動和 協議層彼此基本上保持獨立.這種獨立性使得加載一個新的協議或網絡接口驅動,所有現有的基于MUX的協議就都可以用這個新的網絡接口驅動程序;同樣,如果 要加一個新的基于MUX的協議,現有的網絡接口驅動也能夠用MUX來與新協議通信.#p#
2 MUX接口工作流程分析
MUX層作為獨立的一個網絡層有其自己的功能函數,但這些功能函數只是其上下兩層通信的接口.網絡協議層和網絡驅動與MUX接口的調用關系如圖3所示.
網絡協議棧的協議提供下面的接口功能函數:
①stackShutdownRtn()
②stackError()
③stackRcvRtn()
④stackTxRestartRtn()
當MUX接口層需要與協議層相互通信時,就調用以上的功能函數.想要使網絡協議層能夠使用MUX,必須至少實現以上四個功能函數.
MUX則實現muxBind()、muxUnBind()、muxDevload()等等.網絡協議層和網絡驅動接口都要根據各自的需要使用MUX接入點.由于MUX是由系統提供的,不需要在應用時再進行額外的編碼工作;只要在使用時,填入正確的參數即可.
例如在VxWorks中,muxDevLoad是這樣定義的:
- END_OBJ*muxDevLoad
- (
- int unit,
- END_OBJ*(*endLoad)(char*,void*),
- char* pInitString,
- BOOL loaning,
- void* pBSP
- )
網絡協議棧MUX中的其它功能函數在muxLib.h文件中有詳細定義.
網絡接口的驅動程序要完成endLoad()、endUnload()、endSend()等功能函數.MUX使用這些功能函數來與網絡驅動程序通信.當 編寫或加載一個使用MUX的網絡驅動程序時,必須實現圖3中END的所有功能.這些功能函數都是針對具體的網絡接口,即每一個網絡驅動程序中都要有這些功 能函數.#p#
3 MUX的應用
3.1 系統如何通過MUX啟動和使用網絡接口驅動程序——END
系統啟動時要通過任務(與進程概念相近,是嵌入式操作系統中的執行單元)來執行以下功能:
①從存儲器中裝載并啟動END;
②注冊用來處理END的中斷;
③通過END來實現處理包的功能.
在系統啟動時,VxWorks產生一tUsrRoot任務來執行以下的功能:首先初始化網絡任務的工作隊列,然后產生一個tNetTask來處理網絡任務工作隊列中的任務.
tNetTask任務調用muxDevLoad()來裝載網絡接口驅動,在tNetTask中已經定義了網絡驅動設備的endLoad()接入點, muxDevLoad()則也要執行endLoad().EndLoad()執行設備初始化并且返回一個名為END_OBJ的結構.MUX通過在 END_OBJ上加一個指針,指向能完成將數據向MUX上層發送的功能(函數).然后MUX把返回的END_OBJ加到END_OBJ結構鏈表中.這個鏈 表包括目前系統中所有可用的網絡設備.當從muxDevLoad()返回后,網絡設備就準備好可以使用了.
我們必須調用sysIntConnect()來注冊網絡接口設備的中斷處理.最典型的調用sysIntConnect()是在網絡接口設備的 endStart()中.當通過muxDevLoad()來裝載網絡接口設備時,就會調用muxDevStart()來啟動該設備, muxDevStart()就會調用endStar(),從而進行中斷處理的注冊.
系統啟動后,就要依靠中斷來使用該設備.當從網絡設備的中斷來到時,VxWorks激活該設備驅動程序所注冊的中斷服務.中斷服務的工作量應該是最小的, 只需完成從本地硬件上取到包即可.為了使中斷的鎖定時間最少,中斷服務應該僅處理那些要求最少執行時間的任務,例如出錯和狀態改變.中斷服務為了讓所有耗 時的工作在任務級別處理,應該將其排隊.例如:要使在任務級別處理包接受的工作排隊,中斷服務必須調用netJobAdd().在輸入的時候,這個例行程 序(Routine)收到一個功能函數的指針并且直到收到五個額外的參數(指針所指功能函數的參數).
- STATUS netJobAdd
- (
- FUNCPTR routine,
- int param1,
- int param2,
- int param3,
- int param4,
- int param5,
- )
如果調用netJobAdd(),就必須定義網絡驅動在任務級別處理包的接入點.NetJobAdd例行程序將功能函數調用(包括其參數)放入tNetTask的任務隊列中.VxWorks使用tNetTask處理任務級別的網絡處理功能.
這里只是舉例說明了接收包的情況,其它情況下netJobAdd()也一樣能執行對應的入列功能.
3.2 基于MUX網絡協議棧的網絡協議層和網絡接口驅動程序
基于MUX的特點:提供一個接口,使與其相連各層程序的編寫只需在基礎上編寫即可.可以說不論是網絡協議層還是網絡接口驅動程序都可以把MUX看作應用程 序接口(API).在VxWorks目標系統中加載一個網絡接口設備的驅動程序就和編寫一個應用程序一樣的簡單.具體步驟如下:
①編譯驅動程序的源代碼并在VxWorks鏡像中加載;
②編輯target/src/config/BSP/configNet.h;
③編輯BSP的cfonfig.h文件.
注意,如果不重新編譯新的boot ROMs(啟動ROM),那么就不能使用新的END.這就是說,只能啟動一個沒有END的目標系統,所以必須編輯配置文件,才能使用新的END.
由圖3可知,基于MUX的網絡協議與MUX向上綁定,而網絡接口驅動是與MUX向下綁定的.協議層的主要功能是對傳輸層和應用程序提供接口.協議層的代碼編寫也是通過MUX接口提供的接口進行編程,這和通用計算機有很大的相似之處,這里就不再述.
文引用通告地址:http://laocainiao.spaces.eepw.com.cn/articles/trackback/item/21647