Mel Gorman 的“Understanding the Linux Virtual Memory Manager”(2007 年)(这是本书章节链接 https://www.kernel.org/doc/gorman/html/understand/understand007.html#toc31) 描述内存区域 (vm_area_struct) 的标志:
VM_WRITE - 页面可以被写入
VM_MAYWRITE - 允许设置 VM_WRITE 标志
我不明白为什么 Linux 需要这两个标志,而不是其中之一。从上面的描述来看,听起来好像设置了VM_MAYWRITE,但没有设置VM_WRITE。在什么情况下? Linux 内核在这些情况下的行为有何不同?
例如,COW 机制根据 VM_MAYWRITE 标志检测受 COW 保护的页面(请参阅源代码 https://elixir.free-electrons.com/linux/v2.6.11/source/mm/memory.c#L303)。当设置VM_MAYWRITE时,Linux内核不会设置VM_WRITE标志吗?如果是,为什么不使用单个标志并从一开始就设置它呢?
内存保护级别可以更改,内核使用VM_MAY%
标志来确定是否允许此类更改。
从上面的描述来看,听起来好像设置了VM_MAYWRITE,但没有设置VM_WRITE。在什么情况下?
在内存最初是只读的并且您希望使其可写的情况下。
例如,COW 机制根据 VM_MAYWRITE 标志检测受 COW 保护的页面(请参阅源代码)。当设置VM_MAYWRITE时,Linux内核不会设置VM_WRITE标志吗?如果是,为什么不使用单个标志并从一开始就设置它呢?
不,事实并非如此。is_cow_mapping()
不是检查内存是否可写,而是检查内存是否可以通过以下方式写入mprotect()
。如果不能,那么它显然不是 COW 映射!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)