6

根据http://www.solacesystems.com/blog/kernel-bypass-revving-up-linux-networking

[...] 一个名为 OpenOnload 的网络驱动程序,它使用“内核绕过”技术在用户空间中一起运行应用程序和网络驱动程序,并且绕过内核。这允许连接的应用程序端以更低和更一致的延迟每秒处理更多消息。

[...]

如果你是一名开发人员或架构师,多年来一直在与上下文切换作斗争,内核绕过可能会感觉像是在作弊,但幸运的是它完全在规则之内。

进行这种内核绕过需要哪些功能?

4

3 回答 3

2

TCP 卸载引擎将“正常工作”,无需特殊的应用程序编程。它并没有绕过整个内核,只是将一些 TCP/IP 堆栈从内核移动到网卡,因此驱动程序级别略高。内核 API 是相同的。

大多数现代千兆接口都支持 TCP 卸载引擎。

或者,如果您的意思是“在 SolarFlare 网络适配器的嵌入式处理器/FPGA '应用程序加载引擎'上运行代码”,那么......这是特定于卡的。您基本上是在为嵌入式系统编写代码,因此您需要说明您使用的是哪种卡。

于 2013-03-29T12:17:14.083 回答
1

好的,所以在不知道内核如何处理网络堆栈的情况下,这个问题不能直接回答。

一般来说,网络堆栈由很多层组成,最低的一层是实际的硬件,通常这个硬件由驱动程序支持(每个网络接口一个),网卡通常提供非常简单的接口,想想接收并发送原始数据。

在这个物理连接之上,具有接收和发送数据能力的是许多协议,它们也是分层的,靠近底部的是 ip 协议,它基本上允许您指定信息的接收者,而在顶部您会发现支持稳定连接的 TCP。

所以为了回答你的问题,你首先要弄清楚你需要替换网络堆栈的哪一部分,以及你需要做什么。根据我对您问题的理解,您似乎希望保留原始网络堆栈,然后有时使用您自己的,在这种情况下,您实际上应该只实现策略模式,并可以说明哪些数据包应该由网络堆栈的顶层处理。

根据 linux 中网络堆栈的实现方式,您可能无法实现这一点,而无需更改内核。在微内核架构中,网络堆栈的每个部分都在其自己的服务中实现,这将是微不足道的,因为您只需将网络堆栈的较低部分通过管道传输到您的策略模式,并将此管道输入到所需的网络顶层。

于 2013-03-29T12:09:06.747 回答
1

您是否想发送和接收原始 IP 数据包?

基本上,您需要在 ip-packet 中填写标头和数据。这里有一些关于如何发送原始以太网数据包的示例::http: //austinmarton.wordpress.com/2011/09/14/sending-raw-ethernet-packets-from-a-specific-interface-in-c-在Linux上/

要自己处理 TCP/IP,我认为您可能需要在自定义内核中禁用 TCP 驱动程序,然后编写自己的读取原始 ip 的用户空间服务器。

虽然它可能没有那么有效......

于 2013-03-29T12:21:02.710 回答