如果父母与另一个进程共享某些页面,我们会分叉父进程。据我所知,孩子复制了页面表,我们将页面设置为只读,然后进行Copy-On-Write。但如果我们写入错误的话,这将创建共享内存页面的副本。 Linux内核如何避免这种情况?
答案 0 :(得分:6)
内核知道使用共享内存操作分配了哪些内存页。当孩子分叉时,这些页面没有标记为Copy-on-Write,因此它们将在所有进程中保持共享。
这记录在vm_area_struct
成员的vm_flags
数据结构中。其中一个标志是VM_SHARED
。 mm / memory.c包含以下函数,用于确定页面是否应转换为COW
static inline int is_cow_mapping(vm_flags_t flags)
{
return (flags & (VM_SHARED | VM_MAYWRITE)) == VM_MAYWRITE;
}
如果您想了解有关如何设置和使用此标志的更多信息,请转到Linux Cross Reference并搜索VM_SHARED。