Linux中的vmsplice()系统调用是否存在反向操作?

时间:2013-04-09 23:31:34

标签: memory-management linux-kernel ipc

vmsplice系统调用允许使用“SPLICE_F_GIFT”标志从一组用户级页面实现对管道的零拷贝发送。我的问题是是否存在反向操作,例如,我是否可以在管道的另一端有一个不仅仅是read()aio_read()管道的进程,而是进行简单映射的操作管道数据进入其地址空间?这最终意味着从发送器到接收器进程的存储器映射的传输(移动)而没有任何复制。这可能吗?

编辑:我的用例如下所示。我有两个进程A和B.A生成数据(>兆字节)并希望将其传递给B进行进一步处理然后终止。我想避免复制,只是告诉内核'看我在这里有这些页面,不再需要它们了。请将它们附加到B的地址空间并完成它。'。

简单共享内存对我不起作用,因为A发送的内存可能在其地址空间中的任何位置,除非我限制A使用特定的内存分配器,该分配器适用于共享内存或临时文件,我喜欢避免。

2 个答案:

答案 0 :(得分:3)

我认为您正在寻找process_vm_readvprocess_vm_writev

  

这些系统调用在地址空间之间传输数据   调用进程(“本地进程”)和进程   由pid识别(“远程过程”)。数据直接移动   在两个进程的地址空间之间,没有通过   通过内核空间。

有关详细信息,请参见手册页。

答案 1 :(得分:0)

nope没有与vmsplice操作相反的情况,现在有一个项目正在将DBUS放入内核中,你可能想看看它。我也有相同的要求,正在调查这整个vmsplice的事情。