專利名稱:零拷貝網(wǎng)絡(luò)報(bào)文發(fā)送、接收方法和裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及零拷貝網(wǎng)絡(luò)報(bào)文發(fā)送、接收領(lǐng)域,尤其涉及一種在內(nèi)核空間申請(qǐng)可映 射到用戶空間的連續(xù)內(nèi)存空間作為發(fā)送、接收?qǐng)?bào)文DMA緩沖區(qū)的零拷貝網(wǎng)絡(luò)報(bào)文發(fā)送、接 收方法和裝置。
背景技術(shù):
零拷貝(zero-copy)是指在某節(jié)點(diǎn)的網(wǎng)絡(luò)報(bào)文收發(fā)過(guò)程中不會(huì)出現(xiàn)任何內(nèi)存間 的拷貝,發(fā)送時(shí)數(shù)據(jù)包由應(yīng)用程序的用戶緩沖區(qū)直接經(jīng)過(guò)網(wǎng)絡(luò)接口到達(dá)外部網(wǎng)絡(luò)。中國(guó)專 利文獻(xiàn)CN101150487A公開了一種零拷貝網(wǎng)絡(luò)報(bào)文發(fā)送方法,包括如下操作步驟A.應(yīng)用程 序調(diào)用接口庫(kù)提供的函數(shù)打開設(shè)備接口 ;B.打開設(shè)備接口函數(shù)在用戶空間內(nèi)存中申請(qǐng)一 片連續(xù)的內(nèi)存作為報(bào)文緩沖區(qū),并把報(bào)文緩沖區(qū)首地址傳送給內(nèi)核驅(qū)動(dòng);C.內(nèi)核驅(qū)動(dòng)根據(jù) 緩沖區(qū)首地址及緩沖區(qū)大小,構(gòu)造緩沖區(qū)控制結(jié)構(gòu),并把控制結(jié)構(gòu)的物理地址傳送給接口 函數(shù),結(jié)構(gòu)包括報(bào)文緩沖區(qū)隊(duì)列的信息及隊(duì)列中每個(gè)緩沖區(qū)的物理地址;D.接口函數(shù)根據(jù) 緩沖區(qū)控制結(jié)構(gòu)的地址,通過(guò)內(nèi)存映射得到緩沖區(qū)控制結(jié)構(gòu)中的信息;E.網(wǎng)卡驅(qū)動(dòng)程序從 緩沖區(qū)隊(duì)列中取空閑緩沖區(qū)作為發(fā)送報(bào)文的DMA緩沖區(qū),并把發(fā)送的報(bào)文數(shù)據(jù)不經(jīng)內(nèi)核空 間直接DMA傳送到報(bào)文緩沖區(qū)中;F.應(yīng)用程序處理用戶內(nèi)存中報(bào)文發(fā)送緩沖區(qū)的報(bào)文數(shù) 據(jù)。 中國(guó)專利文獻(xiàn)CN101150488A公開了一種零拷貝網(wǎng)絡(luò)報(bào)文接收方法,包括如下操 作步驟A.應(yīng)用程序調(diào)用接口庫(kù)提供的函數(shù)打開設(shè)備接口 ;B.打開設(shè)備接口函數(shù)在用戶空 間內(nèi)存中申請(qǐng)一片連續(xù)的內(nèi)存作為報(bào)文緩沖區(qū),并把報(bào)文緩沖區(qū)首地址傳送給內(nèi)核驅(qū)動(dòng); C.內(nèi)核驅(qū)動(dòng)根據(jù)緩沖區(qū)首地址及緩沖區(qū)大小,構(gòu)造緩沖區(qū)控制結(jié)構(gòu),并把控制結(jié)構(gòu)的物理 地址傳送給接口函數(shù),所述結(jié)構(gòu)包括報(bào)文緩沖區(qū)隊(duì)列的信息及隊(duì)列中每個(gè)緩沖區(qū)的物理 地址;D.接口函數(shù)根據(jù)緩沖區(qū)控制結(jié)構(gòu)的地址,通過(guò)內(nèi)存映射得到緩沖區(qū)控制結(jié)構(gòu)中的信 息;E.網(wǎng)卡驅(qū)動(dòng)程序從緩沖區(qū)隊(duì)列中取空閑緩沖區(qū)作為接收?qǐng)?bào)文的DMA緩沖區(qū),并把接收 到的報(bào)文數(shù)據(jù)不經(jīng)內(nèi)核空間直接DMA傳送到報(bào)文緩沖區(qū)中;F.應(yīng)用程序處理用戶內(nèi)存中報(bào) 文接收緩沖區(qū)的報(bào)文數(shù)據(jù)。 上述現(xiàn)有技術(shù)存在的共同問(wèn)題是在步驟B中,打開設(shè)備接口函數(shù)在用戶空間內(nèi) 存申請(qǐng)的連續(xù)的內(nèi)存可能在內(nèi)核空間中并不是連續(xù)的內(nèi)存地址,這樣就需要將內(nèi)存地址按 頁(yè)面(內(nèi)存空間被分為若干個(gè)長(zhǎng)度相等的區(qū)域,每個(gè)區(qū)域即本申請(qǐng)文件中所說(shuō)的頁(yè)面)大 小轉(zhuǎn)換成DMA(直接存儲(chǔ)器訪問(wèn))操作所需的物理地址;而且網(wǎng)卡硬件在進(jìn)行DMA操作時(shí), 數(shù)據(jù)報(bào)文長(zhǎng)度受頁(yè)面大小限制,比如頁(yè)面大小為4K字節(jié),那么數(shù)據(jù)報(bào)文長(zhǎng)度將被限制在4K 字節(jié)內(nèi)。此外,中國(guó)專利文獻(xiàn)CN101150487A公開的一種零拷貝網(wǎng)絡(luò)報(bào)文發(fā)送方法還存在的 問(wèn)題是,驅(qū)動(dòng)程序需要使用中斷方式與網(wǎng)卡硬件通訊以獲得網(wǎng)卡進(jìn)行報(bào)文傳輸后的硬件狀 態(tài),為后續(xù)的報(bào)文接收準(zhǔn)備報(bào)文DMA緩沖區(qū),占用CPU資源。中國(guó)專利文獻(xiàn)CN101150488A 公開的一種零拷貝網(wǎng)絡(luò)報(bào)文接收方法還存在的問(wèn)題是,在網(wǎng)卡驅(qū)動(dòng)程序中,需要使用中斷 或輪詢方式進(jìn)行數(shù)據(jù)報(bào)文接收,造成CPU資源使用率過(guò)高;特別是在接收大流量64字節(jié)短數(shù)據(jù)報(bào)文情況下,應(yīng)用程序無(wú)法快速處理這些報(bào)文;這樣網(wǎng)卡無(wú)法接收后續(xù)的數(shù)據(jù)報(bào)文,就 出現(xiàn)了報(bào)文丟棄的現(xiàn)象。
發(fā)明內(nèi)容
針對(duì)現(xiàn)有技術(shù)在零拷貝網(wǎng)絡(luò)報(bào)文發(fā)送、接收過(guò)程中需要將內(nèi)存地址進(jìn)行轉(zhuǎn)換、網(wǎng) 卡硬件在進(jìn)行DMA操作時(shí)數(shù)據(jù)報(bào)文長(zhǎng)度受頁(yè)面大小限制、占用CPU資源的問(wèn)題,本發(fā)明的目 的是提供一種零拷貝網(wǎng)絡(luò)報(bào)文發(fā)送、接收方法和裝置,以解決上述問(wèn)題中的至少之一。
為實(shí)現(xiàn)上述目的,根據(jù)本發(fā)明的一個(gè)方面,提供了一種零拷貝網(wǎng)絡(luò)報(bào)文發(fā)送方法, 包括下列步驟使用內(nèi)存分配函數(shù)在網(wǎng)卡驅(qū)動(dòng)程序中不斷地申請(qǐng)?zhí)囟ù笮〉倪B續(xù)內(nèi)存直至 網(wǎng)卡驅(qū)動(dòng)程序中空閑的內(nèi)存空間不足夠申請(qǐng);從申請(qǐng)到的連續(xù)內(nèi)存中確定一塊連續(xù)內(nèi)存地 址空間;以及使用連續(xù)內(nèi)存地址空間進(jìn)行網(wǎng)絡(luò)報(bào)文發(fā)送。其中,從申請(qǐng)到的連續(xù)內(nèi)存中確定 一塊連續(xù)內(nèi)存地址空間的具體步驟包括將申請(qǐng)到的每片連續(xù)內(nèi)存的首地址存儲(chǔ)到地址數(shù) 組;將地址數(shù)組中的連續(xù)內(nèi)存的首地址根據(jù)大小進(jìn)行排序;在地址數(shù)組中根據(jù)排序后的首 地址確定一塊連續(xù)內(nèi)存地址空間。 根據(jù)本發(fā)明,特定大小是指內(nèi)存分配函數(shù)所能申請(qǐng)的連續(xù)內(nèi)存的最大值;連續(xù)內(nèi) 存地址空間大于或等于用戶指定的發(fā)送報(bào)文DMA緩沖區(qū)的大??;地址數(shù)組包括用于存儲(chǔ)小 于4G的首地址的低端地址數(shù)組和用于存儲(chǔ)4G以上的首地址的高端地址數(shù)組,排序是根據(jù) 連續(xù)內(nèi)存的首地址的大小,在確定連續(xù)內(nèi)存地址空間時(shí)首先選擇在低端地址數(shù)組中進(jìn)行。
根據(jù)本發(fā)明,在確定了連續(xù)內(nèi)存空間之后將連續(xù)內(nèi)存地址空間的首地址及大小保 存至網(wǎng)卡驅(qū)動(dòng)程序中,并按照頁(yè)面大小將連續(xù)內(nèi)存地址空間標(biāo)記為保留頁(yè)面,將其他申請(qǐng) 的未使用的連續(xù)內(nèi)存釋放。 相應(yīng)地,本發(fā)明提供了一種零拷貝網(wǎng)絡(luò)報(bào)文發(fā)送裝置,包括申請(qǐng)模塊,用于在網(wǎng) 卡驅(qū)動(dòng)程序中申請(qǐng)連續(xù)內(nèi)存;確定模塊,用于從申請(qǐng)到的連續(xù)內(nèi)存中確定一塊連續(xù)內(nèi)存地 址空間;以及發(fā)送模塊,用于使用連續(xù)內(nèi)存地址空間進(jìn)行網(wǎng)絡(luò)報(bào)文發(fā)送。其中,確定模塊包 括地址數(shù)組模塊,用于存儲(chǔ)申請(qǐng)到的連續(xù)內(nèi)存的首地址;排序模塊,用于對(duì)首地址進(jìn)行排 序;以及查找模塊,用于查找連續(xù)內(nèi)存地址空間。 根據(jù)本發(fā)明的另一個(gè)方面,提供了一種零拷貝網(wǎng)絡(luò)報(bào)文接收方法,包括下列步驟 使用內(nèi)存分配函數(shù)在網(wǎng)卡驅(qū)動(dòng)程序中不斷地申請(qǐng)?zhí)囟ù笮〉倪B續(xù)內(nèi)存直至網(wǎng)卡驅(qū)動(dòng)程序 中空閑的內(nèi)存空間不足夠申請(qǐng);從申請(qǐng)到的連續(xù)內(nèi)存中確定一塊連續(xù)內(nèi)存地址空間;以及 使用連續(xù)內(nèi)存地址空間進(jìn)行網(wǎng)絡(luò)報(bào)文接收。其中,從申請(qǐng)到的連續(xù)內(nèi)存中確定一塊連續(xù)內(nèi) 存地址空間的具體步驟包括將申請(qǐng)到的每片連續(xù)內(nèi)存的首地址存儲(chǔ)到地址數(shù)組;將地址 數(shù)組中的連續(xù)內(nèi)存的首地址根據(jù)大小進(jìn)行排序;在地址數(shù)組中根據(jù)排序后的首地址確定一 塊連續(xù)內(nèi)存地址空間。 根據(jù)本發(fā)明,特定大小是指內(nèi)存分配函數(shù)所能申請(qǐng)的連續(xù)內(nèi)存的最大值;連續(xù)內(nèi) 存地址空間大于或等于用戶指定的接收?qǐng)?bào)文DMA緩沖區(qū)的大??;地址數(shù)組包括用于存儲(chǔ)小 于4G的首地址的低端地址數(shù)組和用于存儲(chǔ)4G以上的首地址的高端地址數(shù)組;在確定連續(xù) 內(nèi)存地址至間時(shí)首先選擇在低端地址數(shù)組中進(jìn)行。 根據(jù)本發(fā)明,在確定了連續(xù)內(nèi)存空間之后將連續(xù)內(nèi)存地址空間的首地址及大小保 存至網(wǎng)卡驅(qū)動(dòng)程序中,并按照頁(yè)面大小將連續(xù)內(nèi)存地址空間標(biāo)記為保留頁(yè)面,將其他申請(qǐng)的未使用的連續(xù)內(nèi)存釋放。 相應(yīng)地,本發(fā)明提供了一種零拷貝網(wǎng)絡(luò)報(bào)文接收裝置,包括申請(qǐng)模塊,用于在網(wǎng) 卡驅(qū)動(dòng)程序中申請(qǐng)連續(xù)內(nèi)存;確定模塊,用于從申請(qǐng)到的連續(xù)內(nèi)存中確定一塊連續(xù)內(nèi)存地 址空間;以及接收模塊,用于使用連續(xù)內(nèi)存地址空間進(jìn)行網(wǎng)絡(luò)報(bào)文接收。其中,確定模塊包 括地址數(shù)組模塊,用于存儲(chǔ)申請(qǐng)到的連續(xù)內(nèi)存的首地址;排序模塊,用于對(duì)首地址進(jìn)行排 序;以及查找模塊,用于查找連續(xù)內(nèi)存地址空間。 本發(fā)明的零拷貝網(wǎng)絡(luò)報(bào)文發(fā)送方法和裝置,通過(guò)在網(wǎng)卡驅(qū)動(dòng)程序中申請(qǐng)連續(xù)內(nèi) 存,發(fā)送的數(shù)據(jù)報(bào)文連續(xù)存儲(chǔ)在報(bào)文DMA緩沖區(qū)中,因此網(wǎng)卡硬件在進(jìn)行DMA操作時(shí)不受頁(yè) 面大小限制,網(wǎng)卡不需要采用中斷方式通知網(wǎng)卡驅(qū)動(dòng)程序數(shù)據(jù)報(bào)文發(fā)送完成的情況,不占 用CPU資源。 本發(fā)明的零拷貝網(wǎng)絡(luò)報(bào)文接收方法和裝置,通過(guò)在網(wǎng)卡驅(qū)動(dòng)程序中申請(qǐng)連續(xù)內(nèi) 存,接收的數(shù)據(jù)報(bào)文連續(xù)存儲(chǔ)在報(bào)文DMA緩沖區(qū)中,不需要將用戶空間內(nèi)存地址按頁(yè)面大 小轉(zhuǎn)換成DMA操作所需的物理地址,因此網(wǎng)卡硬件在進(jìn)行DMA操作時(shí)不受頁(yè)面大小限制,即 使接收大流量64字節(jié)短數(shù)據(jù)報(bào)文也不會(huì)出現(xiàn)報(bào)文丟棄現(xiàn)象,而且網(wǎng)卡驅(qū)動(dòng)程序也不需要 采用中斷或輪詢方式接收數(shù)據(jù)報(bào)文,不占用CUP資源。
圖1是本發(fā)明的零拷貝網(wǎng)絡(luò)報(bào)文發(fā)送方法的流程圖; 圖2是本發(fā)明的的零拷貝網(wǎng)絡(luò)報(bào)文發(fā)送方法中確定一塊連續(xù)內(nèi)存地址空間的具 體操作流程圖; 圖3是本發(fā)明的零拷貝網(wǎng)絡(luò)報(bào)文發(fā)送裝置的結(jié)構(gòu)示意圖;
圖4是本發(fā)明的零拷貝網(wǎng)絡(luò)報(bào)文接收方法的流程圖;
圖5是本發(fā)明的零拷貝網(wǎng)絡(luò)報(bào)文接收裝置的結(jié)構(gòu)示意圖。
具體實(shí)施例方式
參見圖1所示,本實(shí)施例的一種零拷貝網(wǎng)絡(luò)報(bào)文發(fā)送方法,具體包括以下操作步 驟S110,使用內(nèi)存分配函數(shù)在網(wǎng)卡驅(qū)動(dòng)程序中不斷地申請(qǐng)?zhí)囟ù笮〉倪B續(xù)內(nèi)存直至網(wǎng)卡 驅(qū)動(dòng)程序中空閑的內(nèi)存空間不足夠申請(qǐng);S120,從申請(qǐng)到的連續(xù)內(nèi)存中確定一塊連續(xù)內(nèi)存 地址空間;以及S130,使用連續(xù)內(nèi)存地址空間進(jìn)行網(wǎng)絡(luò)報(bào)文發(fā)送。 在步驟SllO中,特定大小是指內(nèi)存分配函數(shù)所能申請(qǐng)的最大的連續(xù)內(nèi)存的值,舉 例來(lái)說(shuō),在某些Li皿x操作系統(tǒng)中,利用內(nèi)存分配函數(shù)能申請(qǐng)的最大連續(xù)內(nèi)存為4M字節(jié), 內(nèi)存分配函數(shù)不斷地在網(wǎng)卡驅(qū)動(dòng)程序中進(jìn)行申請(qǐng)直至網(wǎng)卡驅(qū)動(dòng)程序中空閑的內(nèi)存空間小 于內(nèi)存分配函數(shù)所要申請(qǐng)的最大的連續(xù)內(nèi)存,也即直至內(nèi)存分配函數(shù)返回錯(cuò)誤值時(shí)停止申 請(qǐng),在這個(gè)過(guò)程中內(nèi)存分配函數(shù)會(huì)申請(qǐng)到多片連續(xù)內(nèi)存。 在步驟S120中,從申請(qǐng)到的多片連續(xù)內(nèi)存中確定一塊連續(xù)內(nèi)存地址空間,連續(xù)內(nèi) 存地址空間大于或等于用戶指定的發(fā)送報(bào)文DMA緩沖區(qū)的大小。當(dāng)需要確定的一塊連續(xù)內(nèi) 存地址空間較小時(shí),可能只需要一片申請(qǐng)到的連續(xù)內(nèi)存即可,但是當(dāng)需要確定的一塊連續(xù) 內(nèi)存地址空間較大時(shí),就會(huì)需要多片申請(qǐng)到的連續(xù)內(nèi)存才能滿足。 在步驟S130中,使用連續(xù)內(nèi)存地址空間進(jìn)行網(wǎng)絡(luò)報(bào)文發(fā)送是指,網(wǎng)卡硬件將接收到的數(shù)據(jù)報(bào)文連續(xù)地存儲(chǔ)在連續(xù)內(nèi)存地址空間中,用戶編寫的應(yīng)用程序通過(guò)接口函數(shù)接收 存儲(chǔ)在連續(xù)內(nèi)存地址空間中的數(shù)據(jù)報(bào)文。 參見圖2所示,從申請(qǐng)到的多片連續(xù)內(nèi)存中確定一塊連續(xù)內(nèi)存地址空間具體包括 以下步驟 S120A,將申請(qǐng)到的每片連續(xù)內(nèi)存的首地址存儲(chǔ)到地址數(shù)組; S120B,將地址數(shù)組中的連續(xù)內(nèi)存的首地址根據(jù)大小進(jìn)行排序; S120C,在地址數(shù)組中根據(jù)排序后的首地址確定一塊連續(xù)內(nèi)存地址空間。 在步驟S120A中,每片連續(xù)內(nèi)存的首地址是以數(shù)值形式表示,地址數(shù)組分為低端
地址數(shù)組和高端地址數(shù)組,首地址小于4G的存儲(chǔ)到低端地址數(shù)組,首地址大于或等于4G的
存儲(chǔ)到高端地址數(shù)組。低端地址數(shù)組和高端地址數(shù)組的劃分,是因?yàn)長(zhǎng)i皿x內(nèi)核以4G為界
將內(nèi)存空間分為低端內(nèi)存區(qū)域和高端內(nèi)存區(qū)域。 在步驟S120B中,在多片連續(xù)內(nèi)存的首地址存儲(chǔ)到地址數(shù)組中之后,在地址數(shù)組 中根據(jù)每片連續(xù)內(nèi)存的首地址的大小將首地址進(jìn)行排序。對(duì)首地址進(jìn)行排序的目的是便于 確定連續(xù)內(nèi)存地址空間,因?yàn)樗暾?qǐng)的每片連續(xù)內(nèi)存大小是一樣的,每個(gè)首地址對(duì)應(yīng)一片 連續(xù)內(nèi)存,在連續(xù)內(nèi)存地址空間的大小確定了之后也就確定了所需要的連續(xù)內(nèi)存的片數(shù)。
當(dāng)然在其他的實(shí)施例中,也可以在多片連續(xù)內(nèi)存的首地址存儲(chǔ)到地址數(shù)組過(guò)程 中,邊進(jìn)行存儲(chǔ),邊進(jìn)行排序,排序不是等到存儲(chǔ)結(jié)束之后才進(jìn)行。過(guò)程雖然稍有差異,但效 果是一樣的,都可以方便確定連續(xù)內(nèi)存地址空間。 在確定了連續(xù)內(nèi)存地址空間之后,將需要用到的連續(xù)內(nèi)存地址空間的首地址及大 小保存至網(wǎng)卡驅(qū)動(dòng)程序中,并按照頁(yè)面大小將連續(xù)內(nèi)存地址空間標(biāo)記為保留頁(yè)面。之所以 將連續(xù)內(nèi)存地址空間標(biāo)記為保留頁(yè)面,是因?yàn)樵谟?jì)算機(jī)操作系統(tǒng)內(nèi)是按照頁(yè)面大小來(lái)管理 內(nèi)存空間的。然后,將其他申請(qǐng)的而未使用的內(nèi)存釋放。在確定連續(xù)內(nèi)存地址空間時(shí)首先 選擇在低端地址數(shù)組中確定,只有當(dāng)?shù)投说刂窋?shù)組對(duì)應(yīng)的全部連續(xù)內(nèi)存仍不足時(shí)才繼續(xù)選 擇在高端地址數(shù)組中確定。由于Li皿x內(nèi)核針對(duì)高端內(nèi)存區(qū)域,需要建立映射表來(lái)完成物 理地址和虛擬地址之間的映射。軟、硬件都需要直接對(duì)連續(xù)內(nèi)存地址空間進(jìn)行操作,因此低 端數(shù)組能更好地滿足需求。 參見圖3所示,本發(fā)明的一種零拷貝網(wǎng)絡(luò)報(bào)文發(fā)送裝置包括申請(qǐng)模塊210,用于 在網(wǎng)卡驅(qū)動(dòng)程序中申請(qǐng)連續(xù)內(nèi)存;確定模塊220,用于從申請(qǐng)模塊210所申請(qǐng)到的連續(xù)內(nèi)存 中確定一塊連續(xù)內(nèi)存地址空間;以及發(fā)送模塊230,用于使用確定模塊220確定的連續(xù)內(nèi)存 地址空間進(jìn)行網(wǎng)絡(luò)報(bào)文發(fā)送。具體地說(shuō),網(wǎng)卡硬件將接收到的數(shù)據(jù)報(bào)文連續(xù)地存儲(chǔ)在連續(xù) 內(nèi)存地址空間中,用戶編寫的應(yīng)用程序通過(guò)接口函數(shù)接收存儲(chǔ)在連續(xù)內(nèi)存地址空間中的數(shù) 據(jù)報(bào)文。其中,確定模塊220具體包括地址數(shù)組模塊220-l,用于存儲(chǔ)從申請(qǐng)模塊210申 請(qǐng)到的連續(xù)內(nèi)存的首地址;排序模塊220-2,用于對(duì)申請(qǐng)模塊210申請(qǐng)到的連續(xù)內(nèi)存的首地 址進(jìn)行排序;以及查找模塊220-3,用于查找連續(xù)內(nèi)存地址空間。 申請(qǐng)模塊210在網(wǎng)卡驅(qū)動(dòng)程序中申請(qǐng)?zhí)囟ù笮〉倪B續(xù)內(nèi)存直至剩余的內(nèi)存空間 不足申請(qǐng)。 在確定模塊220中,地址數(shù)組模塊220-1儲(chǔ)存申請(qǐng)到的多片連續(xù)內(nèi)存的每一片連 續(xù)內(nèi)存的首地址,排序模塊220-2對(duì)地址數(shù)組模塊220-1中的首地址根據(jù)大小進(jìn)行排序,查 找模塊220-3根據(jù)用戶指定的發(fā)送報(bào)文DMA緩沖區(qū)的大小在地址數(shù)組模塊220-1中查找一片或多片連續(xù)內(nèi)存作為連續(xù)地址內(nèi)存空間,連續(xù)地址內(nèi)存空間大于或等于用戶指定的發(fā)送報(bào)文DMA緩沖區(qū)的大小。 因?yàn)楸景l(fā)明的零拷貝網(wǎng)絡(luò)報(bào)文發(fā)送方法和裝置都是在網(wǎng)卡驅(qū)動(dòng)程序中申請(qǐng)連續(xù)內(nèi)存,從而使發(fā)送的數(shù)據(jù)報(bào)文連續(xù)存儲(chǔ)在報(bào)文DMA緩沖區(qū)中,因此不需要將內(nèi)存地址按頁(yè)面大小轉(zhuǎn)換成DMA操作所需的物理地址,網(wǎng)卡硬件在進(jìn)行DMA操作時(shí)不受頁(yè)面大小限制,網(wǎng)卡也不需要采用中斷方式通知網(wǎng)卡驅(qū)動(dòng)程序數(shù)據(jù)報(bào)文發(fā)送完成的情況,不占用CPU資源。
參見圖4所示,本實(shí)施例的一種零拷貝網(wǎng)絡(luò)報(bào)文接收方法,具體包括以下操作步驟S310,使用內(nèi)存分配函數(shù)在網(wǎng)卡驅(qū)動(dòng)程序中不斷地申請(qǐng)?zhí)囟ù笮〉倪B續(xù)內(nèi)存直至網(wǎng)卡驅(qū)動(dòng)程序中空閑的內(nèi)存空間不足夠申請(qǐng);S320,從申請(qǐng)到的連續(xù)內(nèi)存中確定一塊連續(xù)內(nèi)存地址空間;S330,使用連續(xù)內(nèi)存地址空間進(jìn)行網(wǎng)絡(luò)報(bào)文接收。 在步驟S310中,特定大小是指內(nèi)存分配函數(shù)所能申請(qǐng)的最大的連續(xù)內(nèi)存的值,舉例來(lái)說(shuō),在某些Li皿x操作系統(tǒng)中,利用內(nèi)存分配函數(shù)能申請(qǐng)的最大連續(xù)內(nèi)存為4M字節(jié),內(nèi)存分配函數(shù)不斷地在網(wǎng)卡驅(qū)動(dòng)程序中進(jìn)行申請(qǐng)直至網(wǎng)卡驅(qū)動(dòng)程序中空閑的內(nèi)存空間小于內(nèi)存分配函數(shù)所要申請(qǐng)的最大的連續(xù)內(nèi)存,也即直至內(nèi)存分配函數(shù)返回錯(cuò)誤值時(shí)停止申請(qǐng),在這個(gè)過(guò)程中內(nèi)存分配函數(shù)會(huì)申請(qǐng)到多片連續(xù)內(nèi)存。 在步驟S320中,從申請(qǐng)到的連續(xù)內(nèi)存中確定一塊連續(xù)內(nèi)存地址空間,連續(xù)內(nèi)存地址空間大于或等于用戶指定的接收?qǐng)?bào)文DMA緩沖區(qū)的大小。當(dāng)需要確定的一塊連續(xù)內(nèi)存地址空間較小時(shí),可能只需要一片申請(qǐng)到的連續(xù)內(nèi)存即可,但是當(dāng)需要確定的一塊連續(xù)內(nèi)存地址空間較大時(shí),就會(huì)需要多片申請(qǐng)到的連續(xù)內(nèi)存才能滿足。 在步驟S330中,使用連續(xù)內(nèi)存地址空間進(jìn)行網(wǎng)絡(luò)報(bào)文接收是指,用戶編寫的應(yīng)用程序通過(guò)接口函數(shù)將預(yù)發(fā)送的數(shù)據(jù)報(bào)文連續(xù)地存儲(chǔ)在連續(xù)內(nèi)存地址空間中。當(dāng)需要進(jìn)行報(bào)文發(fā)送時(shí),應(yīng)用程序通過(guò)接口函數(shù)通知網(wǎng)卡硬件進(jìn)行報(bào)文發(fā)送。 從申請(qǐng)到的多片連續(xù)內(nèi)存中確定一塊連續(xù)內(nèi)存地址空間具體步驟如下將申請(qǐng)到的每一片連續(xù)內(nèi)存的首地址(實(shí)際上是以數(shù)值形式表示)存儲(chǔ)到地址數(shù)組,地址數(shù)組分為低端地址數(shù)組和高端地址數(shù)組,首地址小于4G的存儲(chǔ)到低端地址數(shù)組,首地址大于或等于4G的存儲(chǔ)到高端地址數(shù)組;將地址數(shù)組中的連續(xù)內(nèi)存的首地址根據(jù)大小進(jìn)行排序,對(duì)首地址進(jìn)行排序的目的是便于確定一塊連續(xù)內(nèi)存地址空間,因?yàn)樗暾?qǐng)的每片連續(xù)內(nèi)存大小是一樣的,每個(gè)首地址對(duì)應(yīng)一片連續(xù)內(nèi)存,在需要確定的連續(xù)內(nèi)存地址空間的大小確定了之后,也就確定了所需要的連續(xù)內(nèi)存的片數(shù);在低端地址數(shù)組中根據(jù)排序后首地址確定一塊連續(xù)內(nèi)存地址空間。 在確定了連續(xù)內(nèi)存地址空間之后,將需要用到的連續(xù)內(nèi)存地址空間的首地址及大小保存至網(wǎng)卡驅(qū)動(dòng)程序中,并按照頁(yè)面大小將連續(xù)內(nèi)存地址空間標(biāo)記為保留頁(yè)面,并且將將其他申請(qǐng)的未使用的內(nèi)存釋放。在確定連續(xù)內(nèi)存地址空間時(shí)首先選擇在低端地址數(shù)組中確定,只有當(dāng)?shù)投说刂窋?shù)組對(duì)應(yīng)的全部連續(xù)內(nèi)存仍不足時(shí)才繼續(xù)選擇在高端地址數(shù)組中確定。由于Linux內(nèi)核針對(duì)高端內(nèi)存區(qū)域,需要建立映射表來(lái)完成物理地址和虛擬地址之間的映射。軟、硬件都需要直接對(duì)連續(xù)內(nèi)存地址空間進(jìn)行操作,因此低端數(shù)組能更好地滿足需求。 當(dāng)然在其他的實(shí)施例中,也可以在多片連續(xù)內(nèi)存的首地址存儲(chǔ)到地址數(shù)組過(guò)程中,邊進(jìn)行存儲(chǔ),邊進(jìn)行排序,排序不是等到存儲(chǔ)結(jié)束之后才進(jìn)行。過(guò)程雖然稍有差異,但效
8果是一樣的,都可以方便確定連續(xù)內(nèi)存地址空間。 而在另外一個(gè)實(shí)施例中,從申請(qǐng)到的連續(xù)內(nèi)存中確定一塊連續(xù)內(nèi)存地址空間的具體步驟包括將連續(xù)內(nèi)存作為報(bào)文DMA緩沖區(qū),將報(bào)文DMA緩沖區(qū)的首地址和尾地址寫入網(wǎng)卡相關(guān)寄存器中。網(wǎng)卡相關(guān)寄存器是64位大小的寄存器。 參見圖5所示,本實(shí)施例的零拷貝網(wǎng)絡(luò)報(bào)文接收裝置包括申請(qǐng)模塊410,用于在網(wǎng)卡驅(qū)動(dòng)程序中申請(qǐng)多塊連續(xù)內(nèi)存;確定模塊420,用于從申請(qǐng)模塊410所申請(qǐng)到的多片連續(xù)內(nèi)存中確定一塊連續(xù)內(nèi)存地址空間;以及接收模塊430,用于使用確定模塊420確定的連續(xù)內(nèi)存地址空間進(jìn)行網(wǎng)絡(luò)報(bào)文接收。 其中,確定模塊420具體包括地址數(shù)組模塊420-1,用于存儲(chǔ)從申請(qǐng)模塊410申請(qǐng)到的連續(xù)內(nèi)存的首地址;排序模塊420-2,用于對(duì)首地址進(jìn)行排序;以及查找模塊420-3,用于查找連續(xù)內(nèi)存地址空間。 申請(qǐng)模塊410在網(wǎng)卡驅(qū)動(dòng)程序中申請(qǐng)?zhí)囟ù笮〉倪B續(xù)內(nèi)存直至剩余的內(nèi)存空間不足申請(qǐng)。 在確定模塊420中,地址數(shù)組模塊420-1儲(chǔ)存申請(qǐng)到的多片連續(xù)內(nèi)存的每一片連續(xù)內(nèi)存的首地址,排序模塊420-2對(duì)地址數(shù)組模塊420-1中的首地址根據(jù)大小進(jìn)行排序,查找模塊420-3根據(jù)用戶指定的接收?qǐng)?bào)文DMA緩沖區(qū)的大小在地址數(shù)組模塊420-1中查找一片或多片連續(xù)內(nèi)存作為連續(xù)地址內(nèi)存空間,連續(xù)地址內(nèi)存空間大于或等于用戶指定的接收?qǐng)?bào)文DMA緩沖區(qū)的大小。 因?yàn)楸景l(fā)明的零拷貝網(wǎng)絡(luò)報(bào)文接收方法和裝置都是在網(wǎng)卡驅(qū)動(dòng)程序中申請(qǐng)連續(xù)內(nèi)存,接收的數(shù)據(jù)報(bào)文連續(xù)存儲(chǔ)在報(bào)文DMA緩沖區(qū)中,所以不需要將用戶空間內(nèi)存地址按頁(yè)面大小轉(zhuǎn)換成DMA操作所需的物理地址,因此網(wǎng)卡硬件在進(jìn)行DMA操作時(shí)不受頁(yè)面大小限制,這樣即使進(jìn)行大流量64字節(jié)短數(shù)據(jù)報(bào)文接收也不會(huì)出現(xiàn)報(bào)文丟棄的情況,而且網(wǎng)卡驅(qū)動(dòng)程序不需要采用中斷或輪詢方式接收數(shù)據(jù)報(bào)文,不占用CUP資源。
以上所述僅為本發(fā)明的優(yōu)選實(shí)施例而已,并不用于限制本發(fā)明,對(duì)于本領(lǐng)域的技術(shù)人員來(lái)說(shuō),本發(fā)明可以有各種更改和變化。凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。
權(quán)利要求
一種零拷貝網(wǎng)絡(luò)報(bào)文發(fā)送方法,其特征在于,包括下列步驟使用內(nèi)存分配函數(shù)在網(wǎng)卡驅(qū)動(dòng)程序中不斷地申請(qǐng)?zhí)囟ù笮〉倪B續(xù)內(nèi)存直至所述網(wǎng)卡驅(qū)動(dòng)程序中空閑的內(nèi)存空間不足夠申請(qǐng);從申請(qǐng)到的所述連續(xù)內(nèi)存中確定一塊連續(xù)內(nèi)存地址空間;以及使用所述連續(xù)內(nèi)存地址空間進(jìn)行網(wǎng)絡(luò)報(bào)文發(fā)送。
2. 根據(jù)權(quán)利要求1所述的發(fā)送方法,其特征在于,所述從申請(qǐng)到的所述連續(xù)內(nèi)存中確 定一塊連續(xù)內(nèi)存地址空間的具體步驟包括將申請(qǐng)到的每片連續(xù)內(nèi)存的首地址存儲(chǔ)到地址數(shù)組; 將所述地址數(shù)組中的所述連續(xù)內(nèi)存的所述首地址根據(jù)大小進(jìn)行排序; 在所述地址數(shù)組中根據(jù)排序后的所述首地址確定一塊所述連續(xù)內(nèi)存地址空間。
3. 根據(jù)權(quán)利要求2所述的發(fā)送方法,其特征在于,所述特定大小是指所述內(nèi)存分配函 數(shù)所能申請(qǐng)的連續(xù)內(nèi)存的最大值;所述連續(xù)內(nèi)存地址空間大于或等于用戶指定的發(fā)送報(bào)文 DMA緩沖區(qū)的大小;所述地址數(shù)組包括用于存儲(chǔ)小于4G的首地址的低端地址數(shù)組和用于存 儲(chǔ)4G以上的首地址的高端地址數(shù)組;在確定所述連續(xù)內(nèi)存地址空間時(shí)首先選擇在所述低 端地址數(shù)組中進(jìn)行。
4. 根據(jù)權(quán)利要求2或3所述的發(fā)送方法,其特征在于,在確定了所述連續(xù)內(nèi)存空間之后 將所述連續(xù)內(nèi)存地址空間的首地址及大小保存至所述網(wǎng)卡驅(qū)動(dòng)程序中,并按照頁(yè)面大小將 所述連續(xù)內(nèi)存地址空間標(biāo)記為保留頁(yè)面,將其他申請(qǐng)的未使用的所述連續(xù)內(nèi)存釋放。
5. —種零拷貝網(wǎng)絡(luò)報(bào)文發(fā)送裝置,其特征在于,包括 申請(qǐng)模塊,用于在網(wǎng)卡驅(qū)動(dòng)程序中申請(qǐng)連續(xù)內(nèi)存;確定模塊,用于從申請(qǐng)到的所述連續(xù)內(nèi)存中確定一塊連續(xù)內(nèi)存地址空間;以及 發(fā)送模塊,用于使用所述連續(xù)內(nèi)存地址空間進(jìn)行網(wǎng)絡(luò)報(bào)文發(fā)送。
6. 根據(jù)權(quán)利要求5所述的發(fā)送裝置,其特征在于,所述確定模塊包括地址數(shù)組模塊, 用于存儲(chǔ)申請(qǐng)到的所述連續(xù)內(nèi)存的首地址;排序模塊,用于對(duì)所述首地址進(jìn)行排序;以及 查找模塊,用于查找所述連續(xù)內(nèi)存地址空間。
7. —種零拷貝網(wǎng)絡(luò)報(bào)文接收方法,其特征在于,包括下列步驟使用內(nèi)存分配函數(shù)在網(wǎng)卡驅(qū)動(dòng)程序中不斷地申請(qǐng)?zhí)囟ù笮〉倪B續(xù)內(nèi)存直至所述網(wǎng)卡 驅(qū)動(dòng)程序中空閑的內(nèi)存空間不足夠申請(qǐng);從申請(qǐng)到的所述連續(xù)內(nèi)存中確定一塊連續(xù)內(nèi)存地址空間;以及 使用所述連續(xù)內(nèi)存地址空間進(jìn)行網(wǎng)絡(luò)報(bào)文接收。
8. 根據(jù)權(quán)利要求7所述的接收方法,其特征在于,所述從申請(qǐng)到的所述連續(xù)內(nèi)存中確 定一塊連續(xù)內(nèi)存地址空間的具體步驟包括將申請(qǐng)到的每片連續(xù)內(nèi)存的首地址存儲(chǔ)到地址數(shù)組; 將所述地址數(shù)組中的所述連續(xù)內(nèi)存的所述首地址根據(jù)大小進(jìn)行排序; 在所述地址數(shù)組中根據(jù)排序后的所述首地址確定一塊所述連續(xù)內(nèi)存地址空間。
9. 根據(jù)權(quán)利要求7所述的接收方法,其特征在于,所述從申請(qǐng)到的所述連續(xù)內(nèi)存中確 定一塊連續(xù)內(nèi)存地址空間的具體步驟包括將所述連續(xù)內(nèi)存作為報(bào)文DMA緩沖區(qū),以及將所 述報(bào)文DMA緩沖區(qū)的首地址和尾地址寫入網(wǎng)卡相關(guān)寄存器中。
10. 根據(jù)權(quán)利要求8所述的接收方法,其特征在于,所述特定大小是指所述內(nèi)存分配函數(shù)所能申請(qǐng)的連續(xù)內(nèi)存的最大值;所述連續(xù)內(nèi)存地址空間大于或等于用戶指定的接收?qǐng)?bào)文 DMA緩沖區(qū)的大??;所述地址數(shù)組包括用于存儲(chǔ)小于4G的首地址的低端地址數(shù)組和用于存 儲(chǔ)4G以上的首地址的高端地址數(shù)組;在確定所述連續(xù)內(nèi)存地址空間時(shí)首先選擇在所述低 端地址數(shù)組中進(jìn)行。
11. 根據(jù)權(quán)利要求8至IO之一所述的接收方法,其特征在于,在確定了所述連續(xù)內(nèi)存 空間之后將所述連續(xù)內(nèi)存地址空間的首地址及大小保存至所述網(wǎng)卡驅(qū)動(dòng)程序中,并按照頁(yè) 面大小將所述連續(xù)內(nèi)存地址空間標(biāo)記為保留頁(yè)面,將其他申請(qǐng)的未使用的所述連續(xù)內(nèi)存釋 放。
12. —種零拷貝網(wǎng)絡(luò)報(bào)文接收裝置,其特征在于,包括 申請(qǐng)模塊,用于在網(wǎng)卡驅(qū)動(dòng)程序中申請(qǐng)連續(xù)內(nèi)存;確定模塊,用于從申請(qǐng)到的所述連續(xù)內(nèi)存中確定一塊連續(xù)內(nèi)存地址空間;以及 接收模塊,用于使用所述連續(xù)內(nèi)存地址空間進(jìn)行網(wǎng)絡(luò)報(bào)文接收。
13. 根據(jù)權(quán)利要求12所述的接收裝置,其特征在于,所述確定模塊包括地址數(shù)組模 塊,用于存儲(chǔ)申請(qǐng)到的所述連續(xù)內(nèi)存的首地址;排序模塊,用于對(duì)所述首地址進(jìn)行排序;以 及查找模塊,用于查找所述連續(xù)內(nèi)存地址空間。
全文摘要
本發(fā)明提供一種零拷貝網(wǎng)絡(luò)報(bào)文發(fā)送、接收方法和裝置,其中發(fā)送方法包括下列步驟使用內(nèi)存分配函數(shù)在網(wǎng)卡驅(qū)動(dòng)程序中不斷地申請(qǐng)?zhí)囟ù笮〉倪B續(xù)內(nèi)存直至網(wǎng)卡驅(qū)動(dòng)程序中空閑的內(nèi)存空間不足夠申請(qǐng);從申請(qǐng)到的連續(xù)內(nèi)存中確定一塊連續(xù)內(nèi)存地址空間;使用連續(xù)內(nèi)存地址空間進(jìn)行網(wǎng)絡(luò)報(bào)文發(fā)送。本發(fā)明的發(fā)送方法通過(guò)在網(wǎng)卡驅(qū)動(dòng)程序中申請(qǐng)連續(xù)內(nèi)存,發(fā)送的數(shù)據(jù)報(bào)文連續(xù)存儲(chǔ)在報(bào)文DMA緩沖區(qū)中,因此網(wǎng)卡硬件在進(jìn)行DMA操作時(shí)不受頁(yè)面大小限制,網(wǎng)卡不需要采用中斷方式通知網(wǎng)卡驅(qū)動(dòng)程序數(shù)據(jù)報(bào)文發(fā)送完成的情況,不占用CPU資源。
文檔編號(hào)H04L12/56GK101707565SQ200910242100
公開日2010年5月12日 申請(qǐng)日期2009年12月4日 優(yōu)先權(quán)日2009年12月4日
發(fā)明者歷軍, 李永成, 聶華, 邵宗有 申請(qǐng)人:曙光信息產(chǎn)業(yè)(北京)有限公司