專利名稱:一種零拷貝網(wǎng)絡報文發(fā)送方法
技術領域:
本發(fā)明涉及一種計算機網(wǎng)絡數(shù)據(jù)發(fā)送方法,特別是涉及一種把內(nèi)存直接映射為網(wǎng)卡DMA緩沖區(qū)的零拷貝網(wǎng)絡報文發(fā)送方法。
技術背景現(xiàn)有技術的計算機操作系統(tǒng)使用的是分層思想,網(wǎng)卡驅動在內(nèi)核層運行, 給網(wǎng)卡分配報文緩沖區(qū),發(fā)送報文時通過軟中斷處理報文緩沖區(qū)與應用數(shù)據(jù)區(qū) 中的數(shù)據(jù),而在軟中斷處理中,是通過協(xié)議棧來實現(xiàn)數(shù)據(jù)傳遞的,所以這種網(wǎng) 絡數(shù)據(jù)發(fā)送方式,雖然保證了一般操作系統(tǒng)上的通用性,但由于現(xiàn)有技術的數(shù) 據(jù)發(fā)送過程需通過內(nèi)核發(fā)送,而不是用戶內(nèi)存與網(wǎng)絡直接發(fā)送,所以對要求高 速發(fā)送的高速網(wǎng)上的應用來說,現(xiàn)有技術已不能滿足應用的需要。發(fā)明內(nèi)容本發(fā)明針對現(xiàn)有技術中,網(wǎng)卡傳送報文要經(jīng)過內(nèi)核協(xié)議??截惖接脩艨?間,致使發(fā)包速度低、浪費系統(tǒng)資源,無法滿足高速網(wǎng)應用對數(shù)據(jù)拷貝的速 度要求的問題,提供了一種使應用能夠直接訪問網(wǎng)卡DMA緩沖區(qū),從而極大 提高網(wǎng)絡數(shù)據(jù)發(fā)送速度,滿足高速網(wǎng)應用的零拷貝方法。 為了實現(xiàn)上述發(fā)明目的,本發(fā)明采用下述技術方案 一種零拷貝網(wǎng)絡報文發(fā)送方法,其中,所述方法包括如下操作步驟A、應 用程序調(diào)用接口庫提供的函數(shù)打開設備接口; B、打開設備接口函數(shù)在用戶空間 內(nèi)存中申請一 片連續(xù)的內(nèi)存作為報文緩沖區(qū),并把緩沖區(qū)首地址傳給內(nèi)核驅動; C、內(nèi)核驅動根據(jù)緩沖區(qū)首地址及緩沖區(qū)大小,構造緩沖區(qū)控制結構,并把控制 結構的物理地址傳給接口函數(shù),所述結構包括報文緩沖區(qū)隊列的信息及隊列中 每個緩沖區(qū)的物理地址;D、接口函數(shù)根據(jù)緩沖區(qū)控制結構的地址,通過內(nèi)存映
射得到緩沖區(qū)控制結構中的信息;E、網(wǎng)卡驅動程序從緩沖區(qū)隊列中取空閑緩沖區(qū)作為發(fā)送報文的DMA緩沖區(qū),并把發(fā)送的報文數(shù)據(jù)不經(jīng)內(nèi)核空間直接DMA 傳送到用戶內(nèi)存中的報文發(fā)送緩沖區(qū)中;F、應用程序處理用戶內(nèi)存中報文發(fā)送 緩沖區(qū)中的報文數(shù)據(jù)。一種優(yōu)選的零拷貝網(wǎng)絡報文發(fā)送方法,其中,所述步驟B中的報文發(fā)送緩 沖區(qū)隊列的長度由參數(shù)指定,每個緩沖區(qū)的大小為2KB,為保證在用戶空間申 請的緩沖區(qū)位于連續(xù)的內(nèi)存頁面上,接口庫函數(shù)申請的內(nèi)存為共享內(nèi)存,所述 步驟B中的具體操作步驟為Bl、接口庫函數(shù)申請共享緩沖區(qū),并連接到共享 緩沖區(qū);B2、接口庫函數(shù)把共享緩沖區(qū)的首地址通過系統(tǒng)調(diào)用傳給驅動。一種更進一步優(yōu)選的零拷貝網(wǎng)絡報文發(fā)送方法,其中,所述步驟C的具體 操作步驟為Cl、內(nèi)核驅動根據(jù)整個緩沖區(qū)隊列的大小計算需要的緩沖區(qū)控制 結構的大??;C2、內(nèi)核驅動申請連續(xù)的頁面來構造緩沖區(qū)隊列控制結構;C3、 內(nèi)核驅動計算^^文隊列中每個緩沖區(qū)的物理地址,并將所述地址保存在一張物 理地址表中以便DMA使用;C4、內(nèi)核驅動計算報文緩沖區(qū)隊列控制結構的物 理地址,并將所述地址傳給應用接口庫函數(shù)。一種更進一步優(yōu)選的零拷貝網(wǎng)絡報文發(fā)送方法,其中,所述步驟D的具體 操作步驟為Dl、用戶接口庫函數(shù)從系統(tǒng)調(diào)用返回的數(shù)據(jù)結構中獲得內(nèi)核驅動 中構造的緩沖區(qū)隊列控制結構的物理地址;D2、用戶接口庫函數(shù)打開內(nèi)存設備 文件;D3、用戶接口庫函數(shù)通過系統(tǒng)調(diào)用把內(nèi)核中的緩沖區(qū)控制結構映射到自 己的地址空間。一種更進一步優(yōu)選的零拷貝網(wǎng)絡報文發(fā)送方法,其中,所述步驟E的具體 操作步驟為El、網(wǎng)卡驅動在給網(wǎng)卡分配畫A緩沖區(qū)的時候不從系統(tǒng)協(xié)議棧中 分配緩沖區(qū),而是根據(jù)零拷貝緩沖區(qū)的控制結構,從用戶空間的緩沖隊列中取 出空閑緩沖區(qū)作DMA使用;E2、網(wǎng)卡把報文通過DMA方式寫入緩沖區(qū)后發(fā)中斷 給驅動,驅動把應用的發(fā)包隊列中的報文放入緩沖區(qū)。本發(fā)明的上述技術方案,由于采用了直接訪問網(wǎng)卡函A緩沖區(qū)的零拷貝
方法,可滿足高速網(wǎng)應用對數(shù)據(jù)發(fā)送的速度要求,與現(xiàn)有網(wǎng)絡數(shù)據(jù)傳送技術 相比,進一步節(jié)省了系統(tǒng)資源;由于引入了內(nèi)存鏡像連接技術,因此用戶程 序可以直接訪問內(nèi)核空間的數(shù)據(jù),甚至可以直接訪問物理設備內(nèi)存中的數(shù) 據(jù),從而為應用提供了靈活、方便的數(shù)據(jù)傳送機制,為開發(fā)人員提供了更廣泛的開發(fā)環(huán)境;本發(fā)明的數(shù)據(jù)發(fā)送(拷貝)是在用戶空間申請內(nèi)存進行的, 由于在拷貝過程中,可直接映射物理內(nèi)存,從而避免了新增內(nèi)核模塊帶來的 不穩(wěn)定性;本發(fā)明的數(shù)據(jù)傳送(拷貝)是在用戶空間申請內(nèi)存進行的,因此 可以構造大空間的數(shù)據(jù)接收緩沖區(qū),甚至可以達到GB級;本發(fā)明在國家網(wǎng) 絡信息安全中心,在主干網(wǎng)上測試為進行報文分析而對專有應用發(fā)送報文, 與現(xiàn)有技術相比,報文傳輸速度大大提高,比如在intel82546千兆網(wǎng)卡上, 經(jīng)過協(xié)議棧的發(fā)送64字節(jié)的報文,速度最高為每秒接收270000包,占用 80%以上的cpu;但是用零拷貝方法發(fā)送報文,速度可以達到每秒710000 包,占用cpu不到10% 。以下結合附圖對本發(fā)明做進一步詳細說明。
圖1為本發(fā)明操作步驟示意圖; 圖2為本發(fā)明步驟B的具體操作過程示意圖; 圖3為本發(fā)明步驟C的具體操作過程示意圖; 圖4為本發(fā)明步驟D的具體操作過程示意圖; 圖5為本發(fā)明步驟E的具體操作過程示意圖。
具體實施方式
在本發(fā)明上述技術方案的設計思想下,本發(fā)明可以有多種,下面通過具體 實施例予以i兌明。 實施例一圖1為本發(fā)明操作步驟示意圖。在linux操作環(huán)境中,如圖1所示,本發(fā)
明執(zhí)行如下操作步驟A、 應用程序調(diào)用接口庫提供的打開設備函數(shù)。在本步驟中,首先打開網(wǎng)卡 設備,確定DMA緩存大小及分配給發(fā)送隊列的百分比,設置接收模式、發(fā)送模 式;以上操作成功則返回網(wǎng)卡設備ID。B、 打開設備接口函數(shù)程序在用戶空間內(nèi)存中申請一片連續(xù)的內(nèi)存作為報文 緩沖區(qū)。并把緩沖區(qū)首地址傳給內(nèi)核驅動。在本步驟中,檢查系統(tǒng)初始設置的最大共享內(nèi)存值,若請求內(nèi)存值大于 系統(tǒng)默認共享內(nèi)存值,則對系統(tǒng)默認內(nèi)存值進行修改。根據(jù)所需的內(nèi)存大小 來分配共享內(nèi)存,成功返回內(nèi)存的起始地址后,就可以對內(nèi)存進行保存數(shù)據(jù) 或鎖定操作。在使用完內(nèi)存后,將此內(nèi)存歸還給系統(tǒng)。C、 內(nèi)核驅動根據(jù)緩沖區(qū)首地址和緩沖區(qū)大小等相關參數(shù),構造緩沖區(qū)控制 結構,其中包括報文緩沖區(qū)隊列的信息,隊列中每個緩沖區(qū)的物理地址等。并 把控制結構的物理地址傳給接口函數(shù)。在本步驟中,驅動程序會申請一塊內(nèi)存,作為全局的控制句柄,成員包 括描述發(fā)送和接收報文的隊列,此隊列由空閑的接收隊列、空閑的傳輸隊列、 緩存數(shù)據(jù)報的接收隊列及緩存數(shù)據(jù)報的發(fā)送隊列組成;描述驅動工作模式的 變量,工作模式包含正常模式和直接拷貝模式;用于進程同步及互斥的變量 等??刂凭浔M行初始化后,把用戶空間中發(fā)送和接收報文地址區(qū)域分割成 若干數(shù)據(jù)塊,將每一塊的首地址轉換成內(nèi)核空間的物理地址,即匿A操作 所需的地址,存儲在控制句柄的隊列結構中。D、 接口函數(shù)根據(jù)緩沖區(qū)控制結構的地址,通過內(nèi)存映射得到緩沖區(qū)控制結構。本實施例中通過映射緩存句柄的物理地址到用戶空間的虛擬地址實現(xiàn)以上操作。到這里為止,內(nèi)核驅動和用戶接口函數(shù)就都能拿到緩沖區(qū)的控制結構中 的信息了。E、 網(wǎng)卡驅動程序從緩沖區(qū)隊列中取空閑緩沖區(qū)作為發(fā)送報文的DMA緩沖 區(qū),可以把發(fā)送的報文數(shù)據(jù)不經(jīng)內(nèi)核空間直接DMA傳送到用戶內(nèi)存中的報文發(fā) 送援沖區(qū)中;F、 應用程序處理用戶內(nèi)存中報文發(fā)送緩沖區(qū)中的報文數(shù)據(jù)。 實施例二本實施例與實施例一的不同之處在于,本發(fā)明所述步驟B中的報文接收 緩沖區(qū)隊列的長度可以由參數(shù)指定,每個緩沖區(qū)的大小為2KB,為保證在用戶 空間申請的緩沖區(qū)位于連續(xù)的內(nèi)存頁面上,接口庫函數(shù)申請的內(nèi)存為共享內(nèi) 存,因為在linux搡作系統(tǒng)中,共享內(nèi)存位于連續(xù)的物理頁面上。具體操作步 驟如圖2所示,為Bl、接口庫函數(shù)申請共享緩沖區(qū),并連接到共享緩沖區(qū)。B2、接口庫函數(shù)把共享緩沖區(qū)的首地址通過ioctl系統(tǒng)調(diào)用傳給驅動。實施例三本實施例與實施例二的不同之處在于,本發(fā)明所述步驟C的具體操作步 驟如圖3所示,為Cl、內(nèi)核驅動根據(jù)整個緩沖區(qū)隊列的大小計算需要的緩沖區(qū)控制結構的大小。C2、內(nèi)核驅動申請連續(xù)的頁面來構造緩沖區(qū)隊列控制結構。 C3、內(nèi)核驅動計算隊列中每個緩沖區(qū)的物理地址,保存在一張物理地址 表中以便DMA使用。C4、內(nèi)核驅動計算緩沖區(qū)隊列控制結構的物理地址,傳給應用接口庫函數(shù)。實施例四本實施例與實施例三的不同之處在于,本發(fā)明所述步驟D的具體操作步 驟如圖4所示,為Dl 、用戶接口庫函數(shù)從系統(tǒng)調(diào)用返回數(shù)據(jù)結構中獲得內(nèi)核驅動中構造的 緩沖區(qū)隊列控制結構的物理地址。D2、用戶接口庫函數(shù)打開內(nèi)存設備文件/dev/mem。D3 、用戶接口庫函數(shù)通過系統(tǒng)調(diào)用mmap把內(nèi)核中的緩沖區(qū)控制結構映射 到自己的地址空間。實施例五本實施例與實施例四的不同之處在于,本發(fā)明所述步驟E的具體操作步 驟如圖5所示,為El 、網(wǎng)卡驅動在給網(wǎng)卡分配DMA緩沖區(qū)的時候不從系統(tǒng)協(xié)議棧中分配緩 沖區(qū),而是根據(jù)零拷貝緩沖區(qū)的控制結構,從用戶空間的緩沖隊列中取出空閑 緩沖區(qū)作DMA使用;E2、網(wǎng)卡把報文通過DMA方式寫入緩沖區(qū)后發(fā)中斷給驅動,驅動把應用 的發(fā)包隊列中的報文放入緩沖區(qū)。最后應當說明的是以上實施例僅用以說明本發(fā)明的技術方案而非對其限 制,盡管參照上述實施例對本發(fā)明進行了詳細的說明,所屬領域的普通技術人員應當理解依然可以對本發(fā)明的具體實施方式
進行修改或者等同替換,而未 脫離本發(fā)明精神和范圍的任何修改或者等同替換,其均應涵蓋在本發(fā)明的權利 要求范圍當中。
權利要求
1、一種零拷貝網(wǎng)絡報文發(fā)送方法,其中,所述方法包括如下操作步驟A、應用程序調(diào)用接口庫提供的函數(shù)打開設備接口;B、打開設備接口函數(shù)在用戶空間內(nèi)存中申請一片連續(xù)的內(nèi)存作為報文緩沖區(qū),并把緩沖區(qū)首地址傳給內(nèi)核驅動;C、內(nèi)核驅動根據(jù)緩沖區(qū)首地址及緩沖區(qū)大小,構造緩沖區(qū)控制結構,并把控制結構的物理地址傳給接口函數(shù),所述結構包括報文緩沖區(qū)隊列的信息及隊列中每個緩沖區(qū)的物理地址;D、接口函數(shù)根據(jù)緩沖區(qū)控制結構的地址,通過內(nèi)存映射得到緩沖區(qū)控制結構中的信息;E、網(wǎng)卡驅動程序從緩沖區(qū)隊列中取空閑緩沖區(qū)作為發(fā)送報文的DMA緩沖區(qū),并把發(fā)送的報文數(shù)據(jù)不經(jīng)內(nèi)核空間直接DMA傳送到用戶內(nèi)存中的報文發(fā)送緩沖區(qū)中;F、應用程序處理用戶內(nèi)存中報文發(fā)送緩沖區(qū)中的報文數(shù)據(jù)。
2.如權利要求l所述的零拷貝網(wǎng)絡報文發(fā)送方法,其中,所述步驟B中的 報文發(fā)送緩沖區(qū)隊列的長度由參數(shù)指定,每個緩沖區(qū)的大小為2KB,為保證在 用戶空間申請的緩沖區(qū)位于連續(xù)的內(nèi)存頁面上,接口庫函數(shù)申請的內(nèi)存為共享 內(nèi)存,所述步驟B中的具體操作步驟為Bl、接口庫函數(shù)申請共享緩沖區(qū),并連接到共享緩沖區(qū); B2、接口庫函數(shù)把共享緩沖區(qū)的首地址通過系統(tǒng)調(diào)用傳給驅動。 3、如權利要求1所述的零拷貝網(wǎng)絡報文發(fā)送方法,其中,所述步驟C的具 體操作步驟為Cl、內(nèi)核驅動根據(jù)整個緩沖區(qū)隊列的大小計算需要的緩沖區(qū)控制結 構的大小;C2、內(nèi)核驅動申請連續(xù)的頁面來構造緩沖區(qū)隊列控制結構;C3、內(nèi)核驅動計算報文隊列中每個緩沖區(qū)的物理地址,并將所述地址保存在一張物理地址表中以便DMA使用;C4、內(nèi)核驅動計算報文緩沖區(qū)隊列控制結構的物理地址,并將所述 地址傳給應用接口庫函數(shù)。
3.
4、 如權利要求1所述的零拷貝網(wǎng)絡報文發(fā)送方法,其中,所述步驟D的具 體操作步驟為Dl 、用戶接口庫函數(shù)從系統(tǒng)調(diào)用返回的數(shù)據(jù)結構中獲得內(nèi)核驅動中 構造的緩沖區(qū)隊列控制結構的物理地址; D2、用戶接口庫函數(shù)打開內(nèi)存設備文件;D3、用戶接口庫函數(shù)通過系統(tǒng)調(diào)用把內(nèi)核中的緩沖區(qū)控制結構映射 到自己的地址空間。
5、 如權利要求1所述的零拷貝網(wǎng)絡報文發(fā)送方法,其中,所述步驟E的具 體操作步驟為El 、網(wǎng)卡驅動在給網(wǎng)卡分配DMA緩沖區(qū)的時候不從系統(tǒng)協(xié)議棧中 分配緩沖區(qū),而是根據(jù)零拷貝緩沖區(qū)的控制結構,從用戶空間的緩 沖隊列中取出空閑緩沖區(qū)作DMA使用;E2、網(wǎng)卡把報文通過DMA方式寫入緩沖區(qū)后發(fā)中斷給驅動,驅動 把應用的發(fā)包隊列中的報文放入緩沖區(qū)。
全文摘要
本發(fā)明公開了一種零拷貝網(wǎng)絡報文發(fā)送方法,屬于把用戶空間內(nèi)存直接映射為網(wǎng)卡DMA緩沖區(qū)的零拷貝方法領域。本發(fā)明采用如下操作步驟A.打開設備接口;B.在用戶空間內(nèi)存中申請一片報文緩沖區(qū);C.構造緩沖區(qū)控制結構;D.通過內(nèi)存映射得到緩沖區(qū)控制結構中的信息;E.把發(fā)送的報文數(shù)據(jù)直接DMA傳送到報文發(fā)送緩沖區(qū)中;F.應用程序處理報文數(shù)據(jù)。本發(fā)明適用于高速網(wǎng)上不經(jīng)過協(xié)議??截惏l(fā)送報文。
文檔編號H04L12/54GK101150487SQ20071017737
公開日2008年3月26日 申請日期2007年11月15日 優(yōu)先權日2007年11月15日
發(fā)明者劉朝輝, 軍 歷, 宇 曾, 華 聶 申請人:曙光信息產(chǎn)業(yè)(北京)有限公司