AFAIK, на linux ядре, MS_INVALIDATE на самом деле мало что делает, это от мсин c. c
Единственное использование - эта проверка.
/* Here vma->vm_start <= start < vma->vm_end. */
if ((flags & MS_INVALIDATE) &&
(vma->vm_flags & VM_LOCKED)) {
error = -EBUSY;
goto out_unlock;
}
Раньше linux системы имели отдельные хранилища для ввода / вывода, поступающих через системные вызовы записи / чтения (так называемый буферный кэш), и другое (кэш страницы), на которое отображает mmap. Однако сейчас большинство систем на базе unix имеют глобальный унифицированный кеш, то есть, независимо от того, откуда поступает ввод / вывод, он попадает в один и тот же внутренний буфер памяти. Конечно, реализация намного сложнее, чем кажется, но MS_INVALIDATE кажется мне бесполезным на большинстве UNIX систем.
Некоторые ссылки: link1 link2