麻豆精品无码国产在线播放,国产亚洲精品成人AA片新蒲金,国模无码大尺度一区二区三区,神马免费午夜福利剧场

一種零拷貝接收報文的方法和系統的制作方法

文檔序號:7974401閱讀:278來源:國知局
專利名稱:一種零拷貝接收報文的方法和系統的制作方法
技術領域
本發明涉及高速網絡收包領域,尤其涉及一種零拷貝接收報文的方法和系統。
背景技術
在Linux操作系統中,用戶態程序捕獲網卡接收到的數據包一般是通過套接字相關的系統調用網卡通過DMA (Direct Memory Access,直接內存存取)機制將網絡數據包接收到內核空間,進程通過讀套接字將數據從內核空間復制到用戶空間。在這種模式下,用戶進程接收數據需要一次從內核到用戶空間的數據復制。在高速網絡中,大量的數據拷貝極大的消耗了 CPU資源,系統調用會引起操作系統上下文切換,降低了系統性能。為了解決這個問題,目前存在一種零拷貝技術,該零拷貝的思想是數據包在從網卡到達用戶空間的過程中,通過硬件DMA技術和操作系統MMAP (Memory Map)技術,將報文直接送到用戶空間,實現CPU的零參與,徹底消除CPU在這方面的損耗。上述零拷貝技術需要修改網卡驅動,當網卡驅動升級時,還需要做相應的修改。具體地,現在的零拷貝普遍采用的做法,如圖1所示,包括先在內核中分配一片固定的空間,將這塊空間分成多個固定長度的數據塊,組成一個隊列;然后修改網卡驅動程序,更改為接收緩沖區分配內存的函數,所有內存都從上述隊列中分配;調用MMAP系統調用將上述隊列映射到用戶空間;網卡驅動收到數據后,給數據塊設置標記,表示數據接收完成;用戶空間根據標記,直接讀取數據。然而,上述零拷貝技術存在以下缺陷上述的零拷貝技術可以應用于IDSantrusion Detection System,入侵檢測系統)等監聽性質的應用中。因為IDS只需要簡單的將報文送到IDS檢測引擎,不需要經過其他模塊。但是在UTM(Unified Threat Management,企業上網安全隱患)中,由于數據在送到運行于用戶空間的IPSantrusion Protection System,互聯網協議群)等引擎時,要經過TCP/IP協議棧,在協議棧里完成IP碎片重組等操作,導致報文長度、位置發生變化,不再處于上述的隊列中,從用戶空間就無法讀取這段數據。且上述的固定空間由于大小受限制,在網絡突發高峰的時候,會產生緩沖區不足導致丟包的情況。

發明內容
本發明提供一種零拷貝接收報文的方法和系統,用以解決現有技術中采用的零拷貝技術不能讀取緩沖區中變化的數據,以及在網絡高峰期時由于緩沖區不足導致丟包等問題。為了解決上述技術問題,本發明采用的技術方案如下一方面,本發明提供一種零拷貝接收報文的方法,包括用戶態進程打開預先創建的虛擬字符設備,調用所述虛擬字符設備提供的mmap 方法;內核態進程在所述mmap方法被調用時,將所有內核低端空間映射到用戶空間,并為所述內核低端空間的結構Vm_area_StruCt設置nopage方法;
內核態進程在網卡設備接收到數據包時,基于所述數據包在所述內核低端空間中的地址,得到數據包存儲偏移地址后傳遞給用戶態進程;用戶態進程根據所述偏移地址計算得到待訪問的虛擬地址,并在訪問所述虛擬地址時,觸發CPU缺頁異常,使得操作系統調用所述nopage方法得到要訪問的物理地址對應的頁目錄和頁表項;用戶態進程基于所述頁目錄和頁表項,讀取存儲在所述內核低端空間內的所述數據包。進一步地,本發明所述方法中,所述用戶態進程根據所述偏移地址計算得到待訪問的虛擬地址的方式包括所述用戶態進程將所述數據包的存儲偏移地址加上映射的用戶空間地址,得到讀取所述數據包所需訪問的虛擬地址。進一步地,本發明所述方法中,所述操作系統調用所述nopage方法得到要訪問的物理地址對應的頁目錄和頁表項,具體包括操作系統將要訪問的所述虛擬地址減去所述用戶空間的起始虛擬地址,得到一個偏移地址,并根據該偏移地址得到要訪問的物理地址;操作系統將所述物理地址右移PAGE_SHIFT位轉換成頁幀號,再調用pfn_t0_page 函數返回page結構指針;操作系統取得所述page結構指針后,為所述物理地址設置頁目錄和頁表項。進一步地,本發明所述方法中,所述操作系統調用所述nopage方法得到要訪問的物理地址對應的頁目錄和頁表項前,還包括所述操作系統調用缺頁異常處理函數檢測所述虛擬地址所在用戶空間的合法性, 當所述用戶空間合法時,調用所述nopage方法。進一步地,本發明所述方法中,所述網卡設備接收到所述數據包時,具體包括所述網卡驅動調用系統函數all0C_Skb()為網卡分配緩存,并利用所述系統函數 alloc_skb ()調用內存分配函數kmallocO分配內存塊;所述網卡驅動通過直接內存存取方式將所述數據包存到所述緩存中。其中,所述網卡驅動將所述數據包存到所述緩存后還包括操作系統的TCP/IP協議棧對所述數據包進行處理。另一方面,本發明還提供一種零拷貝接收報文的系統,包括初始化模塊,用于打開預先創建的虛擬字符設備,調用所述虛擬字符設備提供的 mmap方法;映射模塊,用于在所述mmap方法被調用時,將所有內核低端空間映射到用戶空間,并為所述內核低端空間的結構Vm_area_StruCt設置nopage方法;地址計算模塊,用于在網卡設備接收到數據包時,基于所述數據包在所述內核低端空間中的地址,得到數據包存儲偏移地址后傳遞給地址訪問模塊;地址訪問模塊,用于根據所述偏移地址計算得到待訪問的虛擬地址,并在訪問所述虛擬地址時,觸發CPU缺頁異常;Page獲取模塊,用于在所述地址訪問模塊觸發CPU缺頁異常時,調用所述nopage 方法得到要訪問的物理地址對應的頁目錄和頁表項;
報文讀取模塊,用于基于所述物理地址對應的頁目錄和頁表項,讀取存儲在所述內核低端空間內的所述數據包。進一步地,本發明所述系統中,所述I^age獲取模塊具體包括物理地址計算子模塊,用于將要訪問的所述虛擬地址減去所述用戶空間的起始虛擬地址,得到一個偏移地址,并根據該偏移地址計算要訪問的物理地址;Page指針獲取子模塊,用于將所述物理地址右移PAGE_SHIFT位轉換成頁幀號,再調用pfn_to_page函數返回page結構指針;Page項設置子模塊,用于在所述I^ge指針獲取模塊取得所述page結構指針后,為所述物理地址設置頁目錄和頁表項。進一步地,本發明所述系統中,所述地址計算模塊具體用于,將所述數據包的存儲偏移地址加上映射的用戶空間地址,得到讀取所述數據包所需訪問的虛擬地址。進一步地,本發明所述系統中,所述網卡設備具體包括數據包接收模塊,用于接收到所述數據包時,調用系統函數allOC_SlA0為網卡分配緩存,并利用所述系統函數allOC_SlA0調用內存分配函數kmallocO分配內存塊;數據包存儲模塊,用于通過直接內存存取方式將所述數據包存到所述緩存中。與現有技術相比,本發明有益效果如下首先,本發明克服了為網卡分配固定緩存區存在的緩沖區不足的問題,提高了系統在高峰時的處理能力。其次,本發明解決了常規零拷貝過程中報文不能被任意修改或移動的問題。第三,本發明不需要修改現有的網卡驅動,改造成本為零。


圖1為現有技術中零拷貝技術的實現示意圖;圖2為本發明提供的一種零拷貝接收報文的方法流程圖;圖3為本發明實施例中所述零拷貝接收報文的方法示意圖;圖4為本發明提供的一種零拷貝接收報文的系統結構框圖。
具體實施例方式下面將結合本發明實施例中的附圖,對本發明實施例中的技術方案進行清楚、完整地描述,顯然,所描述的實施例僅僅是本發明一部分實施例,而不是全部的實施例。基于本發明中的實施例,本領域普通技術人員在沒有做出創造性勞動前提下所獲得的所有其他實施例,都屬于本發明保護的范圍。為了解決現有技術中采用的零拷貝技術不能讀取緩沖區中變化的數據,以及在網絡高峰期時由于緩沖區不足導致丟包等問題,本發明提供一種零拷貝接收報文的方法和系統。如圖2所示,本發明提供的零拷貝接收報文的方法,包括步驟S201、用戶態進程打開預先創建的虛擬字符設備,調用所述虛擬字符設備提供的mmap方法;內核態進程在所述mmap方法被調用時,將所有內核低端空間映射到用戶空間,并為所述內核低端空間的結構Vm_area_StruCt設置nopage方法;
6
步驟S202、內核態進程在網卡設備接收到數據包時,基于所述數據包在所述內核低端空間中的地址,得到數據包存儲偏移地址后傳遞給用戶態進程;步驟S203、用戶態進程根據所述偏移地址計算得到待訪問的虛擬地址,并在訪問所述虛擬地址時,觸發CPU缺頁異常,使得操作系統調用所述nopage方法得到要訪問的物理地址對應的頁目錄和頁表項;具體地,該步驟中,用戶態進程根據所述偏移地址計算得到待訪問的虛擬地址的方式包括用戶態進程將所述數據包的存儲偏移地址加上映射的用戶空間地址,得到讀取所述數據包所需訪問的虛擬地址。具體地,該步驟中,操作系統調用所述nopage方法得到要訪問的物理地址對應的頁目錄和頁表項,包括(1)操作系統將要訪問的所述虛擬地址減去所述用戶空間的起始虛擬地址,得到一個偏移地址,并根據該偏移地址得到要訪問的物理地址;(2)操作系統將所述物理地址右移PAGE_SHIFT位轉換成頁幀號,再調用pfn_to_ page函數返回page結構指針;(3)操作系統取得所述page結構指針后,為所述物理地址設置頁目錄和頁表項。步驟S204、用戶態進程基于所述頁目錄和頁表項,讀取存儲在所述內核低端空間內的所述數據包。為了更清楚的表述本發明,下面給出本發明的一個較佳實施例,并結合對實施例的描述進一步給出本發明的技術細節。本發明實施例所述的零拷貝接收報文的方法示意圖如圖3所示,所述零拷貝接收報文方法具體通過如下幾個過程實現一,創建虛擬字符設備;內核態進程用regi ster_ChrdeV函數創建一個虛擬的字符設備,并初始化其 file_operations結構,初始化與該虛擬字符設備相關的內存映射(mmap)方法;其中,內存映射方法具體為初始化內存空間控制結構Vm_area_StruCt,設置其 nopage 方法。其中,file_operations結構定義如下static struct file—operations ipq_fops = { open: ipq_open, release: ipq_release, read: ipq_read, write: ipq_write, poll: ipq_poll, unlocked—ioctl: ipq_ioctl, mmap:ipq_mmap,
};S卩,虛擬字符設備可以有以下操作打開、釋放、讀、寫、推、解鎖以及mmap內存映射方法。本發明實施例中,創建虛擬字符設備是為了使用虛擬字符設備提供的mmap方法 (即上述結構中的ipq_mma0070),所述mmap方法用于將所有低端內核空間(低端內存)映射到用戶空間。在典型的32位Linux系統中,低端內存的物理地址是0 0x30000000,總大小768M字節,遠小于用戶進程擁有的地址空間3G字節。另外,需要注意的是,本發明實施例所述mmap方法并不立即為用戶態進程設置低端內存的內存頁目錄和頁表項,只是簡單的為表示該低端內存空間的結構vm_area_ struct (虛擬內存區域)設置nopage方法,頁目錄和頁表項是在過程中發生缺頁異常時設置的。 其中,為vm_area_sturct設置nopage方法通過代碼實現如下static Struct vm—oprations—struct ipq_nopage_vm_ops = {
.open = ipq_vma_open,
.close = ipq_vma—close,
.nopage = ipq_vma_nopage, /* nopage 方法 */
};S卩,表示vm_area_sturct可以進行打開、關閉以及實現nopage方法。二,用戶態進程數據包接收初始化;用戶態進程打開創建的虛擬字符設備,獲得文件描述符;其中,虛擬字符設備打開方法實現如下:fd = open(" /dev/ipq",0_RDWR);用戶態進程調用sysinfo函數獲取內核低端內存的大小;用戶態進程調用虛擬字符設備提供的mmap內存映射方法;內核態進程在mmap內存映射方法被調用時,將所有的低端內存映射到用戶空間, 并為內存空間的控制結構vm_area_StruCt設置nopage方法。其中,mmap內存映射操作的返回值就是映射內存的用戶空間地址,用戶態程序訪問這段用戶空間地址實際上就是訪問整個內核態的低端內存空間。
三,網卡設備接收數據包;1,網卡驅動調用操作系統的all0C_Skb()函數為網卡分配緩存,所述alloc_ skb ()函數會調用kmallocO函數分配大約I大小的內存塊;其中,kmallocO函數的參數是GFP_AT0MIC,所以內存塊都是從操作系統的低端內存中分配的,這就是數據包接收程序只映射低端內存,就能夠隨意訪問報文的原因。2,網卡驅動通過DMA方式將數據包存到緩存中,且所述緩存中的數據包可以通過操作系統中的TCP/IP協議棧進行處理。四,用戶態進程讀取緩存內的數據包;當網卡設備將接收的數據包存到緩存后,內核態進程負責計算數據包存儲在內核低端內存的存儲偏移地址,并將該偏移地址傳送給用戶態進程kmem_0ffset = (_u32) skb- > data-PAGE_OFFSET ;用戶態進程將所述偏移地址加上映射地址就得到讀取相應數據包所需訪問的虛 以地址,艮口 char^bp = (unsigned char水)rg. kmem+kmem—offset ;當用戶態進程第一次試圖訪問用戶空間的上述虛擬地址時,會觸發CPU缺頁異常,操作系統的缺頁異常處理函數在確認該用戶空間合法后,會調用nopage方法,得到該用戶空間所在頁對應的物理頁面,然后為該物理頁設置頁目錄和頁表項,用戶態進程得到相應的頁目錄和頁表項后,即可讀取低端內存內緩存的數據包。其中,調用nopage方法得到該用戶空間所在頁對應的物理頁面,具體為1,將要訪問的虛擬地址,減去上述用戶空間的起始虛擬地址,得到偏移地址,然后根據該偏移地址計算出要訪問的物理地址;通常情況下,這個偏移地址就等于物理地址。2,將物理地址右移PAGE_SHIFT位,轉換成頁幀號,然后調用pfn_t0_page函數返回page結構指針。3,操作系統取得page結構指針后,為上述物理地址設置頁目錄和頁表項。上述nopage方法通過代碼實現如下struct page* ipq_vma_nopage(struct vm—area—struct* vma, unsigned long address, int * type)
{
struct page* pageptr;
unsigned long offset = vma->vm_pgoff PAGE—SHIFT; unsigned long pos = address - vma->vm—start + offset; unsigned long pages = pos PAGE— SHIFT;
pageptr = pfn_to_page(pages);
get_page(pageptr);
return pageptr;
}綜上所述,本發明提供的方法,克服了為網卡分配固定緩存區存在的緩沖區不足的問題,提高了系統在高峰時的處理能力;解決了常規零拷貝過程中報文不能被任意修改或移動的問題;并且本發明所述方法不需要修改現有的網卡驅動,改造成本為零。如圖4所示,本發明還提供一種零拷貝接收報文的系統,包括初始化模塊,用于打開預先創建的虛擬字符設備,調用所述虛擬字符設備提供的 mmap方法;映射模塊,用于在所述mmap方法被調用時,將所有內核低端空間映射到用戶空間,并為所述內核低端空間的結構Vm_area_StruCt設置nopage方法;地址計算模塊,用于在網卡設備接收到數據包時,基于所述數據包在所述內核低端空間中的地址,得到數據包存儲偏移地址后傳遞給地址訪問模塊;地址訪問模塊,用于根據所述偏移地址計算得到待訪問的虛擬地址,并在訪問所述虛擬地址時,觸發CPU缺頁異常;Page獲取模塊,用于在所述地址訪問模塊觸發CPU缺頁異常時,調用所述nopage 方法得到要訪問的物理地址對應的頁目錄和頁表項;報文讀取模塊,用于基于所述物理地址對應的頁目錄和頁表項,讀取存儲在所述內核低端空間內的所述數據包。進一步地,上述I^age獲取模塊,具體包括 物理地址計算子模塊,用于將要訪問的所述虛擬地址減去所述用戶空間的起始虛擬地址,得到一個偏移地址,并根據該偏移地址計算要訪問的物理地址;Page指針獲取子模塊,用于將所述物理地址右移PAGE_SHIFT位轉換成頁幀號,再調用pfn_to_page函數返回page結構指針;Page項設置子模塊,用于在所述I^age指針獲取模塊取得所述page結構指針后,為所述物理地址設置頁目錄和頁表項。
進一步地,上述地址計算模塊,具體用于將所述數據包的存儲偏移地址加上映射的用戶空間地址,得到讀取所述數據包所需訪問的虛擬地址。進一步地,本發明所述系統中,所述網卡設備具體包括數據包接收模塊,用于接收到所述數據包時,調用系統函數allOC_SlA0為網卡分配緩存,并利用所述系統函數allOC_SlA0調用內存分配函數kmallocO分配內存塊;數據包存儲模塊,用于通過直接內存存取方式將所述數據包存到所述緩存中。綜上所述,本發明提供的系統,克服了為網卡分配固定緩存區存在的緩沖區不足的問題,提高了系統在高峰時的處理能力;解決了常規零拷貝過程中報文不能被任意修改或移動的問題;并且本發明所述系統不需要修改現有的網卡驅動,改造成本為零。顯然,本領域的技術人員可以對本發明進行各種改動和變型而不脫離本發明的精神和范圍。這樣,倘若本發明的這些修改和變型屬于本發明權利要求及其等同技術的范圍之內,則本發明也意圖包含這些改動和變型在內。
權利要求
1.一種零拷貝接收報文的方法,其特征在于,包括用戶態進程打開預先創建的虛擬字符設備,調用所述虛擬字符設備提供的mmap方法; 內核態進程在所述mmap方法被調用時,將所有內核低端空間映射到用戶空間,并為所述內核低端空間的結構vm_area_StruCt設置nopage方法;內核態進程在網卡設備接收到數據包時,基于所述數據包在所述內核低端空間中的地址,得到數據包存儲偏移地址后傳遞給用戶態進程;用戶態進程根據所述偏移地址計算得到待訪問的虛擬地址,并在訪問所述虛擬地址時,觸發CPU缺頁異常,使得操作系統調用所述nopage方法得到要訪問的物理地址對應的頁目錄和頁表項;用戶態進程基于所述頁目錄和頁表項,讀取存儲在所述內核低端空間內的所述數據包。
2.如權利要求1所述的方法,其特征在于,所述用戶態進程根據所述偏移地址計算得到待訪問的虛擬地址的方式包括所述用戶態進程將所述數據包的存儲偏移地址加上映射的用戶空間地址,得到讀取所述數據包所需訪問的虛擬地址。
3.如權利要求1所述的方法,其特征在于,所述操作系統調用所述nopage方法得到要訪問的物理地址對應的頁目錄和頁表項,具體包括操作系統將要訪問的所述虛擬地址減去所述用戶空間的起始虛擬地址,得到一個偏移地址,并根據該偏移地址得到要訪問的物理地址;操作系統將所述物理地址右移PAGE_SHIFT位轉換成頁幀號,再調用pfn_t0_page函數返回page結構指針;操作系統取得所述page結構指針后,為所述物理地址設置頁目錄和頁表項。
4.如權利要求3所述的方法,其特征在于,所述操作系統調用所述nopage方法得到要訪問的物理地址對應的頁目錄和頁表項前,還包括所述操作系統調用缺頁異常處理函數檢測所述虛擬地址所在用戶空間的合法性,當所述用戶空間合法時,調用所述nopage方法。
5.如權利要求1所述的方法,其特征在于,所述網卡設備接收到所述數據包時,具體包括所述網卡驅動調用系統函數allOC_SlA0為網卡分配緩存,并利用所述系統函數 alloc_skb()調用內存分配函數kmal IocO分配內存塊;所述網卡驅動通過直接內存存取方式將所述數據包存到所述緩存中。
6.如權利要求5所述的方法,其特征在于,所述網卡驅動將所述數據包存到所述緩存后還包括操作系統的TCP/IP協議棧對所述數據包進行處理。
7.一種零拷貝接收報文的系統,其特征在于,包括初始化模塊,用于打開預先創建的虛擬字符設備,調用所述虛擬字符設備提供的mmap 方法;映射模塊,用于在所述mmap方法被調用時,將所有內核低端空間映射到用戶空間,并為所述內核低端空間的結構Vm_area_StruCt設置nopage方法;地址計算模塊,用于在網卡設備接收到數據包時,基于所述數據包在所述內核低端空間中的地址,得到數據包存儲偏移地址后傳遞給地址訪問模塊;地址訪問模塊,用于根據所述偏移地址計算得到待訪問的虛擬地址,并在訪問所述虛擬地址時,觸發CPU缺頁異常;Page獲取模塊,用于在所述地址訪問模塊觸發CPU缺頁異常時,調用所述nopage方法得到要訪問的物理地址對應的頁目錄和頁表項;報文讀取模塊,用于基于所述物理地址對應的頁目錄和頁表項,讀取存儲在所述內核低端空間內的所述數據包。
8.如權利要求7所述的系統,其特征在于,所述I^age獲取模塊具體包括物理地址計算子模塊,用于將要訪問的所述虛擬地址減去所述用戶空間的起始虛擬地址,得到一個偏移地址,并根據該偏移地址計算要訪問的物理地址;Page指針獲取子模塊,用于將所述物理地址右移PAGE_SHIFT位轉換成頁幀號,再調用 pfn_to_page函數返回page結構指針;I^age項設置子模塊,用于在所述Page指針獲取模塊取得所述page結構指針后,為所述物理地址設置頁目錄和頁表項。
9.如權利要求7所述的系統,其特征在于,所述地址計算模塊具體用于,將所述數據包的存儲偏移地址加上映射的用戶空間地址,得到讀取所述數據包所需訪問的虛擬地址。
10.如權利要求7所述的系統,其特征在于,所述網卡設備具體包括數據包接收模塊,用于接收到所述數據包時,調用系統函數all0C_S!A ()為網卡分配緩存,并利用所述系統函數alloc_SlA0調用內存分配函數kmallocO分配內存塊; 數據包存儲模塊,用于通過直接內存存取方式將所述數據包存到所述緩存中
全文摘要
本發明公開了一種零拷貝接收報文的方法和系統,所述方法包括用戶態進程打開預先創建的虛擬字符設備,調用mmap方法;內核態進程在mmap方法被調用時,將所有內核低端空間映射到用戶空間,并為其的結構vm_area_struct設置nopage方法;內核態進程在網卡設備接收到數據包時,將數據包在低端內存空間中的偏移地址傳遞給用戶態進程;用戶態進程訪問計算出的虛擬地址,觸發CPU缺頁異常,使得操作系統調用nopage方法得到要訪問的物理地址對應的頁目錄和頁表項;用戶態進程讀取存儲在所述低端內核地址空間內的所述數據包。本發明解決了已有零拷貝技術緩沖區不足以及零拷貝過程中報文不能被任意修改或移動的問題。
文檔編號H04L12/56GK102402487SQ20111036190
公開日2012年4月4日 申請日期2011年11月15日 優先權日2011年11月15日
發明者劉彤 申請人:北京天融信科技有限公司
網友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1
主站蜘蛛池模板: 沾益县| 临漳县| 木兰县| 中西区| 永川市| 祁阳县| 莱芜市| 北安市| 淳化县| 绥化市| 湟中县| 枣阳市| 汤原县| 临洮县| 和林格尔县| 阿拉善右旗| 潮安县| 台东县| 滁州市| 防城港市| 柘城县| 墨江| 金门县| 潞西市| 河东区| 土默特右旗| 宝兴县| 晋州市| 阿合奇县| 平遥县| 滕州市| 德保县| 若尔盖县| 苍南县| 宜丰县| 东阿县| 建阳市| 桦川县| 巴彦淖尔市| 玉田县| 大荔县|