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

  • 手册页指出,一旦将页面赠予内核,就永远不能再次修改内存。这是否意味着内存将被永久固定,或者它是指可以由赠礼过程取消映射的虚拟内存,而不是物理内存?换句话说,这种用法的典型用法是什么?
  • 如果未设置SPLICE_F_GIFTvmsplice(2)与像writev(2)这样的矢量化写入系统调用有什么不同吗?
  • 最佳答案



    您保证不会修改页面。不是页面的虚拟地址。对于大多数用例,建议操作类似于:

    mmap
    read
    vmsplice
    munmap
    

    通常,您要使用mmap而不是malloc,因为要确保您拥有一个页面,而不仅仅是4096bytes的RAM。如果分配器确定效率更高,则该位置可能位于2MB或1GB的HUGE_PAGE中间。



    是的

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

    09-25 19:28