摘要:通過分析網絡處理器系統的收發機制,提出了一種基于網絡處理器的零拷貝技術。該技術不僅實現了在網絡處理器系統下的零拷貝技術,而且也體現出網絡處理器中不同數據處理層的協作框架。
關鍵詞:網絡處理器;零拷貝
中圖法分類號:TP393文獻標識碼:A
文章編號:1001-3695(2007)01-0288-03
隨著網絡技術的發展,網絡安全越來越受到人們的重視,同時隨著各種網絡攻擊手段的多元化、復雜化、智能化,單純依賴傳統的操作系統加固技術和防火墻隔離技術等靜態防御已難以勝任網絡安全的需要。IDS作為動態安全技術之一,提供了實時的入侵檢測,并能作出記錄、報警、阻斷等反應,提供了更為積極的防御手段。 大多數網絡入侵檢測系統(NIDS)是以通用的包獲取庫來獲取網絡上的報文,如Snort利用Libpcap庫。Libpcap庫對于應用到NIDS這樣要求高速數據獲取,它的效率并不能滿足需要。同時傳統網卡工作方式依靠從網絡上抓包,再從網卡拷貝到上層系統,拷貝過程也要大量占用CPU資源,造成了整體性能下降。零拷貝技術可以減少數據拷貝和共享總線操作的次數,消除通信數據在存儲器之間不必要的中間拷貝過程,有效地提高通信效率,是設計高速接口通道、實現高速服務器和路由器的關鍵技術之一。
隨著高速局域網和光纖通信等新技術的應用,對網絡性能和流量帶寬提出了越來越高的要求。而傳統的基于通用處理器(GPP)的NIDS,由于本身GPP的處理能力及體系結構等因素的限制,從而制約了NIDS向千兆級的發展。而基于硬件電路ASIC等方式的硬件IDS不夠靈活、成本高,難以得到廣泛的使用。 網絡處理器是系統設計從ASIC轉向可編程應用系統設計出現的產物,它的軟件可編程能力提供了高度靈活性,在硬件上對分組處理流程進行了優化,可以滿足線速處理要求,并且硬件上實現了很多原來主要是由GPP負責完成的控制與管理功能,從而滿足了高性能的需求?,F在已逐漸成為人們進行高性能網絡應用開發的重要選擇方案之一。本文是以網絡處理器IXP2400為開發平臺,以Intel IXA SDK,Monta Vista Linux為軟件開發環境,提出一種零拷貝技術的實現方案。零拷貝技術的研究工作主要涉及到數據的傳輸途徑、傳輸控制、緩沖區管理機制、地址變換和地址空間的保護機制等設計問題。本文通過對IXP2400網絡處理器的硬件結構的簡述,以及對該環境下數據包的收發機制、數據包與內核空間的交互機制及用戶空間存取內核空間數據機制三方面的論述,闡述基于網絡處理器下的零拷貝技術的原理,并且給出實現的具體技術。
1基于網絡處理器零拷貝技術的研究
1.1網絡處理器IXP2400簡述
IXP2400網絡處理器中采用了與通用處理器不同的全新體系結構,以適應當今網絡設備設計的需求。其中主要的結構模塊有:①一個XScale Core,它主要用來處理控制層面的工作;②八個微引擎(ME),它們主要用于處理數據層面的工作;③SRAM 單元和DRAM 單元,它們為不同類型的外部存儲器;④MSF(Media Switch Fabric), 它是支持多種工業接口并提供一個數據包進出的高速外部數據總線;⑤PCI 控制器,用于連接主機處理器或外部設備,可提供與管理層面的通信接口;⑥SHac 單元,它包括一個小容量的快速片內Scratchpad存儲器、片級控制狀態寄存器CSR和一個Hash運算器。其中Hash運算器是用來實現網絡處理中常用的Hash運算。所有這些結構模塊可以通過總線相互通信。
IXP2400網絡處理器的體系結構具有以下突出特點:
(1)并行處理器結構。八個微引擎都是可編程RISC處理器,它們并行工作,并且擁有各自的控制存儲器和局部寄存器,對于外部存儲器的訪問機會均等,主要負責數據層面的處理;XScale則是符合ARM規范的Strong ARM,主要負責控制層面和上層應用程序的處理,它的顯著特點是高性能、低功耗和緊湊設計,這使得它與其他專用的可執行單元可以集成在一個芯片中。這樣在硬件設計上將控制與數據處理進行分離,提高了并行處理能力。
(2)分布式多級數據存儲結構。采用了分布式數據存儲,四種類型存儲器(Local Memory,Scrachpad,SRAM,DRAM)兼顧了差別各異的網絡數據處理的靈活性和高性能;其中對SRAM和DRAM的訪問使用專用的讀寫寄存器實現,簡化了編程模型。同時,SRAM和DRAM均支持多個讀寫隊列進行優先級排隊,以優化帶寬。
(3)微引擎內部優化。微引擎的高性能和可擴充性是通過多處理器、多線程和軟件的流水線機制來實現的,其中每個微引擎可支持八個線程并行處理,并且由硬件實現線程切換,實現了線程切換零時延。此外,微引擎特殊的硬件體系結構可以支持高性能的數據平面的處理而無須核心處理器的干預。
1.2數據包的收發機制
網絡數據包的接收、發送由MSF及ME完成,它們可以高速地接收與發送數據包。MSF以Mpacket為單位接收從外界傳來的數據包,將Mpacket存入接收緩沖區(RBUF)內,ME從RBUF中讀取Mpacket, 通過實現一個狀態機而將SOP, MOP,EOP Mpackets進行有序的重組。在Mpacket組包過程中,當每次組包充滿一個DRAM中的單位緩沖區時(本系統采用的緩沖區大小為2KB),將對應生成的一個緩沖區描述符放入SRAM中。當接收到每個數據包的SOP包時,將生成的一個數據包描述符存放在SRAM中。緩沖區描述符指向數據包描述符在SRAM中的位置,數據包描述符記錄了數據包在DRAM中的位置及數據包的類型。DRAM中以緩沖區為存放數據包的單位,其大小可以由軟件指定。當數據包較大需要多個緩沖區時,數據包描述符中的Next Buffer數據項指向同一數據包的下一個緩沖區的位置。緩沖區描述符、數據包描述符及Packet Data的指向關系及存放位置如圖1 所示。
在數據處理的過程中,ME之間通過傳遞緩沖區描述符來實現數據包的傳遞。發送是一個逆向的過程。在系統中,緩沖區描述符及數據包描述符的傳遞是通過Scrachpad的隊列機制實現高效地通信。
1.3收發機制與上層系統的交互
作為一個嵌入式系統,在XScale上運行嵌入式操作系統Monta Vista Linux,ME,SDRAM和SRAM及其他硬件均為系統下的設備。ME接收完數據包并要將其交付上層系統處理時,通過觸發中斷,將數據包的第一個緩沖區描述符交于Linux內核,內核再根據緩沖區描述符計算數據包的物理地址。實現零拷貝技術需將數據包映射到用戶空間,以避免數據包內的拷貝,從而使用戶空間可以直接讀寫數據包。當數據包處理完成之后,用戶進程通過一簡單的模塊機制調用內核函數,并將數據包傳遞給ME,由ME完成數據包的發送。
數據包可能同時被ME或XScale存取,因此必須實現同步機制。在內核空間,可通過隊列機制進行數據包的同步:
RxQ——接收環形隊列的描述符,它記錄了接收環形隊列的頭尾指針。
Rxbuf——接收環形隊列,存放由ME傳上來的數據包緩沖區描述符。
TxQ——發送環形隊列的描述符,它記錄了發送環形隊列的頭尾指針。
Txbuf——發送環形隊列,存放由用戶層處理完的需交付ME發送的數據包緩沖區描述符。
在此數據結構上有兩個操作:入隊操作(Enqueue),將數據包的緩沖區描述符存放在Rxbuf/Txbuf中,并修改RxQ/TxQ的頭指針。通過隊列機制,可以實現ME與XScale數據包收發的同步機制。以上數據結構存放在同一內存頁中,方便后面的內存映射。
1.4Linux下的用戶空間存取內核空間機制
上一節中的RxQ,RxBuf,TxQ,TxBuf及數據包均在內核層空間內。實現零拷貝必須給用戶層空間提供存取內核空間的方便接口。
Linux提供了用戶層直接讀取內核層數據的機制。Linux內存管理采用三層頁式存儲管理策略。通過內存映射技術,采用內核模塊編程,將內核空間或設備內存映射至用戶進程虛擬地址空間。本文需要映射兩部分內存,即
(1)維護數據包收發同步的RxQ,RxBuf,TxQ,TxBuf數據結構映射至用戶空間。由于Remap_page_range方法只能給予對保留的頁和物理內存之上的物理地址的訪問,故這部分內存空間由Vmalloc分配,其大小為一頁(4KB),使用VMA的Nopage方法將其映射至應用層的地址空間。Nopage方法的原理是當用戶調用設備Mmap,用戶進程只是得到虛擬地址。當用戶進程真正訪問虛擬地址,操作系統會調用Nopage方法進行缺頁處理。
(2)數據包的映射至用戶進程。用戶進程通過讀取RxQ,RxBuf,TxQ,TxBuf可以獲得數據包的物理地址及其大小。由于屬于設備內存,用Remap_page_rage將數據包直接映射到用戶進程地址空間。每個數據包大小為2KB,通過讀取RxQ,RxBuf,TxQ,TxBuf一次可以映射多個數據包。
1.5網絡處理器零拷貝原理及與傳統技術的比較
1.5.1原理
基于網絡處理器系統的零拷貝技術結構如圖2所示。
MSF接收數據包,ME完成組包并在SRAM,SDRAM中分別建立與數據包相關的數據結構緩沖區描述符、數據包描述符,ME將需要交付上層處理的數據包通過激發中斷,將數據包的緩沖區描述符傳遞至內核空間,內核空間通過緩沖區描述符獲得數據包的物理地址,通過內存映射技術將數據包物理地址遞交用戶進程。用戶進程直接讀寫數據包實現數據包從收發設備至用戶進程的零拷貝。
1.5.2比較
基于通用處理器的零拷貝技術與基于網絡處理器的零拷貝技術相比:前者首先利用DMA技術將網絡數據包直接傳遞到系統內核預先分配的地址空間中,避免CPU的參與;同時,將系統內核中存儲數據包的內存區域映射到檢測程序的應用程序空間。檢測程序直接對這塊內存進行訪問,從而減少了系統內核向用戶空間的內存拷貝,同時減少了系統調用的開銷,但傳統的零拷貝技術系統每次調用只能獲取一個數據包,而抓包能力由于軟件的限制而不能充分發揮硬件的優勢。而在網絡處理器系統中,ME接收數據包并將其存入SDRAM中,在SRAM中建立數據包地址的描述信息,并將描述信息傳遞給內核,之后內核獲得數據包物理地址后用與前者同樣的機制交予用戶進程。數據包的收發過程均由ME完成,XScale沒有參與,XScale的主要工作集中在用戶進程收到數據包之后對數據包的分析階段。在這個過程中,數據包沒有任何拷貝行為。當數據包較大占據一個以上緩沖區,盡管物理地址不連續,但仍然可以將數據包映射到用戶進程的連續虛擬進程空間。另外,由于引入了隊列機制,每次系統調用均可以處理多個數據包,具有較高的效率。
2實現
2.1微碼編程
微碼為符號化的編程語言,類似于通用處理器的匯編語言。它沒有指針和函數的概念,可以通過宏提高代碼的效率及可重用性。微碼運行采用多級流水線機制,同時可以利用硬件多線程及信號機制實現線程同步,以提高系統效率。本文中微碼完成數據包的收發,將數據包提交XScale。以下微碼代碼為完成數據包提交工作(省略收發代碼及ME進程切換代碼):
//將Buffer Descriptor寫入事先約定的存儲位置
alu[$excep_lw0, ,b, packet_buffer_handle]
scratch[put, $excep_lw0, ring, 0,2]
//觸發中斷
cap[fast_wr, 0, XSCALE_INT_A]
2.2Linux內核編程
(1)使用Nopage方法,將RxQ,RxBuf,TxQ,TxBuf數據結構映射至用戶空間。Nopage代碼只需由虛擬地址獲得物理頁為
struct page *rtx_page_vma_nopage( struct vm_area_struct *vma,unsigned long address, int write_access)
{
Struct page *pageptr;
Unsigned long phyaddr = addressvma>vm_start +VMA_OFFSET(vma);
Pageptr =virt_to_page(_va(phyaddr));
Get_page(pageptr);
Return pageptr;
}
(2)使用Remap_page_ragne將數據包映射至用戶空間。首先,通過調用運行在內核空間的IXA SDK函數庫來獲取數據包的緩沖區描述符,并將其寫入RxBuf,同時更新RxQ。
// 數據包Buffer Descriptor
ix_buffer_handle arg_hBuffer;
enqueue(RxBuf,RxQ,arg_hBuffer);
其次,讀取隊列中的緩沖區描述符。獲得數據包的物理地址,調用Remap_page_range將數據包映射至用戶進程,每個數據包大小都是2KB的整數倍,一個數據包可能由幾個2KB空間組成(邊界檢查及出錯處理均未列出)。
int pkt_remap_mmap(struct file *flip,struct vm_area_struct *vma)
{
dequeue(RxBuf,RxQ,arg_hBuffer);
phyaddr=Ixa_get_phyaddr(arg_hBuffer);
remap_page_range(vma>start,phyaddr,2048,vma>vm_page_prot);
vma>vm_ops = pkt_remap_vm_ops;
return 0;
}
2.3用戶進程處理數據包
打開/dev/mem設備(相當于物理內存),使用Mmap首先將RxQ,RxBuf,TxQ,TxBuf數據結構映射至用戶空間中處理完后所映射好的網絡數據包,將數據包緩沖區描述符寫入Tx_buf并更新TxQ,同時將其發送至ME(由IXASDK支持)。
Enqueue(TxBuf,TxQ,arg_hBuffer);
SendtoMe(TxBuf,TxQ).
3結束語
本文結合網絡處理器系統的特性,實現了零拷貝技術,解決了在千兆級流量下IDS系統抓包的瓶頸。該技術體現了在網絡處理器系統下,快速數據處理層與上層處理系統的協作方式。在網絡處理器系統下,處理功能主要由ME完成,如ME將事先對數據包作分類并預處理,提交數據包給XScale。由XScale進行更復雜的分析,一方面可以使用現有的眾多的基于傳統PC體系結構的軟件,同時發揮網絡處理器處理數據的高效性,以共同保護系統的安全。
參考文獻:
[1]可向民.零拷貝技術及其實現的研究[J] .計算機工程與科學,2000,(5):1720.
[2]Intel Corp.IXP2400 Hardware Reference Manual[R]. 2003.
[3]Intel Corp.IXP2400 Programmer’s Reference Manual[R].20-04.
[4]Intel Corp Intel Internet Exchange Architecture[R].2003.
[5]Intel Corp Intel Internet Exchange Architecture Software Building Block Applications[R].2003.
[6]王佰玲.零拷貝報文捕獲平臺的研究與實現[J].計算機學報,2005,(1):4651.
作者簡介:
張宇雷,碩士研究生,研究方向為計算機網絡與安全;黃皓,教授,博導,研究方向為計算機網絡與安全、分布式計算。
注:本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文