执行从Linux内核缓冲区到硬盘的零拷贝数据移动

时间:2010-09-20 19:19:55

标签: linux-kernel

我正在尝试将数据从内核空间中的缓冲区移动到硬盘中 磁盘,而不必从内核缓冲区到任何额外的副本 用户缓冲区或任何其他内核缓冲区。任何想法/建议都会 最有帮助的。

用例基本上是一个demux驱动程序,它将数据收集到一个 内核空间中的demux缓冲区必须清空此缓冲区 定期将内容复制到基于FUSE的分区上 磁盘。当缓冲区变满时,会发出用户进程的信号 确定磁盘上需要复制内容的扇区号 到。

我希望将上面的demux内核缓冲区映射到用户地址 空间并向原始分区设备发出写入系统调用。但 从我所看到的,这些数据正由内核缓存 通往硬盘驱动器的方法。所以我假设这涉及到 Linux内核的其他副本。

此时我想知道是否还有其他机制可以做到这一点 不涉及内核的其他副本。我意识到这是一个 非嵌入式环境的不正常使用场景,但我愿意 感谢任何有关可能选项的反馈。

BTW - 我在打开原始分区时尝试使用O_DIRECT,但是 如果传递的缓冲区是,则后续的写调用将失败 mmapped缓冲区。

感谢名单!

1 个答案:

答案 0 :(得分:2)

你需要将你的demux缓冲区公开为文件描述符(大概,如果你正在使用mmap()那么你已经这样做了 - 很棒!)。

在内核方面,您需要实现splice_read的{​​{1}}成员。

在用户空间方面,创建一个struct file_operations,然后使用pipe()两次 - 一次将数据从demux文件描述符移动到管道中,第二次从管道移动数据到磁盘文件。使用splice()标志。

SPLICE_F_MOVE手册页中所述,它可以通过复制对内核内存页面的引用而不是页面本身来避免实际的副本。