Linux中的内存区域标志:为什么需要VM_WRITE和VM_MAYWRITE?

时间:2018-01-13 15:14:02

标签: linux linux-kernel kernel virtual-memory

Mel Gorman的“理解Linux虚拟内存管理器”(2007)(这里是link to the book chapter)描述了内存区域的标志(vm_area_struct):

  

VM_WRITE - 可以编写页面

     

VM_MAYWRITE - 允许设置VM_WRITE标志

我不明白为什么Linux需要这两个标志,而不仅仅是其中一个标志。从上面的描述中,听起来像设置VM_MAYWRITE而VM_WRITE不是。在什么情况下?在这些情况下,Linux内核的表现如何?

例如,COW机制根据其VM_MAYWRITE标志检测受COW保护的页面(请参阅source code)。设置VM_MAYWRITE时,Linux内核是否设置了VM_WRITE标志?如果是的话,为什么不用一个标志并从头开始设置?

1 个答案:

答案 0 :(得分:1)

可以更改内存保护级别,内核使用VM_MAY%标志来确定是否允许此类更改。

  

从上面的描述中,听起来像设置VM_MAYWRITE而VM_WRITE不是。在什么情况下?

在内存最初是只读的情况下,您希望使其可写。

  

例如,COW机制根据其VM_MAYWRITE标志检测受COW保护的页面(请参阅源代码)。在设置VM_MAYWRITE时,Linux内核是否设置了VM_WRITE标志?如果是的话,为什么不用一个标志并从头开始设置?

不,它没有。 is_cow_mapping()没有检查内存是否可写,它正在检查内存是否可以通过mprotect()写入。如果它不能,那么它显然不是COW映射!