【发布时间】:2020-02-23 15:44:04
【问题描述】:
我搜索了很多资源,但没有发现任何具体的问题:
我知道在某些 linux 系统中,fork() 系统调用适用于写时复制;也就是父子共享同一个地址空间,但是PTE现在被标记为read-only,供COW以后使用。当任一尝试访问页面时,会出现PAGE_FAULT,并且该页面被复制到另一个可以修改的地方。
但是,我无法理解操作系统如何到达共享 PTE 以将它们标记为“已读”。我假设当 fork() 系统调用发生时,操作系统会在父页面表上执行“页面遍历”并将它们标记为 只读 - 但我没有找到对此的确认,或者任何有关流程的信息。
有人知道这些页面是如何被标记为只读的吗?将不胜感激任何帮助。谢谢!
【问题讨论】:
-
Linus 的操作系统“Linux”确实在 fork 系统调用实现中的 VMA 上运行:
do_fork->copy_process->copy_mm->dup_mm->dup_mmap... 我在这里无法获得确切的行,因此 Internet 搜索机提示“fork+COW+dup_mm”为 gist.github.com/cwshu/7d52bc993525c1bb7df1 - 所以真正的工作在retval = copy_page_range(mm, oldmm, mpnt);行 - 检查 mm/memory.c#L1005
标签: linux-kernel fork virtual-memory copy-on-write page-tables