- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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:只读访问内核代码区
由于内核的数据是关键数据,是不允许进程随意修改,那么进程映射物理内存时使用只读映射,这样就保证了内核数据的安全性。
您可能关注的文档
- 开放教育学习指南课题.doc
- 开放教育学习指南省校作业.doc
- 开放教育学习指南试题答案2011.doc
- 开放教育学习指南试题总汇.doc
- 开放教育学习指南网上答案.doc
- 开放教育学习指南习题.doc
- 开放教育学习指南选择判断题.doc
- 开放教育学习指南选择题.doc
- 开放教育学习指南选择题2.doc
- 开放教育学习指南选择题答案.doc
- 2025年一级建造师考试《水利水电工程管理与实务》冲刺必刷卷.docx
- 2025年一级建造师考试《水利水电工程管理与实务》逆袭破题卷1.docx
- 2025年一级建造师考试《市政工程管理与实务》冲刺必刷卷 .docx
- 2025年一级造价工程师考试《建设工程计价》预习卷.docx
- 2025年一级造价工程师考试《建设工程造价管理》预习卷.docx
- 2025年一级造价工程师考试《建设工程造价案例分析(安装专业)》预习卷.docx
- 2025年一级造价工程师考试《建设工程造价案例分析(土建专业)》预习卷.docx
- 2025年中级会计考试《会计实务》冲刺提分卷.docx
- 2025年中级会计考试《财务管理》冲刺提分卷.docx
- 2025年中级会计考试《财务管理》全真模拟卷.docx
文档评论(0)