历史与当前使用的MS_INVALIDATE

时间:2016-07-31 23:24:25

标签: linux linux-kernel

我一直试图了解这个标志的正确用法,但互联网上有相互矛盾的信息。

我的理解是这个标志目前在linux内核中是无操作的。 https://github.com/tinganho/linux-kernel/blob/master/mm/msync.c

由于添加了此标志而导致的任何历史原因(设计选择)?

1 个答案:

答案 0 :(得分:0)

msync.c的代码中,您可以看到:

    if ((flags & MS_INVALIDATE) &&
            (vma->vm_flags & VM_LOCKED)) {
        error = -EBUSY;
        goto out_unlock;
    }

基本上,我们知道正在评估MS_INVALIDATE,如果vma指向的当前映射被锁定,msync()调用将失败并显示EBUSY

根据(来自 Linux man-pages项目的3.74版本的部分,msync(2) )这是有道理的:

  

MS_INVALIDATE要求使同一文件的其他映射无效(所以   他们可以用刚刚写好的新值来更新。

因为如果链接到vma列表的任何文件映射被锁定,则它不能被无效,因此否则调用将失败(否则不会设置MS_INVALIDATE标志)它将不会。

所以,现在回答你的问题,它不能被视为无操作,因为它在设置时会影响msync()的行为。