有赠品和无赠品的vmsplice(2)的语义是什么?

jac*_*bsa 5 linux linux-kernel splice zero-copy

我试图了解vmsplice(2)syscall 的功能(此处的手册页)。关于SPLICE_F_GIFT标志的作用,我有两个问题:

  1. 手册页指出,一旦将页面赠予内核,就不能再修改内存。这是否意味着该内存将永远固定,还是可能指的是赠礼过程无法映射的虚拟内存,而不是物理内存?换句话说,这种用法的典型用法是什么样的?

  2. 如果我不设置SPLICE_F_GIFTvmsplice(2)与矢量化写syscall 有什么不同writev(2)吗?

Val*_*uca 0

这是否意味着内存被永远固定,或者它是否可能指的是可以通过赠送过程取消映射的虚拟内存,而不是物理内存?换句话说,它的典型用途是什么样的?

您承诺不修改该页面。不是页面的虚拟寻址。对于大多数用例,建议操作类似于:

mmap
read
vmsplice
munmap
Run Code Online (Sandbox Code Playgroud)

一般来说,您需要使用mmapovermalloc来确保您拥有一个页面,而不仅仅是 4096 字节的 RAM。它可以位于 2MB 或 1GB 的中间HUGE_PAGE(如果您的分配器确定这更有效)。

如果我不设置 SPLICE_F_GIFT,vmsplice(2)与矢量化写入系统调用有什么不同writev(2)

是的

内核中的大多数缓冲区都是管道。或者实际上管道由与缓冲区相同的数据结构表示。