每http://www.solacesystems.com/blog/kernel-bypass-revving-up-linux-networking:
[...]一个名为OpenOnload的网络驱动程序,它使用“内核旁路”技术在用户空间中一起运行应用程序和网络驱动程序,并绕过内核。这允许连接的应用程序端每秒处理更多消息,并且延迟更低且更一致。
[...]
如果您是一名多年来与上下文切换斗争的开发人员或架构师,内核旁路可能会感觉像是作弊,但幸运的是,这完全符合规则。
进行此类内核绕过所需的功能是什么?
答案 0 :(得分:2)
TCP offload engine将“正常工作”,无需特殊的应用程序编程。它没有绕过整个内核,只是将一些TCP / IP堆栈从内核移动到网卡,因此驱动程序略高一些。内核API是相同的。
大多数现代千兆位接口都支持TCP卸载引擎。
或者,如果您的意思是“在SolarFlare网络适配器的嵌入式处理器/ FPGA'应用程序上载引擎上运行代码'”,那么......这是特定于卡的。你基本上是在为嵌入式系统编写代码,所以你需要说明你正在使用哪种卡。
答案 1 :(得分:1)
好的,所以如果不知道内核如何处理网络堆栈,问题就不能直接回答。
在基础上,网络堆栈由许多层组成,最低层是实际硬件,通常这些硬件由驱动程序支持(每个网络接口一个),nic通常提供非常简单的接口,认为收到并发送原始数据。
在这个物理连接之上,能够接收和发送数据的是很多协议,它们也是分层的,靠近bottem是ip协议,它基本上允许你指定信息的接收者,而在顶部你会找到支持稳定连接的TCP。
因此,为了回答您的问题,您首先要弄清楚您需要更换的网络堆栈的哪个部分,以及您需要做什么。根据我对你的问题的理解,似乎你想要保留原始的网络堆栈,然后有时只使用你自己的,在那种情况下你应该真正实现策略模式,并且可以说明哪些数据包应该由网络堆栈的顶层处理。
根据Linux中如何实现网络堆栈,您可能会也可能无法实现此目标,而无需更改内核。在微内核架构中,网络堆栈的每个部分都在自己的服务中实现,这将是微不足道的,因为您只需将网络堆栈的较低部分传输到策略模式,并使此管道输入到所需的网络顶层。
答案 2 :(得分:1)
您是否想要发送和接收原始IP数据包?
基本上你需要在ip-packet中填写标题和数据。 这里有一些关于如何发送原始以太网数据包的示例: :http://austinmarton.wordpress.com/2011/09/14/sending-raw-ethernet-packets-from-a-specific-interface-in-c-on-linux/
要自己处理TCP / IP,我认为你可能需要在自定义内核中禁用TCP驱动程序,然后编写自己的用户空间服务器来读取原始ip。
虽然可能效率不高......