fork 函数将两个进程中的每个页面标记为只读?

fork 函数将两个进程中的每个页面标记为只读?

我正在读一本教科书,其中讨论了如何fork()使用虚拟内存:

当当前进程调用fork函数时,内核为新进程创建各种数据结构,并为其分配唯一的PID。为了为新进程创建虚拟内存,它会创建当前进程的 mm_struct、区域结构和页表的精确副本。它标记了每个页面两个进程都是只读的,并将两个进程中的每个区域结构标记为私有写时复制

我不明白为什么它需要将两个进程中的每个页面标记为只读。如果父进程中的每个页面都是只读的,那么父进程将永远无法修改一些未初始化的全局变量(在.bss部分中),那么该程序将如何运行呢?

答案1

如果父进程的页面映射保持可写,则父进程所做的任何更改都将直接应用,并且由于物理页面是共享的,因此子进程也可以看到它。将两个映射设置为只读可确保任何进程所做的更改保持私有。

相关内容