施例提供一種數(shù)據(jù)處理方法,參見圖1,該方法可以包括:
[0045]101、網(wǎng)絡(luò)設(shè)備從物理接口接收到待處理數(shù)據(jù)后,獲取指向空閑硬件buffer的第一指針,第一指針指向的地址為硬件buffer的起始地址。
[0046]其中,網(wǎng)絡(luò)設(shè)備可以為路由器、交換機(jī)、防火墻等通信網(wǎng)絡(luò)中的各種設(shè)備。當(dāng)代數(shù)字通信網(wǎng)絡(luò)通常以數(shù)據(jù)包的形式進(jìn)行數(shù)據(jù)交互,網(wǎng)絡(luò)設(shè)備通過物理接口從通信網(wǎng)絡(luò)中的其它外部設(shè)備接收到的待處理數(shù)據(jù)也為數(shù)據(jù)包的形式。網(wǎng)絡(luò)設(shè)備從物理接口接收到待處理數(shù)據(jù)后,可以獲取指向空閑硬件buffer起始地址的第一指針,以便于根據(jù)第一指針將待處理數(shù)據(jù)存儲至硬件buffer。
[0047]在網(wǎng)絡(luò)設(shè)備中,指向硬件buffer起始地址的第一指針可以由硬件buffer管理單元(例如硬件加速單元)進(jìn)行分配和回收管理,硬件buffer管理單元屬于網(wǎng)絡(luò)設(shè)備的硬件部分。網(wǎng)絡(luò)設(shè)備從物理接口接收到待處理數(shù)據(jù)后,可以從硬件buffer管理單元獲取指向硬件buffer起始地址的第一指針。
[0048]102、網(wǎng)絡(luò)設(shè)備根據(jù)第一指針將待處理數(shù)據(jù)存儲至硬件buffer。
[0049]在獲取到指向硬件buffer起始地址的第一指針后,網(wǎng)絡(luò)設(shè)備可以根據(jù)第一指針將待處理數(shù)據(jù)存儲至硬件buffer。其中,網(wǎng)絡(luò)設(shè)備根據(jù)第一指針將待處理數(shù)據(jù)存儲至硬件buffer的過程是通過網(wǎng)絡(luò)設(shè)備的硬件部分完成的,不需要CPU和軟件的參與。而通過硬件部分將數(shù)據(jù)存儲至硬件buffer的處理速度比通過CPU和軟件將數(shù)據(jù)存儲至軟件buffer的處理速度快。
[0050]103、網(wǎng)絡(luò)設(shè)備根據(jù)第一指針獲取第二指針,第二指針指向的地址為與硬件buffer對應(yīng)的軟件buffer的起始地址,軟件buffer的數(shù)據(jù)區(qū)與硬件buffer對應(yīng)同一塊內(nèi)存區(qū)域。
[0051]其中,與硬件buffer對應(yīng)的軟件buffer滿足上層應(yīng)用模塊進(jìn)行數(shù)據(jù)處理時(shí)需要的數(shù)據(jù)結(jié)構(gòu),軟件buffer和硬件buffer的對應(yīng)關(guān)系在初始化時(shí)就已配置完成,硬件buffer及其對應(yīng)的軟件buffer的數(shù)據(jù)區(qū)對應(yīng)同一塊內(nèi)存區(qū)域,即將軟件buffer的數(shù)據(jù)區(qū)交給硬件來管理。
[0052]由于硬件buffer及其對應(yīng)的軟件buffer的數(shù)據(jù)區(qū)共用一塊內(nèi)存區(qū)域,因而指向硬件buffer起始地址的第一指針,也指向與硬件buffer對應(yīng)的軟件buffer的數(shù)據(jù)區(qū)的起始地址。當(dāng)網(wǎng)絡(luò)設(shè)備將待處理數(shù)據(jù)存儲至硬件buffer時(shí),實(shí)際上是將待處理數(shù)據(jù)存儲到與硬件buffer對應(yīng)的軟件buffer的數(shù)據(jù)區(qū),從而避免了現(xiàn)有技術(shù)中將硬件buffer中存儲的待處理數(shù)據(jù)拷貝至軟件buffer的數(shù)據(jù)區(qū)的拷貝動作,節(jié)省了網(wǎng)絡(luò)設(shè)備進(jìn)行數(shù)據(jù)處理的時(shí)間,降低了系統(tǒng)資源的消耗,提高了系統(tǒng)運(yùn)行效率。
[0053]在將待處理數(shù)據(jù)存儲至硬件buffer后,網(wǎng)絡(luò)設(shè)備可以根據(jù)第一指針獲取指向硬件buffer對應(yīng)的軟件buffer的起始地址的第二指針。第一指針指向的地址與第二指針的關(guān)系可以在初始化時(shí)在軟件buffer中進(jìn)行設(shè)置。
[0054]104、網(wǎng)絡(luò)設(shè)備將第二指針指向的軟件buffer交由上層應(yīng)用模塊進(jìn)行數(shù)據(jù)處理。
[0055]網(wǎng)絡(luò)設(shè)備在根據(jù)第一指針獲取到指向與硬件buffer對應(yīng)的軟件buffer的起始地址的第二指針后,由于軟件buffer的數(shù)據(jù)區(qū)已經(jīng)存儲有待處理數(shù)據(jù),且軟件buffer的結(jié)構(gòu)滿足上層應(yīng)用模塊進(jìn)行數(shù)據(jù)處理的要求,因而可以將第二指針指向的軟件buffer交由上層應(yīng)用模塊進(jìn)行數(shù)據(jù)處理。
[0056]可選地,在步驟101之前,本發(fā)明實(shí)施例提供的方法還可以包括初始化步驟:
[0057]網(wǎng)絡(luò)設(shè)備在軟件buffer中存放指向該軟件buffer起始地址的第二指針,第二指針的起始存放地址與第一指針指向的地址間隔預(yù)設(shè)字節(jié)數(shù)。
[0058]可選地,在步驟103中,網(wǎng)絡(luò)設(shè)備根據(jù)第一指針獲取第二指針可以包括:
[0059]網(wǎng)絡(luò)設(shè)備根據(jù)預(yù)設(shè)字節(jié)數(shù),將第一指針指向的地址進(jìn)行偏移計(jì)算,從計(jì)算出的地址中獲取存放的軟件buffer的起始地址。
[0060]可選地,在步驟104之后,本發(fā)明實(shí)施例提供的方法還可以包括:
[0061]105、若確定不需要將上層應(yīng)用模塊處理后的數(shù)據(jù)進(jìn)行轉(zhuǎn)發(fā),則網(wǎng)絡(luò)設(shè)備將軟件buffer釋放至軟件buffer池,并按照一定的周期時(shí)間將軟件buffer池中的所有軟件buffer的數(shù)據(jù)區(qū)作為空閑硬件buffer進(jìn)行管理;若確定需要將上層應(yīng)用模塊處理后的數(shù)據(jù)進(jìn)行轉(zhuǎn)發(fā),則網(wǎng)絡(luò)設(shè)備在將上層應(yīng)用模塊處理后的數(shù)據(jù)發(fā)送完成后,若確定待釋放buffer為與硬件buffer對應(yīng)的軟件buffer,則將待釋放軟件buffer的數(shù)據(jù)區(qū)作為空閑硬件buffer進(jìn)行管理。
[0062]可選地,在步驟105中,網(wǎng)絡(luò)設(shè)備確定待釋放buffer為與硬件buffer對應(yīng)的軟件buffer可以包括:
[0063]判斷軟件buffer中存放的硬件buffer標(biāo)識符與預(yù)設(shè)標(biāo)識符一致,和/或軟件buffer起始地址的起始存放地址與其數(shù)據(jù)區(qū)的起始地址間隔的字節(jié)數(shù)與預(yù)設(shè)字節(jié)數(shù)一致,則網(wǎng)絡(luò)設(shè)備確定待釋放軟件buffer為與硬件buffer對應(yīng)的軟件buffer。
[0064]本發(fā)明實(shí)施例提供一種數(shù)據(jù)處理方法,由于硬件buffer與對應(yīng)的軟件buffer的數(shù)據(jù)區(qū)對應(yīng)同一塊內(nèi)存區(qū)域,因而當(dāng)網(wǎng)絡(luò)設(shè)備根據(jù)指向硬件buffer起始地址的第一指針將待處理數(shù)據(jù)存儲至硬件buffer時(shí),相當(dāng)于同時(shí)將待處理數(shù)據(jù)存儲至硬件buffer對應(yīng)的軟件buffer的數(shù)據(jù)區(qū),從而在網(wǎng)絡(luò)設(shè)備根據(jù)第一指針獲取到指向軟件buffer起始地址的第二指針后,可以將第二指針指向的軟件buffer交由上層應(yīng)用模塊進(jìn)行數(shù)據(jù)處理,從而可以避免將待處理數(shù)據(jù)從硬件buffer拷貝到軟件buffer的數(shù)據(jù)區(qū),因此,能夠解決現(xiàn)有技術(shù)中由于需要將硬件buffer中的數(shù)據(jù)拷貝到軟件buffer的數(shù)據(jù)區(qū)以供上層應(yīng)用模塊進(jìn)行數(shù)據(jù)處理,從而導(dǎo)致的系統(tǒng)運(yùn)行效率低的問題。
[0065]實(shí)施例2
[0066]本發(fā)明實(shí)施例提供一種數(shù)據(jù)處理方法,其方法流程圖可以參見圖2和圖3,可以包括:
[0067]201、網(wǎng)絡(luò)設(shè)備在軟件buffer中存放指向該軟件buffer起始地址的第二指針,第二指針的起始存放地址與第一指針指向的地址間隔預(yù)設(shè)字節(jié)數(shù)。
[0068]在本發(fā)明實(shí)施例中,網(wǎng)絡(luò)設(shè)備可以通過初始化步驟在軟件buffer中存放指向該軟件buffer起始地址的第二指針,第二指針的起始存放地址與第一指針指向的地址間隔預(yù)設(shè)字節(jié)數(shù)。其中,存放第二指針的第二內(nèi)存區(qū)域與作為數(shù)據(jù)區(qū)的第一內(nèi)存區(qū)域?yàn)榍昂笙鄬ξ恢?,第二指針占用的?nèi)存空間大小以及預(yù)設(shè)字節(jié)數(shù)的大小,均可以根據(jù)實(shí)際需要進(jìn)行設(shè)置。
[0069]示例性的,本發(fā)明實(shí)施例提供的一種與硬件buffer對應(yīng)的軟件buffer的結(jié)構(gòu)示意圖可以參見圖4。在圖4中,軟件buffer中第二內(nèi)存區(qū)域與第一內(nèi)存區(qū)域相鄰,且第二內(nèi)存區(qū)域位于第一內(nèi)存區(qū)域之前,第二內(nèi)存區(qū)域的大小可以為8個(gè)字節(jié),此時(shí)間隔的預(yù)設(shè)字節(jié)數(shù)即為8。當(dāng)然,若網(wǎng)絡(luò)設(shè)備的操作系統(tǒng)為32位系統(tǒng),則第二內(nèi)存區(qū)域的大小為4個(gè)字節(jié),此時(shí)間隔的預(yù)設(shè)字節(jié)數(shù)即為4。當(dāng)然,如果第二指針的保存地址與數(shù)據(jù)區(qū)不相鄰時(shí),其間隔的預(yù)設(shè)字節(jié)數(shù)肯定是大于第二內(nèi)存區(qū)域的空間大小的。圖4中的軟件buffer還可以包括位于頭部的緩沖區(qū)描述字段即buf_info字段,可以用來存放上層應(yīng)用模塊進(jìn)行數(shù)據(jù)處理時(shí)添加的相關(guān)信息(例如協(xié)議信息)。
[0070]202、網(wǎng)絡(luò)設(shè)備從物理接口接收到待處理數(shù)據(jù)后,獲取指向空閑硬件buffer的第一指針,第一指針指向的地址為硬件buffer的起始地址。
[0071]在網(wǎng)絡(luò)設(shè)備通過物理接口接收到待處理數(shù)據(jù)后,參見圖3中的步驟a,待處理數(shù)據(jù)可以通過內(nèi)部總線到達(dá)網(wǎng)絡(luò)設(shè)備內(nèi)部的硬件buffer處理單元;參見圖3中的步驟b,網(wǎng)絡(luò)設(shè)備可以通過硬件buffer處理單元向硬件buffer管理單元申請硬件buffer,并獲取硬件buffer管理單元分配的指向硬件buffer起始地址的第一指針。其中,硬件buffer處理單元和硬件buffer管理單元是網(wǎng)絡(luò)設(shè)備的硬件部分。
[0072]203、網(wǎng)絡(luò)設(shè)備根據(jù)第一指針將待處理數(shù)據(jù)存儲至硬件buffer。
[0073]在獲取第一指針后,參見圖3中的步驟c,網(wǎng)絡(luò)設(shè)備的硬件buffer處理單元根據(jù)第一指針將待處理數(shù)據(jù)通過DMA方式存儲至硬件buffer。將待處理數(shù)據(jù)通過DMA方式存儲至硬件buffer,可以通過網(wǎng)絡(luò)設(shè)備的硬件直接進(jìn)行操作,而不需要CPU和軟件的參與。在通過物理接口從外部設(shè)備接收到待處理數(shù)據(jù)后,為了達(dá)到更加高效的接收效率,網(wǎng)絡(luò)設(shè)備可以通過硬件buffer處理單元、硬件buffer管理單元以及硬件buffer獲取待處理數(shù)據(jù),即可以通過硬件管理的內(nèi)存獲取待處理數(shù)據(jù)(不需要CPU和軟件的參與),而通過軟件管理的內(nèi)存例如軟件buffer獲取待處理數(shù)據(jù)(需要CPU和軟件的參與),則會使得網(wǎng)絡(luò)設(shè)備的數(shù)據(jù)接收效率較低。
[0074]另外,圖3中的虛線I和虛線2可以表示硬件buffer管理單元管理的硬件buffer和軟件buffer池中的軟件buffer均是網(wǎng)絡(luò)設(shè)備的內(nèi)存區(qū)域的一部分。
[0075]204、網(wǎng)絡(luò)設(shè)備根據(jù)預(yù)設(shè)字節(jié)數(shù),將第一指針指向的地址進(jìn)行偏移計(jì)算,從計(jì)算出的地址中獲取存放的軟件buffer的起始地址,軟件buffer的數(shù)據(jù)區(qū)與硬件buffer對應(yīng)同一塊內(nèi)存區(qū)域。
[0076]其中,與硬件buffer對應(yīng)的軟件buffer滿足上層應(yīng)用模塊進(jìn)行數(shù)據(jù)處理時(shí)需要的數(shù)據(jù)結(jié)構(gòu),并且硬件buffer與軟件buffer的數(shù)據(jù)區(qū)對應(yīng)同一塊內(nèi)存區(qū)域,即軟件buffer的數(shù)據(jù)區(qū)與硬件buffer共用第一內(nèi)存區(qū)域。由于軟件buffer的數(shù)據(jù)區(qū)與硬件buffer共用第一內(nèi)存區(qū)域,因而第一指針指向硬件buffer的起始地址,同時(shí)指向第一內(nèi)存區(qū)域的起始地址,還指向軟件buffer的數(shù)據(jù)區(qū)的起始地址。網(wǎng)絡(luò)設(shè)備可以將第一指針指向的地址偏移預(yù)設(shè)字節(jié)數(shù),即將第一指針指向的軟件buffer的數(shù)據(jù)區(qū)的起始地址偏移預(yù)設(shè)字節(jié)數(shù),并從計(jì)算出的地址中獲取存放的與硬件buffer對應(yīng)的軟件buffer的起始地址。其中,從計(jì)算出的地址中獲取的軟件buffer的起始地址即為第二指