我一直在尝试了解此标志的正确用法,但互联网上存在冲突的信息。
我的理解是,该标志当前在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()
的设置行为。