VWorks網絡存儲原理

時間:2022-03-12 10:39:00

導語:VWorks網絡存儲原理一文來源于網友上傳,不代表本站觀點,若需要原創文章可咨詢客服老師,歡迎參考。

VWorks網絡存儲原理

摘要本文討論了網絡協議存儲池的基本原理和在嵌入式操作系統中的實現方法。為在嵌入式系統中實現TCP/IP協議棧,提供了一種有效、簡潔、可靠的緩沖區管理。

關鍵詞VxWorks;mBlk;clBlk;網絡協議存儲池

VxWorks操作系統是美國WindRiver公司于1983年設計開發的一種嵌入式實時操作系統(RTOS)。它以良好的持續發展能力、高性能的內核以及卓越的實時性被廣泛的應用在通信、軍事、航空、航天等高精尖技術及實時性要求極高的領域中。VxWorks操作系統有著優越的網絡性能,而緩沖區的數據拷貝是影響網絡性能的主要因素。

眾所周知,緩沖區在網絡協議棧中有兩個作用:第一,提供載體,使分組或報文可以在各協議層中流動;第二,為各級緩沖區提供空間。緩沖區的設立使得TCP/IP協議棧支持異步I/O操作,異步操作對于協議棧的I/0性能是非常重要的。在網絡輸出的過程中每一層需要在數據的首部或者尾部添加數據頭和數據尾來對數據進行封裝使得接收端對應的層能夠進行正確的接收,在輸入的過程中每層都需要將本層的數據頭和數據尾去掉而最終還原成發送端發送的數據。上述的封裝/去封裝和拷貝操作使得網絡協議對內核的存儲器管理能力提出了很多要求。這些要求包括能方便地操作可變長緩存,能在緩存頭部和尾部添加數據(如低層封裝來自高層的數據),能從緩存中移去數據(如當數據包向上經過協議棧時要去掉首部),并能盡量減少這些操作所作的數據復制。

1使用netBufLib管理存儲池的基本原理

網絡協議存儲池使用mBlk結構、clBlk結構、簇緩沖區和netBufLib提供的函數進行組織和管理。mBlk和clBlk結構為簇緩沖區(cluster)中數據的緩沖共享和緩沖鏈接提供必要的信息。netBufLib例程使用mBlk和clBlk來管理cluster和引用cluster中的數據,這些結構體中的信息用于管理cluster中的數據并且允許他們通過引用的形式來實現數據共享,從而達到數據“零拷貝”的目的。

1.1結構體mBlk和clBlk及其數據結構

mBlk是訪問存儲在內存池中數據的最基本對象,由于mBlk僅僅只是通過clBlk來引用數據,這使得網絡層在交換數據時就可以避免數據復制。只需把一個mBlk連到相應mBlk鏈上就可以存儲和交換任意多的數據。一個mBlk結構體包括兩個成員變量mNext和mNextPkt,由它們來組成縱橫兩個鏈表:mNext來組成橫的鏈表,這個鏈表中的所有結點構成一個包(packet);mNextPkt來組成縱的鏈表,這個鏈表中的每個結點就是一個包(packet),所有的結點鏈在一起構成一個包隊列,如圖1所示。結構體mBlk和clBlk的數據結構如下所示:

structmBlk

{

M_BLK_HDRmBlkHdr;/header/

M_PKT_HDRmBlkPktHdr;/pkthdr/

CL_BLKpClBlk;/pointertoclusterblk/

}M_BLK;

structclBlk

{

CL_BLK_LISTclNode;/unionofnextclBlk/

UINTclSize;/clustersize/

intclRefCnt;/countofthecluster/

structnetPoolpNetPool;/pointertothenetPool/

}CL_BLK;

/headeratbeginningofeachmBlk/

structmHdr

{

structmBlkmNext;/nextbufferinchain/

structmBlkmNextPkt;/nextchaininqueue/record/

charmData;/locationofdata/

intmLen;/amountofdatainthismBlk/

UCHARmType;/typeofdatainthismBlk/

UCHARmFlags;/flags;seebelow/

}M_BLK_HDR;

/record/packetheaderinfirstmBlkofchain;validifM_PKTHDRset/

structpktHdr

{

structifnetrcvif;/rcvinterface/

intlen;/totalpacketlength/

}M_PKT_HDR;

1.2網絡協議存儲池的初始化

VxWorks在網絡初始化時給網絡協議分配存儲池并調用netPoolInit()函數對其初始化,由于一個網絡協議通常需要不同大小的簇,因此它的存儲池也必須包含很多簇池(每一個簇池對應一個大小的簇)。如圖2所示。另外,每個簇的大小必須為2的方冪,最大可為64KB(65536),存儲池的常用簇的大小為64,128,256,512,1024比特,簇的大小是否有效取決于CL_DESC表中的相關內容,CL_DESC表是由netPoolInit()函數調用設定的。1.3存儲池的鏈接及釋放

存儲池在初始化后,由netPool結構組織幾個下一級子池:一個mBlk池、一個clBlk池和一個cluster池。mBlk池就是由很多mBlk組成的一條mBlk鏈;clBlk池就是由很多clBlk組成的一條clBlk鏈。cluster池由很多的更下一級cluster子池構成,每一個cluster子池就是一個cluster鏈。每一個cluster鏈中的所有cluster的大小相同,不同鏈中的cluster大小不同。但要實現不同進程訪問同一簇而不需要作數據的拷貝,還需要把mBlk結構,clBlk結構和簇結構鏈接在一起。創建這三級結構一般要遵循這樣五步:

a.調用系統函數netClusterGet()預定一塊簇緩沖區;

b.調用系統函數netClBlkGet()預定一個clBlk結構;

c.調用系統函數netMblkGet()預定一個mBlk結構;

d.調用系統函數netClBlkJoin()把簇添加到clBlk結構中;

e.調用系統函數netMblkClJoin()把clBlk結構添加到mBlk結構中。

這樣,就構成了最后的緩沖區。

在緩沖區中的數據使用完畢后要及時的釋放內存,這一過程只需要調用系統函數netMblkC1ChainFree()釋放存有數據的mBlk鏈表。例如當數據向上層傳送時,在本層中可以釋放已經不再使用的mBlk鏈表,由于在clBlk中記錄著指向本模塊的mBlk的個數,雖然釋放了mBlk鏈表,但是這并不表示將cluster中的數據釋放掉了,上層復制的鏈表仍然控制著這些數據,直到clBlk中的mBlk計數為0時才真正的將數據占用的簇釋放掉,將數據占用的內存空間釋放、歸還給系統將來使用。

2網絡協議存儲池與數據的封裝處理

VxWorks操作系統之所以采用mBlk—clBlk—cluster這樣的網絡數據存儲結構,目的就是減少數據拷貝的次數,提高網絡數據的傳輸速率。

在網絡輸出的過程中當從上層向下層傳遞數據時,下層協議需要對數據進行封裝使得接收端對應的層能夠進行正確的接收。下面通過實例分析網絡數據的封裝過程。例如要在如圖3所示的mBlk鏈中添加IP和UDP的首部。

在mBlk鏈表中封裝數據的方法是分配另外一個mBlk,把它放在鏈首,并將分組首部復制到這個mBlk。IP首部和UDP首部被放置在新mBlk的最后,這個新mBlk就成了整個鏈表的首部。如果需要,它允許任何其它低層協議(例如添加以太網首部)在IP首部前添加自己的首部,不需要再復制IP和UDP首部。在第一個mBlk中的mBlkHdr.mData指針指向首部的起始位置,mBlkHdr.mLen的值是28。在分組首部和IP首部之間有72字節的未用空間留給以后的首部,通過適當地修改mBlkHdr.mData指針和mBlkHdr.mLen添加在IP首部的前面。注意,分組首部已經移到新mBlk中了,分組首部必須放在mBlk鏈表的第一個mBlk中。在移動分組首部的同時,在第一個mBlk設置M_PKTHDR標志。在第二個mBlk中分組首部占用的空間現在未用。最后,改變在此分組首部中的長度成員mBlkPktHdr.len,成員mBlkPktHdr.len的值是這個分組的mBlk鏈表中所有數據的總長度:即所有通過mBlkHdr.mNext指針鏈接的mbuf的mBlkHdr.mLen值的和。本例中由于增加了28個字節變成了1488。如圖4所示。這樣,當報文在協議棧中流動時,不會拷貝報文鏈,而只需把指向mBlk的指針通過參數傳遞。當報文需要進人緩沖區時,也是通過鏈表的指針操作將報文插入或添加到隊列中。

3結論

網絡協議存儲池的職責有兩個:為協議棧提供合適的緩沖區,如果太大會浪費系統資源,太小會影響協議棧的吞吐量;提供合適的數據結構裝載網絡報文,既可以使協議棧方便地處理報文,又可以減少緩沖區拷貝的次數。減少拷貝次數不僅降低了CPU的負荷,還可以降低存儲器的消耗。本文剖析了嵌入式操作系統VxWorks中網絡協議存儲池的原理,實現了數據能夠動態增刪、但在邏輯上又呈現連續性的數據結構。能夠滿足在各協議層之間傳遞數據而不需要進行內存拷貝。

參考文獻

[1]翟東海,李力.mbuf的實現原理剖析及其在網絡編程中的應用[J].計算機工程與應,2004(8):104-106.

[2][美]DouglasE.Comer著.張娟等譯.用TCP/IP進行網際互聯第二卷:設計、實現與內核(第三版)[M].北京:電子工業出版社,2001.05.

[3][美]GaryR.WrightW.RichardStevens著.陸雪瑩,蔣慧等譯.TCP/IP詳解卷2:實現[M].北京:機械工業出版社.2000.07:10—50.

[4]WindRiverSystemInc.VxWorksNetwork