2

我对 fork() 用例感兴趣。

1)fork后,内核为子进程创建一个新的PCB。它将父级中所有页表条目的权限更改为只读。然后它在新的子 PCB 中复制父页面目录和表格。这个对吗?还是父进程和子进程共享它们?

2)如果内核在复制页面后将它们全部更改为只读,那么内核如何知道页面的实际权限?

4

1 回答 1

2

我认为1)中的意见是正确的,在fork()期间,内核将为子进程创建一个新的task_struct,并复制mm_struct和页表,它与依赖于clone_flags的父进程共享资源。它会使 is_cow_mapping() 的 MMU 条目无效,并将相关的页表条目标记为只读。

2)的答案:内核仅将页表条目is_cow_mapping()更改为只读,当孩子或父母想要访问这些地址范围时,内核将复制并标记为读/写。

如果在 fork() 之后调用 exec(),将建立一个全新的虚拟空间,从 parent 复制的旧虚拟空间将被丢弃。

于 2013-03-11T03:07:42.240 回答