拼接中的DMA拷贝()

时间:2011-09-28 15:41:10

标签: linux-kernel splice dma

我是linux内核的新手。最近,我已经通过内核2.6.33中的sendfile系统调用。以下是我旅程的顺序:

   do_sendfile()
=> do_splice_direct()
=> splice_direct_to_actor()
=> do_splice_to()
=> do_splice_from()
=> splice_read,splice_write

在整个序列中,我没有找到splice使用DMA拷贝的地方。那么DMA复制在哪里发生?

2 个答案:

答案 0 :(得分:4)

Splice不进行任何DMA复制。实际上,splice的主要用途是避免复制 - 它试图将引用传递给内存页而不是复制缓冲区。

关于splice提到的DMA将发生在“叶子” - 这些页面的原点是splice传递引用到周围将由例如磁盘控制器DMA创建到缓冲区中并且将由以太网控制器DMA的页面内容作为数据包的一部分 - 至少在一个“完美”零拷贝sceanrio,这是很难实现和罕见。

Splice不执行DMA - 它不会在第一个DMA到最后一个DMA之间进行复制。

答案 1 :(得分:1)

据我所知,splice_ *基础设施确实最大限度地减少了实际复制的数量。读者最多只能阅读作者正在填写的同一组页面。

LWN上有一些很好的文章描述了splice()的各个部分,包括新的系统调用。