VWorks網(wǎng)絡(luò)存儲(chǔ)原理
時(shí)間:2022-03-12 10:39:00
導(dǎo)語:VWorks網(wǎng)絡(luò)存儲(chǔ)原理一文來源于網(wǎng)友上傳,不代表本站觀點(diǎn),若需要原創(chuàng)文章可咨詢客服老師,歡迎參考。
摘要本文討論了網(wǎng)絡(luò)協(xié)議存儲(chǔ)池的基本原理和在嵌入式操作系統(tǒng)中的實(shí)現(xiàn)方法。為在嵌入式系統(tǒng)中實(shí)現(xiàn)TCP/IP協(xié)議棧,提供了一種有效、簡潔、可靠的緩沖區(qū)管理。
關(guān)鍵詞VxWorks;mBlk;clBlk;網(wǎng)絡(luò)協(xié)議存儲(chǔ)池
VxWorks操作系統(tǒng)是美國WindRiver公司于1983年設(shè)計(jì)開發(fā)的一種嵌入式實(shí)時(shí)操作系統(tǒng)(RTOS)。它以良好的持續(xù)發(fā)展能力、高性能的內(nèi)核以及卓越的實(shí)時(shí)性被廣泛的應(yīng)用在通信、軍事、航空、航天等高精尖技術(shù)及實(shí)時(shí)性要求極高的領(lǐng)域中。VxWorks操作系統(tǒng)有著優(yōu)越的網(wǎng)絡(luò)性能,而緩沖區(qū)的數(shù)據(jù)拷貝是影響網(wǎng)絡(luò)性能的主要因素。
眾所周知,緩沖區(qū)在網(wǎng)絡(luò)協(xié)議棧中有兩個(gè)作用:第一,提供載體,使分組或報(bào)文可以在各協(xié)議層中流動(dòng);第二,為各級(jí)緩沖區(qū)提供空間。緩沖區(qū)的設(shè)立使得TCP/IP協(xié)議棧支持異步I/O操作,異步操作對(duì)于協(xié)議棧的I/0性能是非常重要的。在網(wǎng)絡(luò)輸出的過程中每一層需要在數(shù)據(jù)的首部或者尾部添加數(shù)據(jù)頭和數(shù)據(jù)尾來對(duì)數(shù)據(jù)進(jìn)行封裝使得接收端對(duì)應(yīng)的層能夠進(jìn)行正確的接收,在輸入的過程中每層都需要將本層的數(shù)據(jù)頭和數(shù)據(jù)尾去掉而最終還原成發(fā)送端發(fā)送的數(shù)據(jù)。上述的封裝/去封裝和拷貝操作使得網(wǎng)絡(luò)協(xié)議對(duì)內(nèi)核的存儲(chǔ)器管理能力提出了很多要求。這些要求包括能方便地操作可變長緩存,能在緩存頭部和尾部添加數(shù)據(jù)(如低層封裝來自高層的數(shù)據(jù)),能從緩存中移去數(shù)據(jù)(如當(dāng)數(shù)據(jù)包向上經(jīng)過協(xié)議棧時(shí)要去掉首部),并能盡量減少這些操作所作的數(shù)據(jù)復(fù)制。
1使用netBufLib管理存儲(chǔ)池的基本原理
網(wǎng)絡(luò)協(xié)議存儲(chǔ)池使用mBlk結(jié)構(gòu)、clBlk結(jié)構(gòu)、簇緩沖區(qū)和netBufLib提供的函數(shù)進(jìn)行組織和管理。mBlk和clBlk結(jié)構(gòu)為簇緩沖區(qū)(cluster)中數(shù)據(jù)的緩沖共享和緩沖鏈接提供必要的信息。netBufLib例程使用mBlk和clBlk來管理cluster和引用cluster中的數(shù)據(jù),這些結(jié)構(gòu)體中的信息用于管理cluster中的數(shù)據(jù)并且允許他們通過引用的形式來實(shí)現(xiàn)數(shù)據(jù)共享,從而達(dá)到數(shù)據(jù)“零拷貝”的目的。
1.1結(jié)構(gòu)體mBlk和clBlk及其數(shù)據(jù)結(jié)構(gòu)
mBlk是訪問存儲(chǔ)在內(nèi)存池中數(shù)據(jù)的最基本對(duì)象,由于mBlk僅僅只是通過clBlk來引用數(shù)據(jù),這使得網(wǎng)絡(luò)層在交換數(shù)據(jù)時(shí)就可以避免數(shù)據(jù)復(fù)制。只需把一個(gè)mBlk連到相應(yīng)mBlk鏈上就可以存儲(chǔ)和交換任意多的數(shù)據(jù)。一個(gè)mBlk結(jié)構(gòu)體包括兩個(gè)成員變量mNext和mNextPkt,由它們來組成縱橫兩個(gè)鏈表:mNext來組成橫的鏈表,這個(gè)鏈表中的所有結(jié)點(diǎn)構(gòu)成一個(gè)包(packet);mNextPkt來組成縱的鏈表,這個(gè)鏈表中的每個(gè)結(jié)點(diǎn)就是一個(gè)包(packet),所有的結(jié)點(diǎn)鏈在一起構(gòu)成一個(gè)包隊(duì)列,如圖1所示。結(jié)構(gòu)體mBlk和clBlk的數(shù)據(jù)結(jié)構(gòu)如下所示:
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網(wǎng)絡(luò)協(xié)議存儲(chǔ)池的初始化
VxWorks在網(wǎng)絡(luò)初始化時(shí)給網(wǎng)絡(luò)協(xié)議分配存儲(chǔ)池并調(diào)用netPoolInit()函數(shù)對(duì)其初始化,由于一個(gè)網(wǎng)絡(luò)協(xié)議通常需要不同大小的簇,因此它的存儲(chǔ)池也必須包含很多簇池(每一個(gè)簇池對(duì)應(yīng)一個(gè)大小的簇)。如圖2所示。另外,每個(gè)簇的大小必須為2的方冪,最大可為64KB(65536),存儲(chǔ)池的常用簇的大小為64,128,256,512,1024比特,簇的大小是否有效取決于CL_DESC表中的相關(guān)內(nèi)容,CL_DESC表是由netPoolInit()函數(shù)調(diào)用設(shè)定的。1.3存儲(chǔ)池的鏈接及釋放
存儲(chǔ)池在初始化后,由netPool結(jié)構(gòu)組織幾個(gè)下一級(jí)子池:一個(gè)mBlk池、一個(gè)clBlk池和一個(gè)cluster池。mBlk池就是由很多mBlk組成的一條mBlk鏈;clBlk池就是由很多clBlk組成的一條clBlk鏈。cluster池由很多的更下一級(jí)cluster子池構(gòu)成,每一個(gè)cluster子池就是一個(gè)cluster鏈。每一個(gè)cluster鏈中的所有cluster的大小相同,不同鏈中的cluster大小不同。但要實(shí)現(xiàn)不同進(jìn)程訪問同一簇而不需要作數(shù)據(jù)的拷貝,還需要把mBlk結(jié)構(gòu),clBlk結(jié)構(gòu)和簇結(jié)構(gòu)鏈接在一起。創(chuàng)建這三級(jí)結(jié)構(gòu)一般要遵循這樣五步:
a.調(diào)用系統(tǒng)函數(shù)netClusterGet()預(yù)定一塊簇緩沖區(qū);
b.調(diào)用系統(tǒng)函數(shù)netClBlkGet()預(yù)定一個(gè)clBlk結(jié)構(gòu);
c.調(diào)用系統(tǒng)函數(shù)netMblkGet()預(yù)定一個(gè)mBlk結(jié)構(gòu);
d.調(diào)用系統(tǒng)函數(shù)netClBlkJoin()把簇添加到clBlk結(jié)構(gòu)中;
e.調(diào)用系統(tǒng)函數(shù)netMblkClJoin()把clBlk結(jié)構(gòu)添加到mBlk結(jié)構(gòu)中。
這樣,就構(gòu)成了最后的緩沖區(qū)。
在緩沖區(qū)中的數(shù)據(jù)使用完畢后要及時(shí)的釋放內(nèi)存,這一過程只需要調(diào)用系統(tǒng)函數(shù)netMblkC1ChainFree()釋放存有數(shù)據(jù)的mBlk鏈表。例如當(dāng)數(shù)據(jù)向上層傳送時(shí),在本層中可以釋放已經(jīng)不再使用的mBlk鏈表,由于在clBlk中記錄著指向本模塊的mBlk的個(gè)數(shù),雖然釋放了mBlk鏈表,但是這并不表示將cluster中的數(shù)據(jù)釋放掉了,上層復(fù)制的鏈表仍然控制著這些數(shù)據(jù),直到clBlk中的mBlk計(jì)數(shù)為0時(shí)才真正的將數(shù)據(jù)占用的簇釋放掉,將數(shù)據(jù)占用的內(nèi)存空間釋放、歸還給系統(tǒng)將來使用。
2網(wǎng)絡(luò)協(xié)議存儲(chǔ)池與數(shù)據(jù)的封裝處理
VxWorks操作系統(tǒng)之所以采用mBlk—clBlk—cluster這樣的網(wǎng)絡(luò)數(shù)據(jù)存儲(chǔ)結(jié)構(gòu),目的就是減少數(shù)據(jù)拷貝的次數(shù),提高網(wǎng)絡(luò)數(shù)據(jù)的傳輸速率。
在網(wǎng)絡(luò)輸出的過程中當(dāng)從上層向下層傳遞數(shù)據(jù)時(shí),下層協(xié)議需要對(duì)數(shù)據(jù)進(jìn)行封裝使得接收端對(duì)應(yīng)的層能夠進(jìn)行正確的接收。下面通過實(shí)例分析網(wǎng)絡(luò)數(shù)據(jù)的封裝過程。例如要在如圖3所示的mBlk鏈中添加IP和UDP的首部。
在mBlk鏈表中封裝數(shù)據(jù)的方法是分配另外一個(gè)mBlk,把它放在鏈?zhǔn)?,并將分組首部復(fù)制到這個(gè)mBlk。IP首部和UDP首部被放置在新mBlk的最后,這個(gè)新mBlk就成了整個(gè)鏈表的首部。如果需要,它允許任何其它低層協(xié)議(例如添加以太網(wǎng)首部)在IP首部前添加自己的首部,不需要再復(fù)制IP和UDP首部。在第一個(gè)mBlk中的mBlkHdr.mData指針指向首部的起始位置,mBlkHdr.mLen的值是28。在分組首部和IP首部之間有72字節(jié)的未用空間留給以后的首部,通過適當(dāng)?shù)匦薷膍BlkHdr.mData指針和mBlkHdr.mLen添加在IP首部的前面。注意,分組首部已經(jīng)移到新mBlk中了,分組首部必須放在mBlk鏈表的第一個(gè)mBlk中。在移動(dòng)分組首部的同時(shí),在第一個(gè)mBlk設(shè)置M_PKTHDR標(biāo)志。在第二個(gè)mBlk中分組首部占用的空間現(xiàn)在未用。最后,改變在此分組首部中的長度成員mBlkPktHdr.len,成員mBlkPktHdr.len的值是這個(gè)分組的mBlk鏈表中所有數(shù)據(jù)的總長度:即所有通過mBlkHdr.mNext指針鏈接的mbuf的mBlkHdr.mLen值的和。本例中由于增加了28個(gè)字節(jié)變成了1488。如圖4所示。這樣,當(dāng)報(bào)文在協(xié)議棧中流動(dòng)時(shí),不會(huì)拷貝報(bào)文鏈,而只需把指向mBlk的指針通過參數(shù)傳遞。當(dāng)報(bào)文需要進(jìn)人緩沖區(qū)時(shí),也是通過鏈表的指針操作將報(bào)文插入或添加到隊(duì)列中。
3結(jié)論
網(wǎng)絡(luò)協(xié)議存儲(chǔ)池的職責(zé)有兩個(gè):為協(xié)議棧提供合適的緩沖區(qū),如果太大會(huì)浪費(fèi)系統(tǒng)資源,太小會(huì)影響協(xié)議棧的吞吐量;提供合適的數(shù)據(jù)結(jié)構(gòu)裝載網(wǎng)絡(luò)報(bào)文,既可以使協(xié)議棧方便地處理報(bào)文,又可以減少緩沖區(qū)拷貝的次數(shù)。減少拷貝次數(shù)不僅降低了CPU的負(fù)荷,還可以降低存儲(chǔ)器的消耗。本文剖析了嵌入式操作系統(tǒng)VxWorks中網(wǎng)絡(luò)協(xié)議存儲(chǔ)池的原理,實(shí)現(xiàn)了數(shù)據(jù)能夠動(dòng)態(tài)增刪、但在邏輯上又呈現(xiàn)連續(xù)性的數(shù)據(jù)結(jié)構(gòu)。能夠滿足在各協(xié)議層之間傳遞數(shù)據(jù)而不需要進(jìn)行內(nèi)存拷貝。
參考文獻(xiàn)
[1]翟東海,李力.mbuf的實(shí)現(xiàn)原理剖析及其在網(wǎng)絡(luò)編程中的應(yīng)用[J].計(jì)算機(jī)工程與應(yīng),2004(8):104-106.
[2][美]DouglasE.Comer著.張娟等譯.用TCP/IP進(jìn)行網(wǎng)際互聯(lián)第二卷:設(shè)計(jì)、實(shí)現(xiàn)與內(nèi)核(第三版)[M].北京:電子工業(yè)出版社,2001.05.
[3][美]GaryR.WrightW.RichardStevens著.陸雪瑩,蔣慧等譯.TCP/IP詳解卷2:實(shí)現(xiàn)[M].北京:機(jī)械工業(yè)出版社.2000.07:10—50.
[4]WindRiverSystemInc.VxWorksNetwork