C 内核如何知道物理页面由两个不同的进程共享?

C 内核如何知道物理页面由两个不同的进程共享?,c,linux,x86-64,C,Linux,X86 64,我们知道页表用于从虚拟内存页地址获取物理内存页地址。但是,内核如何知道物理内存页是否由不同的进程共享(例如在分叉进程及其父进程的情况下)。这种名单保存在哪里 内核是创建所有虚拟映射的实体。因此,它确切地知道什么是共享的,什么不是。没有内核的帮助,用户空间进程无法创建共享映射 内核还负责在进程请求fork时复制映射。它具有所需的所有信息 页面的映射数保存在表示该页面的struct page结构中的字段中。它在每次创建新映射时递增,在映射消失时递减 如果您想深入了解这一点,可以访问。特别是,请阅读文

我们知道页表用于从虚拟内存页地址获取物理内存页地址。但是,内核如何知道物理内存页是否由不同的进程共享(例如在分叉进程及其父进程的情况下)。这种名单保存在哪里

内核是创建所有虚拟映射的实体。因此,它确切地知道什么是共享的,什么不是。没有内核的帮助,用户空间进程无法创建共享映射

内核还负责在进程请求fork时复制映射。它具有所需的所有信息

页面的映射数保存在表示该页面的
struct page
结构中的字段中。它在每次创建新映射时递增,在映射消失时递减


如果您想深入了解这一点,可以访问。特别是,请阅读文档部分的Mel Gorman的书(非常技术性的)linked(免费提供的PDF)。

如果是forking(写时复制),内核如何知道原始进程正在尝试写入,从而为其提供另一个物理页面(写时复制)?它是否提供对原始流程和分叉流程页面的只读访问权限。所以,若原始进程修改了它,它会给它一个新的物理页面,但若分叉进程稍后也修改了页面呢。内核如何决定它不需要给它一个新的物理页,并且可以使用旧的物理页,因为现在它与原始进程不同。示意图上,最初由两个进程共享的页被标记为只读。当任一进程尝试写入时(这会产生错误),内核会复制页面并更新进程的映射。新创建的页面和原始页面都设置为读/写,无需对其执行进一步操作。不管是家长还是孩子先尝试写,我明白了。但当我们在MMU级别说“只读”时,它是属于物理页还是虚拟内存页?虚拟地址。(顺便说一句,我之前的评论在技术上是不准确的,事实并非如此,如果你想了解血淋淋的细节,请参阅相关书籍。)