零拷贝技术研究与实现

零拷贝技术研究与实现

ID:35504053

大小:86.12 KB

页数:10页

时间:2019-03-25

零拷贝技术研究与实现_第1页
零拷贝技术研究与实现_第2页
零拷贝技术研究与实现_第3页
零拷贝技术研究与实现_第4页
零拷贝技术研究与实现_第5页
资源描述:

《零拷贝技术研究与实现》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、2文章提交:firstdoi(firstdot_at_l63.com)零拷贝技术研究与实现作者:梁健(firstdot)E-MAIL:firstdot@163.com感谢王超、史晓龙的共同研究与大力帮助一.基本概念零拷贝(zero-copy)基本思想是:数据报从网络设备到用户程序空间传递的过程中,减少数据拷贝次数,减少系统调用,实现CPU的零参与,彻底消除CPU在这方面的负载。实现零拷贝用到的最主要技术是DMA数据传输技术和内存区域映射技术。如图1所示,传统的网络数据报处理,需要经过网络设备到操作

2、系统内存空间,系统内存空间到用户应用程序空I'可这两次拷贝,同吋还需要经历用户向系统发出的系统调用。而零拷贝技术则首先利用DMA技术将网络数据报直接传递到系统内核预先分配的地址空间中,避免CPU的参与;同时,将系统内核中存储数据报的内存区域映射到检测程序的应用程序空间(还有一种方式是在用户空间建立一缓存,并将其映射到内核空间,类似于liniix系统下的kiobuf技术),检测程序直接对这块内存进行访问,从而减少了系统内核向用户空间的内存拷贝,同时减少了系统调用的开销,实现了真正的“零拷贝图1传统数

3、据处理与零拷贝技术之比较二.实现在redhat7.3±通过修改其内核源码中附带的8139too.c完成零拷贝的试验,主要想法是:在8139too网卡驱动模块启动时申请一内核缓存,并建立一数据结构对其进行管理,然后试验性的向该缓存写入多个字符串数据,最后通过proc文件系统将该缓存的地址传给用户进程;用户进程通过读proc文件系统取得缓存地址并对该缓存进行地址映射,从而可以从其中读取数据。哈哈,为了偷懒,本文只是对零拷贝思想中的地址映射部分进行试验,而没有实现DMA数据传输(太麻烦了,还得了解硬件)

4、,本试验并不是一个IDS产品中抓包模块的一部分,要想真正在IDS中实现零拷贝,除了DMA外,还有一些问题需考虑,详见本文第三节的分析。以下为实现零拷贝的主要步骤,详细代码见附录。步骤一:修改网卡驱动程序a.在网卡驱动程序中申请一块缓存:由于在linux2.4.X内核中支持的最大可分配连续缓存大小为2M,所以如果需要存储更大量的网络数据报文,则需耍分配多块非连续的缓存,并使用链表、数组或hash表来对这些缓存进行管理。#definePAGES_ORDER9unsignedlongsul_2sul_2

5、=_get_free_pages(GFP_KERNEL,PAGES_ORDER);b.向缓存中写入数据:真正IDS产品中的零拷贝实现应该是使用DMA数据传输把网卡硬件接收到的包直接写入该缓存。作为试验,我只是向该缓存中写入几个任意的字符串,如果不考虑DMA而又想向缓存中写入真正的网络数据包,可以在8139too.c的rtl8139_rx_interrupt()中调用netif_rx()后插入以下代码://put_pkt2mem_n++;〃包个数//put_mem(skb->data,pkt_siz

6、e);其中put_pkt2mem_n变量和put_mem函数见附录。a.把该缓存的物理地址传到用户空间:由于在内核中申请的缓存地址为虚拟地址,而在用户空间需要得到的是该缓存的物理地址,所以首先要进行虚拟地址到物理地址的转换,在linux系统中可以使用内核虚拟地址减3G來获得对应的物理地址。把缓存的地址传到用户空间需要在内核与用户空间进行少量数据传输,这可以使用字符驱动、proc文件系统等方式实现,在这里采用了proc文件系统方式。intread_procaddr(char*buf,char**st

7、art,offLtoffset,intcount,int*eof,void*data){sprintf(buf,"%uH,_pa(sul_2));*eof=1;return9;}create_proc_read_entry("nfLaddr",0,NULL,read_procaddr,NULL);步骤二:在用户程序屮实现对共享缓存的访问a.读取缓存地址:通过直接读取proc文件的方式便可获得。charaddr[9];intfd_procaddr;unsignedlongADDR;fd_proc

8、addr=open('7proc/nf_addr",O_RDONLY);read(fd_procaddr,addr,9);ADDR=atol(addr);b.把缓存映射到用户进程空间屮:在用户进程屮打开/dev/mem设备(相当于物理内存),使用mmap把网卡驱动程序屮请的缓存映射到自己的进程空间,然后就可以从中读取所需要的网络数据包了。char*sul_2;intfd;fd=open(7dev/memn,O_RDWR);sul_2=mmap(0,PAGES*4*1024,PROT

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。