Linux 零拷贝网络中是否一定存在内核内副本?

Linux 零拷贝网络中是否一定存在内核内副本?

我在互联网上看到一些Linux零拷贝网络示例图解,如下所示:

常见的IO例子:

1

零拷贝IO示例:

2

我发现它消除了 CPU 副本;它还消除了通常的内核缓冲区副本。

我感兴趣的是,当我接收网络数据并将其映射到用户空间时,是否涉及内核内副本?从“NIC 缓冲区”到“套接字缓冲区”的副本;或者这两者可以是同一件事吗?

据我了解,在高端网卡上,“网卡缓冲区”可能位于网卡自己的内存中;那么我的假设尝试会尝试 mmap NIC 的内存吗? (是否可以?)

基本上我感兴趣的是“DMA 复制”对于 NIC 意味着什么 - 它是否意味着从“线路”复制到可以 mmap 的内核缓冲区(反之亦然),或者是否一定意味着有一个副本在一些中间 NIC 缓冲区(从“线路”填充)和可由用户空间使用的内核缓冲区之间。

无论如何,我可以绕过“套接字缓冲区”直接将数据获取到用户空间吗?我猜想类似于 O_DIRECT 与磁盘 IO。 (我不是在谈论完全的内核绕过。)

我想知道它如何在我常用的 x86-64 Linux 机器上工作,以及它如何在当前相同的高端架构上工作。

相关内容