Linux kernel Linux内核如何管理通过DMA传递给用户程序的数据?

Linux kernel Linux内核如何管理通过DMA传递给用户程序的数据?,linux-kernel,linux-device-driver,dma,Linux Kernel,Linux Device Driver,Dma,我读到,在一些网络驱动程序中,可以通过DMA将数据包直接传递到用户内存中。在这种情况下,内核的TCP/IP堆栈怎么可能处理数据包呢?简单的回答是它没有。数据不会一次在多个位置进行处理,因此,如果网络数据包直接传递给用户空间程序,那么内核就不会对它们进行任何处理;它被绕过了。这将由用户空间程序来处理 这方面的一个例子出现在我不久前的一个设备驱动程序类中:高频股票交易。有一篇文章是关于这样一种实现的。其想法是交易者希望他们的信息尽可能快,因此他们使用精心编制的数据包,当接收到这些数据包时(通过同样专

我读到,在一些网络驱动程序中,可以通过DMA将数据包直接传递到用户内存中。在这种情况下,内核的TCP/IP堆栈怎么可能处理数据包呢?

简单的回答是它没有。数据不会一次在多个位置进行处理,因此,如果网络数据包直接传递给用户空间程序,那么内核就不会对它们进行任何处理;它被绕过了。这将由用户空间程序来处理

这方面的一个例子出现在我不久前的一个设备驱动程序类中:高频股票交易。有一篇文章是关于这样一种实现的。其想法是交易者希望他们的信息尽可能快,因此他们使用精心编制的数据包,当接收到这些数据包时(通过同样专业的硬件),它们直接呈现给交易者程序,绕过内核中相对高延迟的TCP/IP堆栈。以下是链接文章的一段摘录,内容涉及两种特殊网卡:

这两种卡都提供内核旁路驱动程序,允许您在用户空间中通过TCP和UDP发送/接收数据。上下文切换是一种需要避免的昂贵(高延迟)操作,因此您希望所有关键处理都发生在用户空间(或内核空间,如果愿意的话)


这种技术几乎可以用于任何需要最小化用户程序和硬件之间延迟的应用程序,但正如您的问题所暗示的,这意味着内核处理此类事务的正常机制将被绕过。

网络芯片可以有寄存器条目,可以过滤每个IP/UDP/TCP+端口,并通过特殊设置的DMA描述符将这些数据包路由到。如果您通过驱动程序和MMAP将DMA-able内存预分配给用户空间,则可以轻松地将特定的流量流完全路由到用户空间,而无需任何内核代码


我以前在视频平台上工作。网络入口由FPGA完成。一旦配置完毕,它可以将10Gbits的UDP数据包路由到系统中,并自动将某些MPEG PS PID匹配的数据包路由到CPU。它可以在非常低端的FPGA中以10gbits线速将一些其他视频/音频数据包过滤到系统的其他部分

@slawon,但问题不是如何在驱动程序中添加DMA;我很好奇IP stacl将如何处理入口数据包,如果它们将通过DMA被放置在用户内存中,因为tcp/IP与内核内存一起工作。啊。。。你在问内核交易如何处理TCP/IP数据包,如果它们是。。。由于缺少更好的术语,通过共享DMA缓冲区将“给定”给用户空间程序,因为这实际上会绕过内核对数据包的处理。这是正确的吗?我以为你的问题是问如何从用户空间获取DMA缓冲区。没错,这就是我想要理解的。我认为,在网络驱动程序中,不太可能将数据包直接DMA到用户空间并完全绕过tcp/ip堆栈。例如,它更适合于视频处理软件。@马克,我完全根据你的评论更改了我的答案。如果我遗漏了什么,请告诉我。