我是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复制在哪里发生?
答案 0 :(得分:4)
Splice不进行任何DMA复制。实际上,splice的主要用途是避免复制 - 它试图将引用传递给内存页而不是复制缓冲区。
关于splice提到的DMA将发生在“叶子” - 这些页面的原点是splice传递引用到周围将由例如磁盘控制器DMA创建到缓冲区中并且将由以太网控制器DMA的页面内容作为数据包的一部分 - 至少在一个“完美”零拷贝sceanrio,这是很难实现和罕见。
Splice不执行DMA - 它不会在第一个DMA到最后一个DMA之间进行复制。
答案 1 :(得分:1)
据我所知,splice_ *基础设施确实最大限度地减少了实际复制的数量。读者最多只能阅读作者正在填写的同一组页面。
LWN上有一些很好的文章描述了splice()的各个部分,包括新的系统调用。