我一直在尝试了解此标志的正确用法,但互联网上存在冲突的信息。

我的理解是,该标志当前在Linux内核中为no-op。
https://github.com/tinganho/linux-kernel/blob/master/mm/msync.c

是否由于历史原因(设计选择)添加了此标志?

最佳答案

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

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

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

根据(来自Linux手册页项目3.74发行版的一部分msync(2)),这是有道理的:



因为如果链接到vma列表的任何文件映射都被锁定,则无法使它无效,因此在其他情况下(否则未设置MS_INVALIDATE标志)调用将失败。

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

08-26 10:26