[發(fā)明專利]基于Rsockets協(xié)議的零拷貝數(shù)據(jù)傳輸方法在審
| 申請?zhí)枺?/td> | 202110399487.5 | 申請日: | 2021-04-14 |
| 公開(公告)號: | CN113064846A | 公開(公告)日: | 2021-07-02 |
| 發(fā)明(設(shè)計)人: | 黃旺;劉亞萍;張碩 | 申請(專利權(quán))人: | 中南大學(xué);鵬城實驗室 |
| 主分類號: | G06F13/28 | 分類號: | G06F13/28;H04L29/06 |
| 代理公司: | 湖南企企衛(wèi)知識產(chǎn)權(quán)代理有限公司 43257 | 代理人: | 任合明 |
| 地址: | 410083 *** | 國省代碼: | 湖南;43 |
| 權(quán)利要求書: | 查看更多 | 說明書: | 查看更多 |
| 摘要: | |||
| 搜索關(guān)鍵詞: | 基于 rsockets 協(xié)議 拷貝 數(shù)據(jù)傳輸 方法 | ||
1.一種基于Rsockets協(xié)議的零拷貝數(shù)據(jù)傳輸方法,其特征在于包含以下步驟:
第一步,構(gòu)建基于Rsockets協(xié)議的零拷貝數(shù)據(jù)傳輸系統(tǒng);基于Rsockets協(xié)議的零拷貝數(shù)據(jù)傳輸系統(tǒng)由基于Rsockets協(xié)議的RDMA傳輸系統(tǒng),內(nèi)存管理模塊,內(nèi)存處理模塊,工作請求模塊組成;基于Rsockets協(xié)議的RDMA傳輸系統(tǒng)包括套接字應(yīng)用,OFED庫,OFED內(nèi)核庫以及RDMA網(wǎng)卡;發(fā)送端和接收端都安裝有基于Rsockets協(xié)議的零拷貝數(shù)據(jù)傳輸系統(tǒng);
基于Rsockets協(xié)議的RDMA傳輸系統(tǒng)中,套接字應(yīng)用和OFED庫安裝在用戶空間,Rsockets協(xié)議屬于OFED庫的一部分,OFED內(nèi)核庫安裝在內(nèi)核空間,RDMA網(wǎng)卡為硬件,安裝在主機的PCIE插槽內(nèi);
修改Rsockets協(xié)議中的相關(guān)函數(shù):在Rsockets協(xié)議中添加SEND發(fā)送管理函數(shù),在Rsockets協(xié)議的rsendto函數(shù)中增加調(diào)用SEND發(fā)送管理函數(shù)的功能,SEND發(fā)送管理函數(shù)負責(zé)發(fā)送工作請求模塊構(gòu)造的SEND工作請求;在Rsockets協(xié)議中添加WRITE發(fā)送管理函數(shù),在Rsockets協(xié)議的rsend函數(shù)增加調(diào)用WRITE發(fā)送管理函數(shù)的功能,WRITE發(fā)送管理函數(shù)負責(zé)發(fā)送工作請求模塊構(gòu)造的WRITE工作請求;Rsockets協(xié)議的rconnect函數(shù)、raccept函數(shù)、rsendto函數(shù),rrecvfrom函數(shù)增加調(diào)用OFED庫的注冊物理地址內(nèi)存區(qū)域函數(shù)的功能,使得具有注冊物理地址內(nèi)存區(qū)域的功能;在Rsockets協(xié)議中增加請求創(chuàng)建緩存池函數(shù),在Rsockets協(xié)議增加調(diào)用請求創(chuàng)建緩存池函數(shù)的功能,請求創(chuàng)建緩存池函數(shù)向內(nèi)存管理模塊發(fā)送“創(chuàng)建緩存池請求”;在Rsockets協(xié)議中增加請求內(nèi)存處理函數(shù),在rsend函數(shù)和rsendto函數(shù)中增加調(diào)用請求內(nèi)存處理函數(shù)的功能,請求內(nèi)存處理函數(shù)向內(nèi)存管理模塊發(fā)送“內(nèi)存處理請求”和內(nèi)存地址信息;在Rsockets協(xié)議中增加請求RDMA資源函數(shù),在rsend函數(shù)和rsendto函數(shù)增加調(diào)用請求RDMA資源函數(shù)的功能,請求RDMA資源函數(shù)向工作請求模塊發(fā)送“RDMA資源請求”;在Rsockets協(xié)議中增加判斷緩存池函數(shù),在rsend函數(shù)中增加調(diào)用判斷緩存池函數(shù)的功能,向內(nèi)存管理模塊發(fā)送“判斷緩存池長度請求”;在Rsockets協(xié)議中增加WRITE處理完成事件函數(shù),在rrecv函數(shù)增加調(diào)用WRITE處理完成事件函數(shù)的功能,負責(zé)處理WRITE工作請求的消息的接收,并向內(nèi)存管理模塊發(fā)送“內(nèi)存映射請求”;在Rsockets協(xié)議中增加SEND處理完成事件函數(shù),在rrecvfrom函數(shù)增加調(diào)用SEND處理完成事件函數(shù)的功能,負責(zé)處理SEND工作請求的消息的接收,SEND處理完成事件函數(shù)向內(nèi)存管理模塊發(fā)送“內(nèi)存映射請求”;在Rsockets協(xié)議中增加請求接收工作請求函數(shù),在rbind函數(shù)增加調(diào)用請求接收工作請求函數(shù)的功能,請求接收工作請求函數(shù)向工作請求模塊發(fā)送RDMA資源和“構(gòu)造接收工作請求”;在Rsockets協(xié)議增加獲取工作請求函數(shù),在rsend函數(shù)和rsendto函數(shù)增加調(diào)用獲取工作請求函數(shù)的功能,獲取工作請求函數(shù)向工作請求模塊發(fā)送“獲取工作請求”;
內(nèi)存管理模塊運行在用戶空間,與工作請求模塊,內(nèi)存處理模塊以及OFED庫的Rsockets協(xié)議相連,負責(zé)管理套接字應(yīng)用的發(fā)送緩存和接收緩存以及緩存池;緩存池僅用于存儲接收的數(shù)據(jù),并提供數(shù)據(jù)所在的物理地址使得套接字應(yīng)用的接收緩存可以與消息所在的物理地址建立內(nèi)存映射,直接獲取數(shù)據(jù);當(dāng)內(nèi)存管理模塊從請求創(chuàng)建緩存池函數(shù)接收到“創(chuàng)建緩存池請求”時,向內(nèi)存處理模塊發(fā)送“創(chuàng)建緩存池請求”,并從內(nèi)存處理模塊接收緩存池的物理地址,當(dāng)內(nèi)存管理模塊接收到緩存池的物理地址,向內(nèi)存管理模塊發(fā)送“建立內(nèi)存映射請求”,并從內(nèi)存處理模塊接收緩存池的虛擬地址;當(dāng)內(nèi)存管理模塊從交換緩存池地址函數(shù)接收到“交換緩存池請求”時,發(fā)送端內(nèi)存管理模塊和接受端內(nèi)存管理模塊互相交換緩存池地址信息;當(dāng)內(nèi)存管理模塊從請求內(nèi)存處理函數(shù)接收到“內(nèi)存處理請求”時,向內(nèi)存處理模塊發(fā)送“內(nèi)存處理請求”,并從內(nèi)存處理模塊接收到物理地址和頁個數(shù),向工作請求模塊返回物理地址和頁個數(shù);當(dāng)內(nèi)存管理模塊從判斷緩存池函數(shù)接收到“判斷緩存池長度請求”時,內(nèi)存管理模塊計算緩存池長度,將緩存池長度返回給rsend函數(shù);內(nèi)存管理模塊從WRITE處理完成事件函數(shù)接收到“內(nèi)存映射請求”時,向內(nèi)存處理模塊發(fā)送“建立內(nèi)存映射請求”,并從內(nèi)存處理模塊接收到套接字應(yīng)用的發(fā)送緩存的虛擬地址;當(dāng)內(nèi)存管理模塊從SEND處理完成事件函數(shù)接收到“內(nèi)存映射請求”時,向內(nèi)存處理模塊發(fā)送“建立內(nèi)存映射請求”,并從內(nèi)存處理模塊接收到套接字應(yīng)用的發(fā)送緩存的虛擬地址;
內(nèi)存處理模塊運行在Linux系統(tǒng)的內(nèi)核空間,與內(nèi)存管理模塊相連接,由兩個部分組成,一個是提供內(nèi)存處理功能的系統(tǒng)調(diào)用處理模塊,一個是提供創(chuàng)建緩存池和內(nèi)存映射功能的字符設(shè)備;系統(tǒng)調(diào)用處理模塊負責(zé)處理從內(nèi)存管理模塊接收的“內(nèi)存處理請求”,向內(nèi)存管理模塊發(fā)送物理地址和頁個數(shù);字符設(shè)備負責(zé)處理從內(nèi)存管理模塊接收的“創(chuàng)建緩存池請求”,創(chuàng)建一個緩存池,向內(nèi)存管理模塊返回緩存池的物理地址;字符設(shè)備處理從內(nèi)存管理模塊接收“建立內(nèi)存映射請求”,建立內(nèi)存映射,向內(nèi)存管理模塊傳遞與緩存池的物理地址對應(yīng)的虛擬地址;
工作請求模塊運行在用戶空間,與內(nèi)存管理模塊和Rsockets協(xié)議相連接,負責(zé)構(gòu)造對應(yīng)的工作請求,將工作請求交由Rsockets協(xié)議處理;工作請求模塊從Rsockets協(xié)議中獲取RDMA資源,從內(nèi)存管理模塊獲取內(nèi)存的物理地址和頁個數(shù),構(gòu)造基于物理地址發(fā)送的工作請求,并將基于物理地址發(fā)送的工作請求發(fā)送給Rsockets協(xié)議;當(dāng)工作請求模塊從請求接收工作請求函數(shù)收到RDMA資源和“構(gòu)造接收工作請求”時,創(chuàng)建RECEIVE工作請求,將RECEIVE工作請求發(fā)送給Rsockets協(xié)議;當(dāng)工作請求模塊從獲取工作請求函數(shù)接收到“獲取工作請求”時,創(chuàng)建工作請求結(jié)構(gòu)體數(shù)組,向rsend函數(shù)或rsendto函數(shù)發(fā)送創(chuàng)建的工作請求結(jié)構(gòu)體數(shù)組地址和數(shù)組的長度;當(dāng)工作請求模塊從請求RDMA資源函數(shù)接收到“RDMA資源請求”時,判斷工作請求模塊是否獲取到了RDMA資源,如果沒有獲取到RDMA資源,則向Rsockets協(xié)議發(fā)送“RDMA資源請求”以獲取RDMA資源;
第二步,發(fā)送端和接收端的套接字應(yīng)用向Rsockets協(xié)議發(fā)送socket請求,創(chuàng)建RDMA資源;內(nèi)存管理模塊和內(nèi)存處理模塊相互配合創(chuàng)建緩存池,建立對緩存池的內(nèi)存映射,方法是:
2.1發(fā)送端和接收端套接字應(yīng)用調(diào)用Linux系統(tǒng)的socket函數(shù),使用Rsockets協(xié)議攔截socket函數(shù),采用Rsockets協(xié)議中的rsocket函數(shù)替代socket函數(shù),rsocket函數(shù)調(diào)用請求創(chuàng)建緩存池函數(shù),請求創(chuàng)建內(nèi)存池函數(shù)向內(nèi)存管理模塊發(fā)送“創(chuàng)建緩存池請求”;
2.2內(nèi)存管理模塊收到rsocket函數(shù)的“創(chuàng)建緩存池請求”,打開內(nèi)存處理模塊的字符設(shè)備,向內(nèi)存處理模塊的字符設(shè)備傳遞“創(chuàng)建緩存池請求”;
2.3內(nèi)存處理模塊的字符設(shè)備收到“創(chuàng)建緩存池請求”后,創(chuàng)建一個物理地址連續(xù)的內(nèi)存塊作為緩存池,如果創(chuàng)建失敗則顯示“創(chuàng)建緩存池失敗”,轉(zhuǎn)3.32,如果創(chuàng)建成功,則向內(nèi)存管理模塊返回緩存池的物理地址和長度,轉(zhuǎn)2.4;
2.4內(nèi)存管理模塊初始化內(nèi)存管理結(jié)構(gòu)體,內(nèi)存管理結(jié)構(gòu)體的內(nèi)容包含緩存池物理地址首地址、緩存池虛擬地址首地址、長度、空閑長度、數(shù)據(jù)頭指針、數(shù)據(jù)尾指針,內(nèi)存管理模塊將從字符設(shè)備接收的緩存池的物理地址和長度分別存入到內(nèi)存管理結(jié)構(gòu)體的緩存池物理地址首地址和長度中;內(nèi)存管理結(jié)構(gòu)體的空閑長度初始化為內(nèi)存管理結(jié)構(gòu)體的長度,內(nèi)存管理結(jié)構(gòu)體的數(shù)據(jù)頭指針初始化為零,內(nèi)存管理結(jié)構(gòu)體的數(shù)據(jù)尾指針初始化為零;
2.5內(nèi)存管理模塊構(gòu)造“內(nèi)存映射請求”,向內(nèi)存處理模塊的字符設(shè)備發(fā)送“內(nèi)存映射請求”,請求映射緩存池物理地址;
2.6字符設(shè)備收到“建立內(nèi)存映射請求”后,根據(jù)緩存池物理地址建立內(nèi)存映射,調(diào)用Linux內(nèi)核的remap_pfn_range函數(shù)將緩存池的物理地址與Linux內(nèi)核查找的虛擬地址建立內(nèi)存映射,將與緩存池的物理地址對應(yīng)的Linux內(nèi)核查找的虛擬地址返回給內(nèi)存管理模塊,內(nèi)存管理模塊將虛擬地址首地址寫入內(nèi)存管理結(jié)構(gòu)體的緩存池虛擬地址首地址;
2.7Rsockets協(xié)議的rsocket函數(shù)根據(jù)從發(fā)送端和接收端套接字應(yīng)用調(diào)用的socket函數(shù)傳入的參數(shù)type和protocol來確認是TCP還是UDP傳輸,如果是TCP傳輸,轉(zhuǎn)2.7.1;如果是UDP傳輸,轉(zhuǎn)2.7.2;
2.7.1如果是從發(fā)送端獲取的type和protocol,說明是發(fā)送端套接字應(yīng)用,轉(zhuǎn)2.8;如果是從接收端獲取的type和protocol,說明是接收端套接字應(yīng)用,轉(zhuǎn)2.11;
2.7.2如果是從發(fā)送端獲取的type和protocol,說明是發(fā)送端套接字應(yīng)用,轉(zhuǎn)3.16;如果是從發(fā)送端獲取的type和protocol,說明是接收端套接字應(yīng)用,轉(zhuǎn)2.14;
2.8發(fā)送端套接字應(yīng)用調(diào)用Linux系統(tǒng)的connect函數(shù),使用Rsockets協(xié)議攔截connect函數(shù),采用Rsockets協(xié)議的rconnect函數(shù)替代connect函數(shù);rconnect函數(shù)調(diào)用交換緩存池地址函數(shù),交換緩存池地址函數(shù)向發(fā)送端的內(nèi)存管理模塊發(fā)送“交換緩存池請求”;
2.9發(fā)送端的內(nèi)存管理模塊從rconnect函數(shù)接收“交換緩存池請求”,內(nèi)存管理模塊將發(fā)送端的內(nèi)存管理結(jié)構(gòu)體A1的內(nèi)容發(fā)送給接收端的內(nèi)存管理模塊,并等待接收端返回接收端的內(nèi)存管理結(jié)構(gòu)體A2,若發(fā)送端內(nèi)存管理模塊接收到A2,將A2存入到發(fā)送端的第二內(nèi)存管理結(jié)構(gòu)體B1中,B1的內(nèi)容包含接收端緩存池的物理地址首地址,接收端緩存池虛擬地址首地址,長度,空閑長度,數(shù)據(jù)頭指針,數(shù)據(jù)尾指針;
2.10Rsockets協(xié)議的rconnect函數(shù)調(diào)用OFED庫的注冊物理地址內(nèi)存區(qū)域函數(shù),注冊物理地址內(nèi)存區(qū)域;轉(zhuǎn)第三步;
2.11接收端套接字應(yīng)用調(diào)用Linux系統(tǒng)的accept函數(shù),使用Rsockets協(xié)議攔截accept函數(shù),采用Rsockets協(xié)議的raccept函數(shù)替代accept函數(shù);raccept函數(shù)調(diào)用交換緩存池地址函數(shù),交換緩存池地址函數(shù)向接收端的內(nèi)存管理模塊發(fā)送“交換緩存池請求”;
2.12接收端的內(nèi)存管理模塊從raccept函數(shù)接收的“交換緩存池請求”,內(nèi)存管理模塊從發(fā)送端內(nèi)存管理模塊接收A1,將A1存入到接收端的第二內(nèi)存管理結(jié)構(gòu)體B2中,B2的內(nèi)容包含發(fā)送端緩存池物理地址首地址,發(fā)送端緩存池虛擬地址首地址,長度,空閑長度,數(shù)據(jù)頭指針,數(shù)據(jù)尾指針;接收端的內(nèi)存管理模塊將A2發(fā)送給發(fā)送端內(nèi)存管理模塊;
2.13raccept函數(shù)調(diào)用OFED庫的注冊物理地址內(nèi)存區(qū)域函數(shù),注冊物理地址內(nèi)存區(qū)域;轉(zhuǎn)3.30;
2.14接收端套接字應(yīng)用調(diào)用bind函數(shù),使用Rsockets協(xié)議攔截bind函數(shù),采用Rsockets協(xié)議的rbind函數(shù)替代bind函數(shù),rbind函數(shù)調(diào)用請求接收工作請求函數(shù),請求接收工作請求函數(shù)向工作請求模塊發(fā)送Rsockets協(xié)議的rconnect函數(shù)創(chuàng)建的RDMA資源和“構(gòu)造接收工作請求”;
2.15工作請求模塊從rbind函數(shù)接收“構(gòu)造接收工作請求”和RDMA資源,構(gòu)造RECEIVE工作請求,并調(diào)用OFED庫的ibv_post_recv函數(shù),將所有RECEIVE工作請求發(fā)布到網(wǎng)卡中;轉(zhuǎn)3.31;
第三步,發(fā)送端套接字應(yīng)用從其發(fā)送緩存發(fā)送數(shù)據(jù),內(nèi)存管理模塊和內(nèi)存處理模塊處理發(fā)送緩存后得到物理地址和頁個數(shù),工作請求模塊構(gòu)造對應(yīng)工作請求,交由RDMA網(wǎng)卡執(zhí)行工作請求將數(shù)據(jù)發(fā)送到接收端的緩存池中,接收端的內(nèi)存管理模塊將接收端套接字應(yīng)用的接收緩存與緩存池中數(shù)據(jù)的物理地址建立內(nèi)存映射,直接拿取數(shù)據(jù);數(shù)據(jù)成功到達接收端套接字應(yīng)用;方法是:
3.1發(fā)送端套接字應(yīng)用調(diào)用write或send函數(shù)發(fā)送數(shù)據(jù),使用Rsockets協(xié)議攔截write或send函數(shù),采用Rsockets協(xié)議的rsend函數(shù)替代write或send函數(shù),rsend函數(shù)調(diào)用請求內(nèi)存處理函數(shù),請求內(nèi)存處理函數(shù)向發(fā)送端的內(nèi)存管理模塊發(fā)送“內(nèi)存處理請求”,“內(nèi)存處理請求”包含所在套接字應(yīng)用發(fā)送緩存虛擬地址首地址,發(fā)送緩存的長度;
3.2發(fā)送端內(nèi)存管理模塊收到“內(nèi)存處理請求”和內(nèi)存地址信息,內(nèi)存管理模塊將內(nèi)存地址信息處理為“內(nèi)存處理請求”,向發(fā)送端的內(nèi)存處理模塊的系統(tǒng)調(diào)用處理模塊傳遞“內(nèi)存處理請求”;
3.3發(fā)送端的系統(tǒng)調(diào)用處理模塊收到“內(nèi)存處理請求”,從“內(nèi)存處理請求”中獲取到套接字應(yīng)用發(fā)送緩存的虛擬地址和長度,調(diào)用Linux內(nèi)核的get_user_pages函數(shù)處理套接字應(yīng)用的發(fā)送緩存虛擬地址和發(fā)送緩存長度,得到發(fā)送端套接字發(fā)送緩存對應(yīng)的物理地址和頁個數(shù),設(shè)置每個頁不可交換,并且每個頁是只讀,使用鏈表存儲物理地址,將存儲物理地址的鏈表和頁個數(shù)返回給發(fā)送端的內(nèi)存管理模塊;
3.4發(fā)送端的內(nèi)存管理模塊收到發(fā)送端的內(nèi)存處理模塊返回的存儲物理地址的鏈表和頁個數(shù),使用地址管理結(jié)構(gòu)體的物理地址鏈表頭指針存儲包含物理地址的鏈表的地址,地址管理結(jié)構(gòu)體的頁個數(shù)存儲從內(nèi)存處理模塊返回的頁個數(shù),地址管理結(jié)構(gòu)體包含物理地址鏈表頭指針、頁個數(shù);
3.5rsend函數(shù)調(diào)用請求RDMA資源函數(shù),請求RDMA資源函數(shù)向發(fā)送端的工作請求模塊發(fā)送“RDMA資源請求”;
3.6發(fā)送端的工作請求模塊收到“RDMA資源請求”,工作請求模塊判斷是否已經(jīng)獲取RDMA資源,如果沒有獲取RDMA資源,向請求RDMA資源函數(shù)返回“RDMA資源請求”,請求RDMA資源函數(shù)收到“RDMA資源請求”后向發(fā)送端的工作請求模塊發(fā)送RDMA資源,發(fā)送端的工作請求模塊獲取RDMA資源,轉(zhuǎn)3.7;如果已經(jīng)獲取RDMA資源,則直接轉(zhuǎn)3.7;
3.7發(fā)送端的工作請求模塊從發(fā)送端的內(nèi)存管理模塊獲取地址管理結(jié)構(gòu)體和內(nèi)存管理結(jié)構(gòu)體B1,構(gòu)造操作類型為WRITE的工作請求結(jié)構(gòu)體,如果地址管理結(jié)構(gòu)體的物理地址是連續(xù)的,轉(zhuǎn)3.8;如果地址管理結(jié)構(gòu)體的物理地址是離散的,轉(zhuǎn)3.9;
3.8發(fā)送端的工作請求模塊構(gòu)造一個WRITE工作請求結(jié)構(gòu)體數(shù)組,元素個數(shù)為1;設(shè)置工作請求結(jié)構(gòu)體元素的源地址為地址管理結(jié)構(gòu)體中的第一個物理地址,工作請求結(jié)構(gòu)體元素的發(fā)送長度為地址管理結(jié)構(gòu)體的頁個數(shù)與Linux系統(tǒng)的頁大小之積;轉(zhuǎn)3.10
3.9發(fā)送端的工作請求模塊構(gòu)造一個WRITE工作請求結(jié)構(gòu)體數(shù)組,數(shù)組元素個數(shù)為地址管理結(jié)構(gòu)體的頁個數(shù);依次將地址管理結(jié)構(gòu)體的鏈表的物理地址寫入到工作請求結(jié)構(gòu)體數(shù)組元素的源地址中,工作請求結(jié)構(gòu)體數(shù)組的每個元素的發(fā)送長度為Linux系統(tǒng)頁的大小;轉(zhuǎn)3.10;
3.10rsend函數(shù)調(diào)用獲取工作請求函數(shù),獲取工作請求函數(shù)向發(fā)送端的工作請求模塊發(fā)送“獲取工作請求”;
3.11發(fā)送端的工作請求模塊獲取“獲取工作請求”后,向rsend函數(shù)返回工作請求結(jié)構(gòu)體數(shù)組的地址和數(shù)組元素個數(shù);rsend函數(shù)接收工作請求結(jié)構(gòu)體數(shù)組地址和數(shù)組長度;
3.12rsend函數(shù)調(diào)用判斷緩存池函數(shù),向發(fā)送端的內(nèi)存管理模塊發(fā)送“判斷緩存池長度請求”;
3.13發(fā)送端的內(nèi)存管理模塊收到“判斷緩存池長度請求”后,判斷B1的空閑長度是否大于套接字應(yīng)用的發(fā)送緩存的長度,如果B1的空閑長度小于套接字應(yīng)用的發(fā)送緩存的長度,將B1的空閑長度返回給rsend函數(shù),如果B1的空閑長度大于或等于套接字應(yīng)用的發(fā)送緩存的長度,將套接字應(yīng)用的發(fā)送緩存的長度返回給rsend函數(shù);
3.14rsend函數(shù)接收到3.13返回的長度,記為rsend函數(shù)的可發(fā)送長度;調(diào)用WRITE發(fā)送管理函數(shù);
3.15WRITE發(fā)送管理函數(shù)從rsend函數(shù)獲取工作請求結(jié)構(gòu)體數(shù)組的地址、數(shù)組元素個數(shù)、可發(fā)送長度;對獲取的工作請求結(jié)構(gòu)體數(shù)組,調(diào)用OFED庫的ibv_post_send函數(shù)進行處理,具體方法如下:
3.15.1WRITE發(fā)送管理函數(shù)從工作請求結(jié)構(gòu)體數(shù)組取出元素,設(shè)置工作請求結(jié)構(gòu)體數(shù)組元素的目的地址為B1的接收端緩存區(qū)的虛擬地址首地址,判斷工作請求結(jié)構(gòu)體數(shù)組元素的發(fā)送長度是否大于可發(fā)送長度,如果大于,轉(zhuǎn)3.12;如果小于等于可發(fā)送長度,轉(zhuǎn)3.15.2;
3.15.2WRITE發(fā)送管理函數(shù)調(diào)用OFED庫的ibv_post_send函數(shù)將取出的工作請求結(jié)構(gòu)體元素發(fā)送到RDMA網(wǎng)卡;RDMA網(wǎng)卡從工作請求結(jié)構(gòu)體數(shù)組元素的源地址讀取數(shù)據(jù),并發(fā)送到工作請求結(jié)構(gòu)體數(shù)組元素的目的地址指定位置中,RDMA網(wǎng)卡發(fā)送數(shù)據(jù)的長度為工作請求結(jié)構(gòu)體元素的發(fā)送長度;
3.15.3WRITE發(fā)送管理函數(shù)將可發(fā)送長度減去工作請求結(jié)構(gòu)體元素的發(fā)送長度,將B1的接收端緩存區(qū)虛擬地址首地址加上工作請求結(jié)構(gòu)體元素的發(fā)送長度后存入B1的接收端緩存區(qū)虛擬地址首地址;轉(zhuǎn)3.15.4;
3.15.4WRITE發(fā)送管理函數(shù)判斷工作請求結(jié)構(gòu)體數(shù)組元素是否為空,如果為空,轉(zhuǎn)3.32,如果不為空,轉(zhuǎn)3.15.1;
3.16發(fā)送端套接字應(yīng)用調(diào)用Linux系統(tǒng)的sendto函數(shù),使用Rsockets協(xié)議攔截sendto函數(shù),采用Rsockets協(xié)議的rsendto函數(shù)替代sendto函數(shù),rsendto函數(shù)調(diào)用OFED庫的注冊物理地址內(nèi)存區(qū)域函數(shù),注冊物理地址內(nèi)存區(qū)域,rsendto函數(shù)調(diào)用請求內(nèi)存處理函數(shù),請求內(nèi)存處理函數(shù)向發(fā)送端的內(nèi)存管理模塊發(fā)送“內(nèi)存處理請求”,“內(nèi)存處理請求”包含所在套接字應(yīng)用發(fā)送緩存虛擬地址首地址,發(fā)送緩存的長度;
3.17發(fā)送端的內(nèi)存管理模塊收到“內(nèi)存處理請求”,向發(fā)送端的內(nèi)存處理模塊的系統(tǒng)調(diào)用處理模塊傳遞“內(nèi)存處理請求”;
3.18發(fā)送端的系統(tǒng)調(diào)用處理模塊接收“內(nèi)存處理請求”,系統(tǒng)調(diào)用處理模塊從“內(nèi)存處理請求”中獲取到套接字應(yīng)用發(fā)送緩存的虛擬地址和長度,系統(tǒng)調(diào)用處理模塊處理套接字應(yīng)用的發(fā)送緩存虛擬地址和發(fā)送緩存長度,得到對應(yīng)的物理地址和頁個數(shù),設(shè)置每個頁不可交換,并且設(shè)置每個頁是只讀,使用鏈表存儲物理地址,將存儲物理地址的鏈表和頁個數(shù)返回給發(fā)送端的內(nèi)存管理模塊;
3.20發(fā)送端的內(nèi)存管理模塊收到發(fā)送端的內(nèi)存處理模塊返回的存儲物理地址的鏈表和頁個數(shù),使用地址管理結(jié)構(gòu)體的物理地址鏈表頭指針存儲包含物理地址的鏈表的地址,地址管理結(jié)構(gòu)體的頁個數(shù)存儲從內(nèi)存處理模塊返回的頁個數(shù),地址管理結(jié)構(gòu)體包含物理地址鏈表頭指針,頁個數(shù);
3.21rsendto函數(shù)調(diào)用請求RDMA資源函數(shù),請求RDMA資源函數(shù)向發(fā)送端的工作請求模塊發(fā)送“RDMA資源請求”;
3.22發(fā)送端的工作請求模塊接收到“RDMA資源請求”,判斷是否已經(jīng)獲取RDMA資源,如果沒有獲取RDMA資源,向請求RDMA資源函數(shù)返回“RDMA資源請求”,請求RDMA資源函數(shù)收到“RDMA資源請求”,向發(fā)送端的工作請求模塊發(fā)送Rsockets協(xié)議的rsendto函數(shù)創(chuàng)建的RDMA資源,發(fā)送端的工作請求模塊獲取RDMA資源,轉(zhuǎn)3.23;如果已經(jīng)獲取RDMA資源,直接轉(zhuǎn)3.23;
3.23發(fā)送端的工作請求模塊從發(fā)送端的內(nèi)存管理模塊獲取地址管理結(jié)構(gòu)體,構(gòu)造操作類型為SEND的工作請求結(jié)構(gòu)體,如果地址管理結(jié)構(gòu)體的物理地址是連續(xù)的,轉(zhuǎn)3.24;如果地址管理結(jié)構(gòu)體的物理地址是離散的,轉(zhuǎn)3.25;
3.24發(fā)送端的工作請求模塊構(gòu)造一個SEND工作請求結(jié)構(gòu)體數(shù)組,元素個數(shù)為1;設(shè)置工作請求結(jié)構(gòu)體數(shù)組元素的源地址為地址管理結(jié)構(gòu)體中的第一個物理地址,工作請求結(jié)構(gòu)體數(shù)組元素的發(fā)送長度為地址管理結(jié)構(gòu)體的頁個數(shù)與Linux系統(tǒng)的頁大小之積;轉(zhuǎn)3.26;
3.25工作請求模塊構(gòu)造一個SEND工作請求結(jié)構(gòu)體數(shù)組,元素個數(shù)為地址管理結(jié)構(gòu)體的頁個數(shù);依次將地址管理結(jié)構(gòu)體的鏈表的物理地址寫入到工作請求結(jié)構(gòu)體數(shù)組的元素的源地址中,工作請求結(jié)構(gòu)體數(shù)組的每個元素的發(fā)送長度為Linux系統(tǒng)頁的大小;轉(zhuǎn)3.26;
3.26rsendto函數(shù)調(diào)用獲取工作請求函數(shù),獲取工作請求函數(shù)向發(fā)送端的工作請求模塊發(fā)送“獲取工作請求”;
3.27發(fā)送端的工作請求模塊獲取“獲取工作請求”,將工作請求結(jié)構(gòu)體數(shù)組的地址和元素個數(shù)給返回給rsendto函數(shù);
3.28rsendto函數(shù)接收工作請求結(jié)構(gòu)體數(shù)組地址和數(shù)組長度;rsendto函數(shù)調(diào)用SEND發(fā)送管理函數(shù);
3.29SEND發(fā)送管理函數(shù)從rsendto函數(shù)獲取工作請求結(jié)構(gòu)體數(shù)組的地址、數(shù)組長度;對獲得的工作請求結(jié)構(gòu)體數(shù)組,進行如下處理:
3.29.1SEND發(fā)送管理函數(shù)取出工作請求結(jié)構(gòu)體數(shù)組元素;
3.29.2SEND發(fā)送管理函數(shù)調(diào)用OFED庫的ibv_post_send函數(shù),將取出的工作請求結(jié)構(gòu)體數(shù)組元素發(fā)送到RDMA網(wǎng)卡;RDMA網(wǎng)卡從工作請求結(jié)構(gòu)體元素的源地址讀取數(shù)據(jù),將數(shù)據(jù)發(fā)送到接收端的RDMA網(wǎng)卡,接收端的RDMA網(wǎng)卡將發(fā)送端的數(shù)據(jù)放置到RECEIVE工作請求指定的位置中;
3.29.3SEND發(fā)送管理函數(shù)判斷工作請求結(jié)構(gòu)體數(shù)組元素是否為空,如果為空,轉(zhuǎn)3.32,如果不為空,轉(zhuǎn)3.29.1;
3.30接收端套接字應(yīng)用調(diào)用Linux系統(tǒng)的recv或者read函數(shù)接收數(shù)據(jù),使用Rsockets協(xié)議攔截recv或read函數(shù),采用Rsockets協(xié)議的rrecv函數(shù)替代recv或者read函數(shù),rrecv函數(shù)調(diào)用WRITE處理完成事件函數(shù),具體方法為:
3.30.1WRITE處理完成事件函數(shù)調(diào)用OFED庫提供的ibv_poll_cq函數(shù)獲取完成事件,如果獲取到完成事件,解析完成事件獲取數(shù)據(jù)的長度,將內(nèi)存管理結(jié)構(gòu)體A2的數(shù)據(jù)尾指針的長度增加數(shù)據(jù)的長度,A2的數(shù)據(jù)頭指針指向數(shù)據(jù)所在首地址,轉(zhuǎn)3.30.2;如果沒有獲取到完成事件,則顯示“獲取完成失敗,沒有數(shù)據(jù)到達”,轉(zhuǎn)3.32;
3.30.2WRITE處理完成事件函數(shù)判斷接收端套接字應(yīng)用調(diào)用rrecv函數(shù)傳入的長度是否大于3.30.1獲取的數(shù)據(jù)長度,如果大于3.30.1獲取的數(shù)據(jù)長度,記接收長度為數(shù)據(jù)長度,否則記接收長度為接收端套接字應(yīng)用調(diào)用rrecv函數(shù)傳入的長度;如果接收長度大于16KB,轉(zhuǎn)3.30.3,如果接收長度小于或等于16KB,轉(zhuǎn)3.30.5;
3.30.3WRITE處理完成事件函數(shù)向接收端的內(nèi)存管理模塊發(fā)送“內(nèi)存映射請求”;接收端的內(nèi)存管理模塊收到“內(nèi)存映射請求”,處理為“建立內(nèi)存映射請求”,向接收端的內(nèi)存處理模塊的字符設(shè)備傳遞“建立內(nèi)存映射請求”;
3.30.4接收端的內(nèi)存處理模塊的字符設(shè)備收到“建立內(nèi)存映射請求”,從“建立內(nèi)存映射請求”中獲取虛擬地址和物理地址、數(shù)據(jù)的長度,建立虛擬地址到物理地址的內(nèi)存映射;轉(zhuǎn)3.30.6;
3.30.5WRITE處理完成事件函數(shù)將數(shù)據(jù)從數(shù)據(jù)所在地址拷貝到接收端套接字應(yīng)用的接收緩存中;轉(zhuǎn)3.30.6;
3.30.6WRITE處理完成事件函數(shù)將A2的空閑長度增加接收的長度,A2的數(shù)據(jù)頭指針增加接收長度的值,套接字應(yīng)用的接收緩存的長度減去接收的長度,WRITE處理完成事件函數(shù)將A2的內(nèi)容寫到發(fā)送端的B1中;
3.30.7WRITE處理完成事件函數(shù)判斷套接字應(yīng)用的接收緩存長度是否為零,如果為零,轉(zhuǎn)3.32,如果不為零,轉(zhuǎn)3.30.1;
3.31接收端套接字應(yīng)用調(diào)用recvfrom函數(shù),使用Rsockets協(xié)議攔截recvfrom函數(shù),采用Rsockets協(xié)議的rrecvfrom函數(shù)替代recvfrom函數(shù),rrecvfrom函數(shù)調(diào)用OFED庫的注冊物理地址內(nèi)存區(qū)域函數(shù),注冊物理地址內(nèi)存區(qū)域,rrecvfrom函數(shù)調(diào)用SEND處理完成事件函數(shù),具體方法為:
3.31.1SEND處理完成事件函數(shù)調(diào)用OFED庫提供的ibv_poll_cq函數(shù)獲取完成事件,如果獲取到完成事件,解析完成事件獲取數(shù)據(jù)的長度,將內(nèi)存管理結(jié)構(gòu)體A2的數(shù)據(jù)尾指針的長度增加數(shù)據(jù)的長度,A2的數(shù)據(jù)頭指針指向數(shù)據(jù)所在首地址,轉(zhuǎn)3.31.2;如果沒有獲取到完成事件,則顯示“獲取完成事件失敗,數(shù)據(jù)未到達”,轉(zhuǎn)3.32;
3.31.2SEND處理完成事件函數(shù)判斷接收端套接字應(yīng)用調(diào)用rrecv函數(shù)傳入的長度是否大于3.31.1獲取的數(shù)據(jù)長度,如果大于,記接收長度為數(shù)據(jù)長度,否則接收長度為接收端套接字應(yīng)用調(diào)用rrecv函數(shù)傳入的長度;如果接收長度大于16KB,轉(zhuǎn)3.31.3,如果接收長度小于或等于16KB,轉(zhuǎn)3.31.5;
3.31.3SEND處理完成事件函數(shù)向接收端的內(nèi)存管理模塊發(fā)送“內(nèi)存映射請求”;接收端的內(nèi)存管理模塊收到“內(nèi)存映射請求”,處理為“建立內(nèi)存映射請求”,向接收端的內(nèi)存處理模塊的字符設(shè)備傳遞“建立內(nèi)存映射請求”;
3.31.4接收端的內(nèi)存處理模塊的字符設(shè)備收到“建立內(nèi)存映射請求”,從“建立內(nèi)存映射請求”中獲取虛擬地址和物理地址,數(shù)據(jù)的長度,調(diào)用Linux內(nèi)核的remap_pfn_range函數(shù)建立虛擬地址到物理地址的內(nèi)存映射;轉(zhuǎn)3.31.6;
3.31.5SEND處理完成事件函數(shù)將數(shù)據(jù)從數(shù)據(jù)所在地址拷貝到接收端的套接字應(yīng)用的接收緩存中;轉(zhuǎn)3.31.6;
3.31.6SEND處理完成事件函數(shù)將A2的空閑長度增加接收的長度,A2的數(shù)據(jù)頭指針增加接收長度的值,套接字應(yīng)用的接收緩存的長度減去接收的長度;轉(zhuǎn)3.31.7;
3.31.7SEND處理完成事件函數(shù)構(gòu)造RECEIVE工作請求,工作請求的目的地址為A2的數(shù)據(jù)尾指針指向的地址,工作請求的長度為接收的長度,調(diào)用OFED庫的ibv_poll_cq函數(shù)將RECEIVE工作請求發(fā)布到RDMA網(wǎng)卡中;轉(zhuǎn)3.31.8;
3.31.8SEND處理完成事件函數(shù)判斷套接字應(yīng)用的接收緩存長度是否為零,如果為零,轉(zhuǎn)3.32,如果不為零,轉(zhuǎn)3.31.1;
3.32結(jié)束。
該專利技術(shù)資料僅供研究查看技術(shù)是否侵權(quán)等信息,商用須獲得專利權(quán)人授權(quán)。該專利全部權(quán)利屬于中南大學(xué);鵬城實驗室,未經(jīng)中南大學(xué);鵬城實驗室許可,擅自商用是侵權(quán)行為。如果您想購買此專利、獲得商業(yè)授權(quán)和技術(shù)合作,請聯(lián)系【客服】
本文鏈接:http://www.szxzyx.cn/pat/books/202110399487.5/1.html,轉(zhuǎn)載請聲明來源鉆瓜專利網(wǎng)。
- 圖像診斷裝置、醫(yī)用系統(tǒng)以及協(xié)議管理方法
- 一種自動協(xié)議識別方法及系統(tǒng)
- 客戶端中遞送協(xié)議數(shù)據(jù)單元的方法及相關(guān)裝置
- 遠程通訊系統(tǒng)
- 一種基于可拼裝通信協(xié)議棧的通信方法及系統(tǒng)
- 一種實現(xiàn)國產(chǎn)平臺PXEBOOT的協(xié)議架構(gòu)
- CBTC通信系統(tǒng)協(xié)議解析方法、協(xié)議庫管理方法
- 一種協(xié)議轉(zhuǎn)換的方法、裝置、設(shè)備及存儲介質(zhì)
- 一種用于燈光控制的協(xié)議轉(zhuǎn)換系統(tǒng)及方法
- 一種通用工藝人工智能物聯(lián)網(wǎng)網(wǎng)關(guān)





