操作系统如何知道/跟踪物理 RAM 的哪部分是空闲的,以便它可以在页面错误时将页表中的虚拟页面地址映射到 RAM 中的物理帧?
答案1
操作系统必须维护数据结构,以跟踪物理内存每个页面的使用情况。具体如何实现取决于操作系统 — 以下是 Linux 如何实现这一点的简单描述。
Linux 内核有一个数组页面描述符,RAM 中的每个页框对应一个。页面描述符对应于哪个页框由页面描述符在描述符数组中的索引决定。每个描述符除其他内容外,还包含各种标志以及控制页面是否空闲的引用计数。
在页面描述符数组之上,Linux 实现了好友内存分配系统将空闲页框分组为包含连续页框组的列表。第一个列表包含单个页框的描述符,第二个列表包含两个连续页框的组,第三个列表包含四个连续页框的组,依此类推。块总是按 2k 页的大小分配。当请求顺序钾成功,该块从空闲列表中删除钾. 如果列表中没有可用的块钾,可以将高阶列表上的块拆分开,并将剩余部分根据需要移动到低阶列表。
答案2
内存由 MMU(内存管理单元)跟踪。MMU 是 CPU 的一部分硬件。在较旧的硬件中,MMU 可以与 CPU 分开。
MMU 具有所谓的页表。页表将虚拟页号映射到主内存中的物理页号。通常,每个虚拟内存位置或“页面”都是几千字节。这些映射中的每一个都在页表中单独跟踪。这些被称为页表条目 (PTE)。
当发生页面错误时,MMU 会向 CPU 发送信号,告知其发生了错误。然后,操作系统会尝试查找 RAM 的空闲帧,然后请求 PTE 将虚拟地址映射到物理地址。
当然,这是一个非常简短的回答,但内容可能非常深入和复杂。如果你想了解更多,我建议你先阅读有关 MMU、虚拟地址和一些基本内存管理的内容。
答案3
稍微扩展一下 DrZoo 的回答,操作系统最终负责(不知何故 ...)了解所有物理存储“页面”的当前状态和所有权。它还负责了解虚拟的各工序的情况。
必须知道这一点才能设置 MMU 使用的物理数据结构,并知道在适当的时间向该单元发出什么命令。
每个操作系统都必然具有某种数据结构安排,使其能够跟踪这一点,并且每个操作系统的做法都不同。