您的位置:首页 > 其它

零拷贝报文捕获要解决的几个问题,和现有的实现方法

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上实现的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  freebsd 任务