零拷贝技术交流文档.docVIP

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
本文档的Copyleft归wwwlkk所有,使用GPL发布,可以自由拷贝、转载,转载时请保持文档的完整性,严禁用于任何商业用途。 E-mail: wwwlkk@126.com 来源: /?businessaid=6un=wwwlkk#7 零拷贝技术交流文档 目录: (一)linux中的分页机制 1 (二)实现零拷贝的两个理论方案 2 (三)为防火墙定制的零拷贝技术方案 3 (四)参考文献 5 前言:零拷贝技术是比较实用的技术,但是网络上很少有人介绍这种技术的实现原理,本文的目的就是详细的讲解零拷贝的实现原理,但是不讨论技术细节,因为技术细节不好表述,而且不同的需求或者不同的程序员,都会选择不同技术来实现,但是最终的实现原理是不变的。 (一)linux中的分页机制 CPU要访问某块物理内存,必须要获得内存的物理地址,CPU集成有寻址硬件,会根据机器语言指令中提供的地址,执行地址转换,获得的物理地址。 CPU有两种转换模式:1.实模式 2.保护模式。实模式下的物理地址=线性地址,保护模式下的物理地址=线性地址通过分页机制转化为物理地址。 启动保护模式:把CPU控制寄存器CR0中的最高位置1。 CPU保护模式寻址方式: 图1 分页机制寻址 说明:CR3控制寄存器的值是物理地址。由于寻找的是页框的物理地址,页框的物理地址是4096的整数倍,所以CR3,页目录和页表中存储的物理地址后12位都为0。也就是这12位的空间不存储物理地址信息,而是用于存储访问控制信息(可读/可写/CPU特权级别),或者对应的页是否存在等信息。 其中访问控制信息(可读/可写/CPU特权级别)可以特别利用:例如:如果某个页框的范围控制标记是只读的,那么进程如果对这个页框进行写操作,就会产生段错误。 注意:从2.6.11版本开始,采用了四级分页模型ntzc PF_RING PACKET_MMAP 其中ntzc是真正意义上的零拷贝,PACKET_MMAP还带有一次的数据拷贝,PF_RING还没分析过,初步判断和PACKET_MMAP差不多,也应该带有一次数据拷贝。 (三)为防火墙定制的零拷贝技术方案 上面就是零拷贝的技术原理,也已经有了3个零拷贝的实现模块,但是这3个模块都不是为防火墙定制的,都有各自的局限性: ntzc并不经过协议栈,而是由驱动层到应用层,再到驱动层。 PACKET_MMAP还有一次的数据拷贝(PF_RING应该也类似)。 所以,有必要为防火墙定制一个零拷贝模块,具备以下功能: 不会降低防火墙原来的处理性能。 和防火墙可以并发的处理数据。 下面给出关键的技术点: 技术点1:物理内存映射 如图2所示:左边是系统的物理内存,以及内核是如何划分物理内存的;右边是某个进程的线性地址空间,进程在用户态可使用的线性空间大小是3G。 假设,物理内存是512M,那么进程初始化时分配512M连续的线性空间用于映射物理内存(通过/dev/mem可以做到),假定这块线性空间的起始地址是start,某块内存的物理地址是0x1234,在进程内使用*(start+0x1234)就可以访问到这块内存。 补充1:有可能实际的物理内存很大,比如2G,4G,一个进程的线性空间不够映射,那么可以使用多个进程来映射。 补充2:图1中的高速缓存是用于设备的高速缓存。 图2 物理内存映射 技术点2:skb对象和skb-data指向的内存块是连续的物理内存 通过分析slab的代码,可以看到skb对象和skb-data指向的内存块是使用get_free_page分配的,也就是说每个对象是连续的物理内存,那么只要知道对象的物理地址和大小就可以访问到整个对象。 补充1:通过vmalloc分配的物理内存的线性地址空间是连续的,但是物理内存可能不是连续的,所以为什么vmalloc分配的内存空间会比较大,就是因为它不受连续物理空间的限制。 使用以上2个技术点可以实现的功能: 1. 有2个环A,B,内核释放skb时,将不会马上释放,而是把,skb和skb-data的线性地址和物理地址写入环A。 2. 进程从环中获得skb-data的物理地址,通过技术点1访问数据包的内容,并打印出ip层的内容,最后将skb的线性地址写入环B。 3. 内核访问环B,释放里面的skb。 技术点3:可以通过netfilter挂钩机制,获取skb以及skb-data的物理地址。 技术点4:灵活使用skb的引用计数 skb有一个引用计数,如果引用技术减为0时,内核才会真正的释放skb,那么如果某个skb进入零拷贝环,此时需要增加skb的引用计数,这样内核和应用进程就都可以安全的使用skb。 技术点5:只读访问内核代码区 由于内核的数据是关键数据,是不允许进程随意修改,那么进程映射物理内存时使用只读映射,这样就保证了内核数据的安全性。

文档评论(0)

word.ppt文档 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档