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