資源描述:
《vxworks網(wǎng)絡(luò)協(xié)議棧.doc》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、《嵌入式操作系統(tǒng)VxWorks中網(wǎng)絡(luò)協(xié)議存儲池原理及實現(xiàn)》周衛(wèi)東藺妍劉利強(qiáng)(哈爾濱工程大學(xué)自動化學(xué)院,黑龍江哈爾濱,150001)摘要本文討論了網(wǎng)絡(luò)協(xié)議存儲池的基本原理和在嵌入式操作系統(tǒng)屮的實現(xiàn)方法。為在嵌入式系統(tǒng)中實現(xiàn)TCP/IP協(xié)議棧,提供了一種有效、簡潔、可靠的緩沖區(qū)管理。關(guān)鍵詞VxWorks;mBlk;clBlk;網(wǎng)絡(luò)協(xié)議存儲池VxWorks操作系統(tǒng)是美國WindRiver公司于1983年設(shè)計開發(fā)的一?種嵌入式實時操作系統(tǒng)(RTOS)。它以良好的持續(xù)發(fā)展能力、高性能的內(nèi)核以及卓越的實時性被廣泛的應(yīng)用在通信、軍事
2、、航空、航天等高精尖技術(shù)及實時性要求極高的領(lǐng)域屮。VxWorks操作系統(tǒng)有著優(yōu)越的網(wǎng)絡(luò)性能,而緩沖區(qū)的數(shù)據(jù)拷貝是影響網(wǎng)絡(luò)性能的主要因素。眾所周知,緩沖區(qū)在網(wǎng)絡(luò)協(xié)議棧屮有兩個作用:第一,提供載體,使分組或報文可以在各協(xié)議層小流動;第二,為各級緩沖區(qū)提供空間。緩沖區(qū)的設(shè)立使得TCP/IP協(xié)議棧支持異步I/0操作,異步操作對于協(xié)議棧的I/0性能是非常重要的。在網(wǎng)絡(luò)輸出的過程屮毎一層需要在數(shù)據(jù)的首部或者尾部添加數(shù)據(jù)頭和數(shù)據(jù)尾來對數(shù)據(jù)進(jìn)行封裝使得接收端對應(yīng)的層能夠進(jìn)行正確的接收,在輸入的過程屮每層都需要將本層的數(shù)據(jù)頭和數(shù)據(jù)尾去掉
3、而最終還原成發(fā)送端發(fā)送的數(shù)據(jù)。上述的封裝/去封裝和拷貝操作使得網(wǎng)絡(luò)協(xié)議對內(nèi)核的存儲器管理能力提出了很多要求。這些耍求包括能方便地操作可變長緩存,能在緩存頭部和尾部添加數(shù)據(jù)(如低層封裝來口高層的數(shù)據(jù)),能從緩存屮移去數(shù)據(jù)(如半數(shù)據(jù)色向丄經(jīng)過協(xié)議棧吋要去掉首部),并能盡量減少這些操作所作的數(shù)據(jù)復(fù)制。1使用netBufLib管理存儲池的基本原理網(wǎng)絡(luò)協(xié)議存儲池使用mBlk結(jié)構(gòu)、clBlk結(jié)構(gòu)、簇緩沖區(qū)和netBufLib提供的函數(shù)進(jìn)行組織和管理。mBlk和clBlk結(jié)構(gòu)為簇緩沖區(qū)(cluster)屮數(shù)據(jù)的緩沖共亨和緩沖鏈接提供
4、必要的信息。netBufLib例程使用mBlk和clBlk來管理cluster和引用cluster41的數(shù)據(jù),這些結(jié)構(gòu)體中的信息用于管理cluster屮的數(shù)據(jù)并且允許他們通過引用的形式來實現(xiàn)數(shù)據(jù)共亨,從而達(dá)到數(shù)據(jù)“零拷貝”的H的。1.1結(jié)構(gòu)體mBlk和clBlk及其數(shù)據(jù)結(jié)構(gòu)mBlk是訪問存儲在內(nèi)存池小數(shù)據(jù)的最基本對彖,由于mBlk僅僅只是通過clBlk來引用數(shù)據(jù),這使得網(wǎng)絡(luò)層在交換數(shù)據(jù)吋就可以避免數(shù)據(jù)復(fù)制。只需把一個mBlk連到相應(yīng)mBlk鏈上就可以存儲和交換任意多的數(shù)據(jù)。一個mBlk結(jié)構(gòu)體包括兩個成員變量mXext和
5、mXextPkt,由它們來組成縱橫兩個鏈表:mYext來組成橫的鏈表,這個鏈表屮的所有結(jié)點構(gòu)成一個包(packet);mXextPkt來組成縱的鏈表,這個鏈表屮的每個結(jié)點就是一個包(packet),所有的結(jié)點鏈在一起構(gòu)成一個包隊列,如圖1所示。數(shù)據(jù)包1數(shù)據(jù)包2圖1包含兩個數(shù)據(jù)包的mBlk鏈結(jié)構(gòu)體mBlk和clBlk的數(shù)據(jù)結(jié)構(gòu)如下所示:struetmBlk{BLK_HDRM_PKT_HDRCLBLK*}M_BLK;structclBlkmBlkHdr;mBlkPktHdr;pCIBIk;/*header*//*pkthd
6、r*//*pointertoclusterblk*/CL_BLK_LISTclNode;AunionofnextclBlk*/UINTclSize;/*clustersize*/intclRefCnt;/*countofthecluster*/structnetPool*pNetPool;/*pointertothenetPool*/}CL_BLK;/*headeratbeginningofeachmBlk*/structmHdfstructmBlk*mNext;/*nextbufferinchain*/structm
7、Blk*mXextPkt;Anextchaininqueue/record*/UINTclSize;/*clustersize*/intclRefCnt;/*countofthecluster*/structnetPool*pNetPool;/*pointertothenetPool*/}CL_BLK;/*headeratbeginningofeachmBlk*/structmHdfstructmBlk*mNext;/*nextbufferinchain*/structmBlk*mXextPkt;Anextchaini
8、nqueue/record*/char^mData;/*locationofdata*/intmLen;/*amountofdatainthismBlk*/UCHARmType;AtypeofdatainthismBlk京/UCHARmFlags;/*flags;seebelow*/}M_BLKJIDR;/*record/pack