实现网卡的内核旁路

我的情况:

我希望网卡上收到的数据尽快到达我的应用程序。 我已经得出结论,最好的(如最低延迟)解决scheme是在我的用户空间中实现networking堆栈。

networkingstream量可以是专有协议(如果它使得networking堆栈更容易写入),因为它只是在两台本地计算机之间。

1)什么是我的networking堆栈需要实现的function的最低限度清单?

2)我需要删除/禁用当前在我的Linux中的任何networking堆栈/我将如何做到这一点?

3)我如何写驱动程序 我认为我需要find驱动程序代码的确切位置,然后代替被调用的驱动程序/networking堆栈,而是将数据发送到我可以从应用程序访问的一块内存中。

我认为已经内置的PF_PACKET套接字类型正是你想要实现的。

缺点:应用程序必须以root权限启动。

本页介绍的PF_PACKET系统有一些增强功能: Linux数据包mmap

内核控制着NIC卡。 无论何时在内核和用户空间之间传递数据,在内核环之间都有一个上下文切换,这是很昂贵的。 我的理解是,您将使用标准API,同时将缓冲区设置为更大的大小,以允许在用户和内核空间之间一次复制更大的数据块,从而减少给定大小数据的上下文切换次数。

就实现你自己的堆栈而言,一个人不太可能创建比内核中更快的网络堆栈。

如果linux内核无法以所需的速度处理数据包,则可能需要调查具有更多板载硬件处理能力的NIC卡。 这些东西用于网络吞吐量测试等。