專利名稱:一種通用網(wǎng)卡非緩存的零拷貝方法及零拷貝系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種通用網(wǎng)卡非緩存的零拷貝方法及其系統(tǒng),尤其是一種在Linux平臺下,發(fā)送方的通用網(wǎng)卡非緩存的零拷貝方法及系統(tǒng)。
背景技術(shù):
現(xiàn)代網(wǎng)絡(luò)通信中,數(shù)據(jù)包的延時、吞吐量不大等問題導(dǎo)致網(wǎng)絡(luò)通信性能的下降,尤其是在高性能計(jì)算(HPC,High-performance computing)中,高性能計(jì)算通常是指使用很多處理器(作為單個機(jī)器的一部分)或者某一集群中組織的幾臺計(jì)算機(jī)的計(jì)算系統(tǒng)和環(huán)境?,F(xiàn)有許多類型的高性能計(jì)算(HPC)系統(tǒng),其范圍從標(biāo)準(zhǔn)計(jì)算機(jī)的大型集群到高度專用的硬件?,F(xiàn)有大多數(shù)基于集群的高性能計(jì)算(HPC)系統(tǒng)使用高性能網(wǎng)絡(luò)互連,比如那些來自InfiniBand或Myrinet的網(wǎng)絡(luò)互連。基本的網(wǎng)絡(luò)拓?fù)浜徒M織可以使用一個簡單的總線拓?fù)?,在性能很高的環(huán)境中,網(wǎng)狀網(wǎng)絡(luò)系統(tǒng)在主機(jī)之間提供較短的潛伏期,所以可改善總體網(wǎng)絡(luò)性能和傳輸速率。盡管網(wǎng)絡(luò)拓?fù)洹⒂布吞幚碛布诟咝阅苡?jì)算(HPC)系統(tǒng)中很重要, 但是使系統(tǒng)如此有效的核心功能是由操作系統(tǒng)和應(yīng)用軟件提供的。高性能計(jì)算(HPC)系統(tǒng)使用的是專門的操作系統(tǒng),這些操作系統(tǒng)被設(shè)計(jì)為看起來像是單個計(jì)算資源,其中有一個控制節(jié)點(diǎn),該節(jié)點(diǎn)形成了高性能計(jì)算(HPC)系統(tǒng)和客戶機(jī)之間的接口。在這些網(wǎng)絡(luò)通信中,很多計(jì)算機(jī)節(jié)點(diǎn)的網(wǎng)卡是基于TCP/IP協(xié)議來實(shí)現(xiàn)的,當(dāng)應(yīng)用程序從套接口把數(shù)據(jù)發(fā)送到網(wǎng)卡驅(qū)動程序的過程中,需要把數(shù)據(jù)拷貝很多次,這樣的話,在高性能通信的時候,數(shù)據(jù)包發(fā)送的瓶頸就出現(xiàn)了。為了從根本上解決此問題,可以采用零拷貝技術(shù),即減少數(shù)據(jù)從應(yīng)用程序到網(wǎng)絡(luò)設(shè)備傳遞過程中的拷貝次數(shù),減少系統(tǒng)調(diào)用, 實(shí)現(xiàn)CPU的零參與,徹底消除CPU在這方面的負(fù)載。零拷貝(zero-copy)所謂零拷貝是指數(shù)據(jù)包從應(yīng)用程序到網(wǎng)絡(luò)設(shè)備傳遞的過程中,減少數(shù)據(jù)拷貝次數(shù),減少系統(tǒng)調(diào)用,實(shí)現(xiàn)CPU的零參與,徹底消除CPU在這方面的負(fù)載。然而,現(xiàn)有的零拷貝技術(shù)中,有些是針對專用的以太網(wǎng)驅(qū)動,其零拷貝模塊是針對特定的某類網(wǎng)卡實(shí)現(xiàn)的,應(yīng)用范圍受到很大的限制,有些即使是針對通用的以太網(wǎng)驅(qū)動,可是,其實(shí)現(xiàn)過程是基于內(nèi)核中緩存的,它的零拷貝模塊的數(shù)據(jù)緩存區(qū)域是和用戶共享,即內(nèi)核和用戶共享一個數(shù)據(jù)區(qū)域,耗費(fèi)資源大,數(shù)據(jù)拷貝的次數(shù)沒有得到最大程度的減少,不能很好地滿足高性能計(jì)算(HPC)系統(tǒng)的需求。還有的零拷貝模塊是基于TCP/IP協(xié)議的,TCP/ IP協(xié)議是通用的以太網(wǎng)協(xié)議,由于跨越多層協(xié)議、存儲分配、保護(hù)機(jī)制等原因耗費(fèi)資源比較大。
發(fā)明內(nèi)容
為了解決上述的問題,本發(fā)明在用戶發(fā)送數(shù)據(jù)的時候采用零拷貝技術(shù),即把用戶的數(shù)據(jù)直接拷貝到驅(qū)動程序中去,然后發(fā)送,以增大網(wǎng)絡(luò)系統(tǒng)數(shù)據(jù)傳遞的吞吐量,減少網(wǎng)卡數(shù)據(jù)在從用戶空間傳遞過程中的延時。本發(fā)明提供了一種通用網(wǎng)卡非緩存的零拷貝方法,其包括以下步驟
(1)于用戶空間內(nèi)進(jìn)行內(nèi)存注冊,建立應(yīng)用程序的buffer ;(2)把應(yīng)用程序的buffer附加到新建的slibuf上;(3)經(jīng)過通用網(wǎng)卡,內(nèi)核函數(shù)把skbuf中的數(shù)據(jù)發(fā)送出去。其中步驟( 包含如下具體步驟(21)把buffer的虛擬地址轉(zhuǎn)換成物理地址;(22)把該物理地址處的內(nèi)容傳給slibuf。并且,在采用非緩存的零拷貝方式發(fā)送數(shù)據(jù)之前,具體是在步驟(1)于用戶空間內(nèi)進(jìn)行內(nèi)存注冊,建立應(yīng)用程序的buffer之后、步驟( 把應(yīng)用程序的buffer附加到新建的slAuf上之前,本發(fā)明采用MX協(xié)議為零拷貝提供數(shù)據(jù)傳遞的支持。其中于步驟(1)中,于用戶空間建立該數(shù)據(jù)緩存區(qū)域,即在用戶空間申請一塊存儲單元,并將這些存儲單元轉(zhuǎn)化成物理頁面,并用標(biāo)記標(biāo)注,將需要被發(fā)送的數(shù)據(jù)存放到了這個存儲單元上去即存儲到物理頁面上。其中步驟(2)將最后發(fā)送的數(shù)據(jù)存儲在結(jié)構(gòu)體Slcbuf中。本發(fā)明還提供了一種通用網(wǎng)卡非緩存的零拷貝系統(tǒng),包含一個運(yùn)行于內(nèi)核的零拷貝模塊,該零拷貝模塊包含處理和響應(yīng)用戶層的接收和發(fā)送的事件的發(fā)送核心模塊;鎖住被使用頁的鎖頁管理模塊;用來管理虛擬存儲器、物理存儲器的控制線路的MMU通知模塊;其中,MMU通知模塊將用戶層的發(fā)送接口傳來的虛擬地址映射為物理地址,以及提供硬件機(jī)制的內(nèi)存訪問授權(quán)。該零拷貝系統(tǒng)還包括一個零拷貝庫,該零拷貝庫設(shè)置于用戶層并提供該零拷貝模塊與用戶層的通信接口。該零拷貝庫中還實(shí)現(xiàn)了自身的MX通信協(xié)議,MX通信協(xié)議的變量是以分散的形式分布于零拷貝庫中的不同結(jié)構(gòu)體,并負(fù)責(zé)數(shù)據(jù)的傳遞與連接,零拷貝庫中的函數(shù)把正確的數(shù)據(jù)包傳遞給該零拷貝模塊。該零拷貝模塊與該零拷貝庫是通過rpm包的形式安裝于現(xiàn)有系統(tǒng),并分別運(yùn)行于內(nèi)核與用戶層中。該零拷貝庫包括發(fā)送接口以及區(qū)域管理模塊,應(yīng)用程序調(diào)用該發(fā)送接口申請用戶空間,該區(qū)域管理模塊對被申請的用戶內(nèi)存空間進(jìn)行管理。本發(fā)明是采用非緩存方式,即直接把用戶空間的數(shù)據(jù)通過一系列過程傳遞給通用網(wǎng)卡中的結(jié)構(gòu)體sWxif。由于零拷貝模塊是運(yùn)行于內(nèi)核空間的,因而零拷貝過程是發(fā)生于內(nèi)核空間,且數(shù)據(jù)非緩存區(qū)域位于用戶空間,耗費(fèi)資源??;相對于現(xiàn)有的零拷貝模塊所采用的耗費(fèi)資源較大的數(shù)據(jù)緩存區(qū)域和用戶共享的方法,本發(fā)明更適用于所有通用網(wǎng)卡,可以實(shí)現(xiàn)局域網(wǎng)內(nèi)大的吞吐量的數(shù)據(jù)傳遞,以完成高性能計(jì)算(HPC)通信的功能。
圖1為零拷貝模塊在系統(tǒng)中的布局圖。圖2為零拷貝庫中MX協(xié)議實(shí)現(xiàn)的流程圖。圖3為零拷貝系統(tǒng)的結(jié)構(gòu)圖。圖4為本發(fā)明發(fā)送方實(shí)現(xiàn)零拷貝的流程圖。
4
圖fe為本發(fā)明采用的非緩存方式。圖恥為現(xiàn)有技術(shù)采用的緩存方式。
具體實(shí)施例方式為了使本發(fā)明所采用的技術(shù)、手段及其優(yōu)點(diǎn),現(xiàn)舉優(yōu)選實(shí)施例并配合附圖詳述如后,此僅供說明之用,在專利申請上并不受此種結(jié)構(gòu)的限制。本發(fā)明主要是為了解決在通用的網(wǎng)卡驅(qū)動中數(shù)據(jù)傳輸吞吐量的問題,尤其是當(dāng)最大傳輸單元(MTU)大于或等于9000的時候,采用零拷貝技術(shù)后的數(shù)據(jù)傳輸性能會顯著提
尚ο本發(fā)明于本實(shí)施例中主要是借助由用戶空間的MX協(xié)議代替內(nèi)核空間的TCP/IP協(xié)議,實(shí)現(xiàn)從用戶空間到內(nèi)核空間的零拷貝,把應(yīng)用程序的buffer固定(即pinning)到物理頁面上。這一過程包括首先需要進(jìn)行內(nèi)存注冊,該數(shù)據(jù)緩存區(qū)域位于用戶空間,即在用戶空間內(nèi)申請一塊存儲單元,將這些存儲單元轉(zhuǎn)化成物理頁面,并用標(biāo)記標(biāo)注,將需要被發(fā)送的數(shù)據(jù)存放到這個存儲單元上去,亦即存儲到物理頁面上。然后把該應(yīng)用程序的buffer附加到新建的sWxif上,即把buffer的虛擬地址轉(zhuǎn)換成物理地址,再把物理地址的內(nèi)容傳給 sWxif。這個注冊和地址轉(zhuǎn)化的過程在Iinux里用零拷貝函數(shù)就可以實(shí)現(xiàn)了,消耗資源很小。最后,經(jīng)過通用網(wǎng)卡,內(nèi)核函數(shù)把SlAuf中的數(shù)據(jù)發(fā)送出去,也就是直接把固定在物理內(nèi)存里的buffer的數(shù)據(jù)發(fā)送出去,從而整個發(fā)送過程實(shí)現(xiàn)零拷貝,其中=Slcbuf是指Linux 中采用socket buffer作為存儲和管理數(shù)據(jù)包的數(shù)據(jù)結(jié)構(gòu),簡稱slibuf。本發(fā)明的零拷貝模塊是運(yùn)行于通用的以太網(wǎng)網(wǎng)卡驅(qū)動程序之上的,其在系統(tǒng)中的布局圖如附圖1所示。本發(fā)明主要是增加了用于實(shí)現(xiàn)本發(fā)明的非緩存方式的零拷貝方法的,且位于用戶空間的零拷貝庫11以及運(yùn)行于內(nèi)核中的零拷貝模塊12,于本實(shí)施例中,首先安裝現(xiàn)有的系統(tǒng)及驅(qū)動,當(dāng)系統(tǒng)安裝好后,再以rpm包的形式安裝零拷貝模塊12以及零拷貝庫11,并分別運(yùn)行于內(nèi)核與用戶層中,借助零拷貝庫11的支持,并與現(xiàn)有的通用以太網(wǎng)層13、以太網(wǎng)驅(qū)動模塊14以及以太網(wǎng)硬件15的配合,就可以實(shí)現(xiàn)局域網(wǎng)內(nèi)部大的吞吐量的數(shù)據(jù)傳遞,完成高性能計(jì)算(HPC)通信的功能。其中,零拷貝庫11存在于用戶層,零拷貝模塊12存在于內(nèi)核層,在1 inux系統(tǒng)調(diào)用中用戶層的庫函數(shù)會調(diào)用內(nèi)核層的函數(shù)。當(dāng)發(fā)送方要實(shí)現(xiàn)零拷貝的時候,發(fā)送方的應(yīng)用程序調(diào)用零拷貝庫11,零拷貝庫11再調(diào)用零拷貝模塊12中的函數(shù)。因此,零拷貝庫11和零拷貝模塊12的關(guān)系是調(diào)用與被調(diào)用的關(guān)系。其中,本發(fā)明中的零拷貝模塊12是針對Linux下所有以太網(wǎng)網(wǎng)卡驅(qū)動程序?qū)崿F(xiàn)的,參見圖1所示,本發(fā)明的本實(shí)施例中的零拷貝模塊12中使用的協(xié)議不是TCP/IP協(xié)議, 而是在零拷貝庫中實(shí)現(xiàn)了 MX協(xié)議,該協(xié)議是獨(dú)立于TCP/IP協(xié)議層的、是零拷貝模塊服務(wù)的專有協(xié)議,跨越的層次少,耗費(fèi)資源少,通信速度快;而且,零拷貝模塊12是運(yùn)行于內(nèi)核空間,零拷貝過程是發(fā)生于內(nèi)核空間,而數(shù)據(jù)非緩存區(qū)域位于用戶空間,耗費(fèi)資源小。其中,零拷貝庫11主要是為應(yīng)用程序的函數(shù)調(diào)用服務(wù)的,其提供零拷貝模塊與用戶層的通信接口,為用戶編程提供了通道,另外這個庫中還實(shí)現(xiàn)了自身的MX通信協(xié)議, 而不是TCP/IP協(xié)議。其中,MX協(xié)議的變量是以分散的形式分布于零拷貝庫中的不同結(jié)構(gòu)體,并負(fù)責(zé)數(shù)據(jù)的傳遞與連接,零拷貝庫11中的函數(shù)把正確的數(shù)據(jù)包傳遞給零拷貝模塊12進(jìn)行解析、處理和傳送。如附圖2所示,MX協(xié)議包括用戶空間的三個結(jié)構(gòu)體結(jié)構(gòu)體1 :struct_request,負(fù)責(zé)數(shù)據(jù)的發(fā)送和接收,結(jié)構(gòu)體2 :struct_partner,管理記錄發(fā)送方和接收方的信息,結(jié)構(gòu)體3 :StruCt_endp0int,記錄本地的網(wǎng)卡信息,通常是將結(jié)構(gòu)體1 struct_request的請求配合結(jié)構(gòu)體2 :struct_partner的參數(shù)傳遞給結(jié)構(gòu)體3 :struct_ endpoint,最后根據(jù)真實(shí)發(fā)送消息的大小來調(diào)用不同的函數(shù)類型并發(fā)送該消息,零拷貝模塊12只需處理應(yīng)用程序36和零拷貝庫11發(fā)送過來的命令消息。零拷貝庫11中實(shí)現(xiàn)的MX 協(xié)議只是負(fù)責(zé)數(shù)據(jù)包的正確發(fā)送和接收,并填充數(shù)據(jù)包的各個階段所需要的字段,最后對這些字段描述符賦值之后,讓零拷貝模塊12去解析處理。其中,零拷貝模塊12主要是實(shí)現(xiàn)了用戶空間的數(shù)據(jù)拷貝和相關(guān)設(shè)備描述符的分配等,把用戶應(yīng)用程序分配的緩存區(qū)計(jì)算成要發(fā)送給網(wǎng)卡驅(qū)動程序的頁面,然后把這些頁的地址存儲并鎖定標(biāo)記,最后把這些數(shù)據(jù)直接從用戶空間發(fā)送到網(wǎng)卡設(shè)備。附圖3是零拷貝模塊的組圖,它是以組件的形式存在于內(nèi)核中。發(fā)送接口 34指的是發(fā)送接口的API函數(shù), 負(fù)責(zé)數(shù)據(jù)的通信接口,其可以被應(yīng)用程序36所調(diào)用;區(qū)域管理模塊35用于管理申請的非緩存區(qū)域(如用戶空間);發(fā)送核心模塊31響應(yīng)發(fā)送的事件;鎖頁管理模塊33記錄哪些頁面被使用,即鎖?。籑MU通知模塊32 (內(nèi)存管理單元)是CPU(中央處理器)中用來管理虛擬存儲器、物理存儲器的控制線路,同時也負(fù)責(zé)將虛擬地址映射為物理地址,以及提供硬件機(jī)制的內(nèi)存訪問授權(quán)。具體描述來說是這樣的,在零拷貝庫11初始化的時候,調(diào)用mmapO函數(shù)映射五個空間,分別是驅(qū)動描述符、發(fā)送隊(duì)列、接收隊(duì)列、期望事件隊(duì)列和不期望事件隊(duì)列。應(yīng)用程序 36調(diào)用發(fā)送接口 34中的函數(shù)netjsendO去發(fā)送數(shù)據(jù),發(fā)送接口 34中的函數(shù)netjsend () 調(diào)用net—allocjequestO申請用戶空間。在申請用戶空間的過程中,區(qū)域管理模塊35 使用結(jié)構(gòu)體net_region_user描述用戶區(qū)域,使用結(jié)構(gòu)體net_segment_region_user描述區(qū)域中的段,使用枚舉net_status_region_user描述區(qū)域的狀態(tài),使用結(jié)構(gòu)體net_state_ pin_region_user描述區(qū)域是否被鎖住。MMU通知模塊32中調(diào)用函數(shù)net_region_segment_ add_user ()中的PAGE_ALIGN將用戶空間傳遞過來的虛擬地址轉(zhuǎn)變成物理頁,并將該物理頁納入?yún)^(qū)域的管理范圍內(nèi)。然后,發(fā)送接口 34調(diào)用net_req_isend()為內(nèi)核準(zhǔn)備數(shù)據(jù),調(diào)用ioctlO函數(shù)向內(nèi)核發(fā)送命令。在驅(qū)動程序中,鎖頁管理模塊33根據(jù)發(fā)送接口 34向內(nèi)核發(fā)送的創(chuàng)建區(qū)域的命令來調(diào)用鎖頁函數(shù),函數(shù)net_pin_full_immediate_region_user () 用來鎖住整個區(qū)域的頁,函數(shù)net_Wait_pin_parallel_region_user()用來等待鎖住區(qū)域被釋放,函數(shù)net_init_region_demand_pin_user ()用來完成區(qū)域的初始化工作,函數(shù) net_pin_demand_region_continue_user ()用來鎖住尚未被鎖住的頁,函數(shù) net_finish_ demand_region_pin_user ()表示該區(qū)域已經(jīng)完成鎖住。在零拷貝模塊12中,發(fā)送核心31調(diào)用函數(shù)net_Slib_neW()申請slibuf空間,在發(fā)送數(shù)據(jù)之前,將Slcbuf中的自定義協(xié)議填充,調(diào)用函數(shù)net_header_mac_slA ()進(jìn)行頭處理, 調(diào)用函數(shù)net_segments_fr0m_c0py()把用戶區(qū)域的數(shù)據(jù)拷貝到sWxif中,調(diào)用函數(shù)net— peer_target_set ()設(shè)置數(shù)據(jù)包的發(fā)送對(peer),最后調(diào)用net_queue_Xmit ()將數(shù)據(jù)發(fā)送出去。如附圖4所示為本發(fā)明的數(shù)據(jù)發(fā)送過程中實(shí)現(xiàn)零拷貝的流程圖,其中,MX協(xié)議為零拷貝提供數(shù)據(jù)傳遞的支持,在本實(shí)施例中是以現(xiàn)有的MX協(xié)議為例說明的,熟知該域技術(shù)的本領(lǐng)域技術(shù)人員可知,為實(shí)現(xiàn)零拷貝提供數(shù)據(jù)傳遞的支持也可以依該些需求使用其它類似的協(xié)議甚或自行定義數(shù)據(jù)傳輸協(xié)議來實(shí)施。零拷貝模塊12中的各個組成模塊在數(shù)據(jù)發(fā)送過程中的作用體現(xiàn)在當(dāng)數(shù)據(jù)發(fā)送時,首先由發(fā)送接口 34申請用戶空間,然后區(qū)域管理模塊35對被申請的用戶內(nèi)存空間進(jìn)行管理,即完成內(nèi)存注冊(步驟40) ;MMU通知模塊32將用戶buffer的虛擬地址轉(zhuǎn)化成物理地址(步驟411);鎖頁管理模塊33判斷被轉(zhuǎn)化后的物理頁面是否被鎖住,若鎖住則該物理地址被引用,否則該物理地址未被引用,即表示該物理地址聲明無效;發(fā)送核心模塊31把物理地址的內(nèi)容傳給skbuf (步驟412),這里的物理地址指的是被引用的物理地址;最后, 發(fā)送核心模塊31調(diào)用通用網(wǎng)卡的發(fā)送函數(shù)把Slcbuf中的數(shù)據(jù)發(fā)送出去(步驟42)。為了實(shí)現(xiàn)數(shù)據(jù)發(fā)送時候的零拷貝,具體需要經(jīng)過如下步驟,如附圖4所示1)內(nèi)存注冊(步驟40):內(nèi)存空間最多可分為256個區(qū)域,每個區(qū)域是由很多個段組成,一個區(qū)域最大空間是4M,用戶空間申請4M的內(nèi)存區(qū)域,為以后數(shù)據(jù)的傳送提供了空間,通過函數(shù)mmapO把這4M區(qū)域空間映射成零拷貝模塊12所需要的發(fā)送隊(duì)列、接收隊(duì)列、 期望事件隊(duì)列、不期望事件隊(duì)列和設(shè)備端點(diǎn)描述符這幾個段。每個段是由很多個物理頁面組成,這些物理頁面分為鎖住的和沒有鎖住的,用戶空間通過ioctl函數(shù)向驅(qū)動程序發(fā)送命令鎖住自己的區(qū)域,應(yīng)用程序36把用戶空間中的數(shù)據(jù)發(fā)送到這些被鎖住的頁面上,并按字節(jié)存放。這一過程的主要特點(diǎn)是數(shù)據(jù)非緩存區(qū)域位于用戶空間,即在用戶空間內(nèi)申請一塊存儲單元,將這些存儲單元轉(zhuǎn)化成物理頁面,并用標(biāo)記標(biāo)注,將需要被發(fā)送的數(shù)據(jù)存放到了這個存儲單元上去即存儲到物理頁面上;2)把應(yīng)用程序的buffer附加到新建的slibuf上(步驟41)在本實(shí)例中,包括以下兩個步驟①把buffer的虛擬地址轉(zhuǎn)換成物理地址(步驟411)通過函數(shù)獲取用戶空間的虛擬地址并計(jì)算轉(zhuǎn)變成物理地址,這個物理地址是被保存在了一個結(jié)構(gòu)體的變量中,還有該結(jié)構(gòu)體的其他相關(guān)變量記錄了該物理地址中的物理頁面使用了多少字節(jié)、鎖住頁面與否等信息。在本實(shí)施例中,虛擬地址轉(zhuǎn)變成物理頁面的過程是把從“虛擬地址”開始的“虛擬地址長度”的這么長的連續(xù)空間轉(zhuǎn)變成由頁指針去指向物理頁面的開始位置處。在這個轉(zhuǎn)變的過程中,真實(shí)的虛擬地址是被保存到了一個變量中,然后庫函數(shù)把這個變量傳遞給零拷貝模塊去處理這個被變量保存的虛擬地址。之后,零拷貝模塊就可以計(jì)算出物理頁面的大小和分布情況,最后由頁面指針指向這些連續(xù)的頁面。②把物理地址的內(nèi)容傳給slibuf (步驟412)網(wǎng)卡的驅(qū)動程序把被鎖住頁面上的內(nèi)容拷貝到sWxif這個結(jié)構(gòu)體中對應(yīng)指針的位置處。3)經(jīng)過通用網(wǎng)卡,內(nèi)核函數(shù)把skbuf中的數(shù)據(jù)發(fā)送出去(步驟42)把已經(jīng)鎖住的物理頁上的數(shù)據(jù)填充到SlAuf結(jié)構(gòu)體中去并由內(nèi)核函數(shù)把這個結(jié)構(gòu)體數(shù)據(jù)發(fā)送出去。相比于現(xiàn)有的緩存方式,如附圖恥所示,其是把用戶空間數(shù)據(jù)先存入共享區(qū)域, 再將共享區(qū)域的數(shù)據(jù)傳遞給網(wǎng)卡中的結(jié)構(gòu)體sWxif,本發(fā)明是采用非緩存方式,即直接把用戶空間的數(shù)據(jù)通過一系列過程傳遞給通用網(wǎng)卡中的結(jié)構(gòu)體sWxif,如附圖fe所示。由于零拷貝模塊12是運(yùn)行于內(nèi)核空間,因而零拷貝過程是發(fā)生于內(nèi)核空間,且數(shù)據(jù)非緩存區(qū)域位于用戶空間,耗費(fèi)資源??;相對于現(xiàn)有的零拷貝模塊12所采用的耗費(fèi)資源較大的數(shù)據(jù)緩存區(qū)域和用戶共享的方法,本發(fā)明可以實(shí)現(xiàn)局域網(wǎng)內(nèi)大的吞吐量的數(shù)據(jù)傳遞,以完成高性能計(jì)算(HPC)通信的功能。
權(quán)利要求
1.一種通用網(wǎng)卡非緩存的零拷貝方法,其特征在于包括以下步驟(1)于用戶空間內(nèi)進(jìn)行內(nèi)存注冊,建立應(yīng)用程序的buffer;(2)把應(yīng)用程序的buffer附加到新建的slibuf上;(3)經(jīng)過通用網(wǎng)卡,內(nèi)核函數(shù)把Slcbuf中的數(shù)據(jù)發(fā)送出去。
2.如權(quán)利要求1所述的方法,其特征在于步驟(2)包含步驟(21)把buffer的虛擬地址轉(zhuǎn)換成物理地址;(22)把該物理地址的內(nèi)容傳給slibuf。
3.如權(quán)利要求1所述的方法,其特征在于采用非緩存的零拷貝方式發(fā)送數(shù)據(jù)之前,采用MX協(xié)議為零拷貝提供數(shù)據(jù)傳遞的支持。
4.如權(quán)利要求1所述的方法,其特征在于其中步驟(1)中,于用戶空間建立該數(shù)據(jù)緩存區(qū)域,即在用戶空間申請一塊存儲單元,再將這些存儲單元轉(zhuǎn)化成物理頁面,并用標(biāo)記標(biāo)注,將需要被發(fā)送的數(shù)據(jù)存放到該存儲單元上,即存儲到該物理頁面上,這個物理頁面是用戶空間而非內(nèi)核空間的。
5.如權(quán)利要求1所述的方法,其特征在于其中步驟(2)將最后發(fā)送的數(shù)據(jù)存儲在結(jié)構(gòu)體skbuf中。
6.一種通用網(wǎng)卡非緩存的零拷貝系統(tǒng),包含一個運(yùn)行于內(nèi)核的零拷貝模塊,其特征在于,該零拷貝模塊包含處理和響應(yīng)用戶層的接收和發(fā)送的事件的發(fā)送核心模塊;鎖住被使用頁的鎖頁管理模塊;用來管理虛擬存儲器、物理存儲器的控制線路的MMU通知模塊;其中,MMU通知模塊將用戶層內(nèi)的發(fā)送接口傳來的虛擬地址映射為物理地址,并提供硬件機(jī)制的內(nèi)存訪問授權(quán)。
7.如權(quán)利要求6所述的通用網(wǎng)卡非緩存的零拷貝系統(tǒng),其特征在于該零拷貝系統(tǒng)還包括一個零拷貝庫,該零拷貝庫設(shè)置于用戶層并提供該零拷貝模塊與用戶層的通信接口。
8.如權(quán)利要求7所述的通用網(wǎng)卡非緩存的零拷貝系統(tǒng),其特征在于該零拷貝庫中采用MX通信協(xié)議,MX通信協(xié)議的變量是以分散的形式分布于零拷貝庫中的不同結(jié)構(gòu)體,并負(fù)責(zé)數(shù)據(jù)的傳遞與連接,該零拷貝庫中的函數(shù)把正確的數(shù)據(jù)包傳遞給該零拷貝模塊。
9.如權(quán)利要求7所述的通用網(wǎng)卡非緩存的零拷貝系統(tǒng),其特征在于該零拷貝模塊和零拷貝庫是以rpm包的形式安裝于現(xiàn)有系統(tǒng),并分別運(yùn)行于內(nèi)核與用戶層中。
10.如權(quán)利要求7所述的通用網(wǎng)卡非緩存的零拷貝系統(tǒng),其特征在于該零拷貝庫包括發(fā)送接口以及區(qū)域管理模塊,應(yīng)用程序調(diào)用該發(fā)送接口申請用戶空間,該區(qū)域管理模塊對被申請的用戶內(nèi)存空間進(jìn)行管理。
全文摘要
本發(fā)明涉及一種通用網(wǎng)卡非緩存的零拷貝方法及系統(tǒng),包括步驟(1)于用戶空間內(nèi)進(jìn)行內(nèi)存注冊,建立應(yīng)用程序的buffer;(2)把應(yīng)用程序的buffer附加到新建的skbuf上;(3)經(jīng)過通用網(wǎng)卡,內(nèi)核函數(shù)把skbuf中的數(shù)據(jù)發(fā)送出去。采用非緩存的零拷貝方式發(fā)送數(shù)據(jù)之前,采用MX協(xié)議為零拷貝提供數(shù)據(jù)傳遞的支持,在數(shù)據(jù)發(fā)送過程中采用非緩存的方式,并將最后發(fā)送的數(shù)據(jù)存儲在結(jié)構(gòu)體skbuf中。本發(fā)明的通用網(wǎng)卡非緩存的零拷貝方法,適用于所有通用網(wǎng)卡,并滿足高性能計(jì)算(HPC)系統(tǒng)的需求。
文檔編號H04L29/08GK102375789SQ201010248390
公開日2012年3月14日 申請日期2010年8月9日 優(yōu)先權(quán)日2010年8月9日
發(fā)明者蘭雨晴, 劉銘, 夏穎, 尹殷, 張永軍, 李俊麗, 李立, 楊炳文, 申騫 申請人:上海中標(biāo)軟件有限公司