零拷贝报文捕获要解决的几个问题,和现有的实现方法
2012-04-16 13:50
453 查看
零拷贝驱动,要解决几个问题。
一个是跨内核和用户空间的内存管理,一个是跨内核和用户空间的同步。最后是接口的易用性。
1.用户空间难以直接访问内核的内存。报文进来放到哪里,在用户空间我们是不知道的。
2.同步问题,报文进来用什么方式通知用户空间,系统调用?信号?还是什么?
3.如何提供一个用户透明的接口?
现在主流的实现方法有下面几种,
1.ntzc
2.UIO-IXGBE
3.PF_RING dna
4.Netmap
ntzc是sempian开发的一套零拷贝驱动。它通过CAS原子操作实现了多读多写的原子队列。利用这个原子队列来解决内核空间和用户空间的同步问题。内存管理通过分配一大块内存由自己管理,并映射到用户空间实现。实现了一个和内核协议栈sk_buff兼容的su_buff结构。网卡驱动所有对sk_buff的操作替换为对su_buff的操作,以此来接管协议栈对报文的控制。包括内存分配等一系列任务。
这套解决方案用CAS省去了系统调用的开销,用兼容的结构管理报文。可以做到较高的效率和驱动的复用性。但是,缺点是不通过系统调用不能支持堵塞访问,还有在系统运行一段时间后,由于内存碎片,分配大量的内存变得不可行。
UIO-IXGBE 可以看作用户空间的网卡驱动实现。把网卡的寄存器空间全部映射到用户空间。并且通过UIO-DMA提供在用户空间分配和释放DMA内存的能力。以此,把整个网卡驱动都移植到了用户空间来做。这样的效率无疑是非常高的。但是,由于用户空间没有中断机制。所以,有一个内核模块提供中断管理,PCI注册等基本业务,在网卡没有报文的时候,通过一个read系统调用来堵塞用户进程。
UIO-IXGBE的解决方案面临的最大问题是驱动复用的问题。基本上要重写驱动,所有现在只支持intel82598网卡。不过由于驱动在用户空间实现,使得用户程序对网卡NIC的控制灵活度很高,可以很好利用硬件特性。
PF_RING dna的代码量较大,而且不是完全开源的。还在研究中,待续。。。
Netmap据说效率很高,不过是在freeBSD上实现的。
一个是跨内核和用户空间的内存管理,一个是跨内核和用户空间的同步。最后是接口的易用性。
1.用户空间难以直接访问内核的内存。报文进来放到哪里,在用户空间我们是不知道的。
2.同步问题,报文进来用什么方式通知用户空间,系统调用?信号?还是什么?
3.如何提供一个用户透明的接口?
现在主流的实现方法有下面几种,
1.ntzc
2.UIO-IXGBE
3.PF_RING dna
4.Netmap
ntzc是sempian开发的一套零拷贝驱动。它通过CAS原子操作实现了多读多写的原子队列。利用这个原子队列来解决内核空间和用户空间的同步问题。内存管理通过分配一大块内存由自己管理,并映射到用户空间实现。实现了一个和内核协议栈sk_buff兼容的su_buff结构。网卡驱动所有对sk_buff的操作替换为对su_buff的操作,以此来接管协议栈对报文的控制。包括内存分配等一系列任务。
这套解决方案用CAS省去了系统调用的开销,用兼容的结构管理报文。可以做到较高的效率和驱动的复用性。但是,缺点是不通过系统调用不能支持堵塞访问,还有在系统运行一段时间后,由于内存碎片,分配大量的内存变得不可行。
UIO-IXGBE 可以看作用户空间的网卡驱动实现。把网卡的寄存器空间全部映射到用户空间。并且通过UIO-DMA提供在用户空间分配和释放DMA内存的能力。以此,把整个网卡驱动都移植到了用户空间来做。这样的效率无疑是非常高的。但是,由于用户空间没有中断机制。所以,有一个内核模块提供中断管理,PCI注册等基本业务,在网卡没有报文的时候,通过一个read系统调用来堵塞用户进程。
UIO-IXGBE的解决方案面临的最大问题是驱动复用的问题。基本上要重写驱动,所有现在只支持intel82598网卡。不过由于驱动在用户空间实现,使得用户程序对网卡NIC的控制灵活度很高,可以很好利用硬件特性。
PF_RING dna的代码量较大,而且不是完全开源的。还在研究中,待续。。。
Netmap据说效率很高,不过是在freeBSD上实现的。
相关文章推荐
- 安全字符串 SecureString 的设计与实现 [1] 现有问题与解决方法
- 山寨AjaxPro,解决分布式问题,实现主流接口,保留原版的API方法,唯一的不同是稍微修改下webconfig
- 阿里云配置ssl证书服务遇到的几个问题和解决方法
- cm13 编译过程中遇到的几个问题及解决方法
- 从一个实例浅谈J2ME Polish的build功能(三、polish应用过程中几个问题的解决方法)
- struts入门中的几个问题的解决方法
- struts2.5 使用感叹号和通配符实现动态方法调用无效的问题及解决!
- 通过自己制作网页解决几个简单问题的方法
- 关于实现引用类型数组去调用引用类的方法的问题的解决
- 关于html+ashx开发中几个问题的解决方法 (转)
- iOS 根据父视图布局的方法 以及实现 Scrollview 拉动 遮罩输入框问题解决
- 分享一下Mysql常见的几个错误问题及解决方法
- IEnumber<Model.Category> 实现接口对象没有Add()方法解决问题
- python由于版本问题而出现的几个常见Warning及解决方法
- 关于SQL的几个问题的解决方法
- Fedora17 几个问题的解决方法
- 如何解决实现接口后方法上面没有@override的问题
- 用SPSS做数据分析时遇到的几个小问题——解决方法!
- Notes 开发中的几个小问题及其解决方法
- Windows平台下C++插件系统实现的几个关键技术问题及其解决思路