首页 > 解决方案 > 内核如何跟踪映射到其他进程的帧?

问题描述

关于小页面错误,维基百科说:

操作系统中的缺页处理程序只需要使内存管理单元中该页面的入口指向内存中的页面,并指示该页面已加载到内存中即可。它不需要将页面读入内存。如果内存由不同的程序共享并且页面已经被其他程序带入内存,则可能会发生这种情况。

内核如何知道一个页面已经被另一个进程带入内存?据我了解,对于任何给定的执行进程,内核只关心该进程的页表,所以如果有一些帧已经被另一个进程映射,内核是如何确定的呢?

如果您还可以指出执行此操作的相关代码,那就太棒了,因为我在这里扫描(链接自本文)并且找不到实现的相关部分。

标签: linux-kernelshared-memoryvirtual-memory

解决方案


在虚拟内存系统中,操作系统必须在二级存储中维护进程地址空间的表示。那是虚拟内存的“虚拟”部分。

虚拟表示通常分为多个部分。每个部分都包含具有相同属性 (r/w/rw/rx) 的页面,并且连续存储。

通常,如果一个进程共享内存,它们共享整个部分。

操作系统必须在某处存储描述该部分的标题。该标头将指示该部分是否以及加载到物理内存中的位置。每个进程都必须有一个数据结构来指示该部分映射到逻辑地址空间的位置。

请记住,此机制可用于操作系统的所有进程共享的可分页区域。

当页面错误发生时,页面错误处理程序必须识别哪个部分包含导致错误的页面。然后它可以从节的标题中识别它是否驻留在物理内存中。

你提到的那篇文章是指VMS操作系统,这种软故障比较容易出现。在 VMS 中,库由操作系统安装,因此所有进程都被迫共享相同的代码。


推荐阅读