页面错误时如何通过虚拟地址找到唯一的交换页

How to find the unique swap page by virtual address when page fault

例如,如果有 3 个进程,每个进程都使用虚拟地址 0x400000 作为文本部分。而且用户进程只有一个4KB物理页。

假设进程 0 正在使用物理页面(虚拟地址 0x400000)。假设物理页面数据为page_pid_0_0x400000.

当进程 1 被 OS 调度时,进程 1 的 page_pid_1_0x400000 将从可执行文件加载到物理页面。然后 page_pid_0_0x400000 数据应该被换出到磁盘。

同时加载进程 2 时,物理页面上的 page_pid_2_0x400000 数据也应换出到磁盘。

现在,在磁盘上,我们有相同虚拟地址 space 的 2 个副本,即 0x400000page_pid_1_0x400000page_pid_0_0x400000

如果现在调度进程 1,我如何 (OS) 从虚拟地址 0x400000 识别 page_pid_1_0x400000(因为内存访问指令只知道虚拟地址 0x400000 但不是进程 ID)?

操作系统可以有各种相关的数据结构。例如,每个进程都可以有自己的数据结构(和页面 tables)来表示其地址 space,操作系统只需确保将 cpu 指向正确的地址恢复进程时的一组页面 tables。

同样,交换处理不限于仅使用虚拟地址,它可以使用 (address space, virtual address) 来发现交换位置。它可以根据需要使其灵活或严格。例如,它可能认为虚拟地址是连续的虚拟地址集合的一部分,这些虚拟地址在页面存储在文件或交换中的位置之间具有一些共性。

页面 table 和虚拟地址的概念是 CPU+MMU 地址转换的接口。操作系统可以维护它想要的任何关联数据结构。

在旧系统中,每个页面描述符(有时是页面 table 条目或 pte)都会有一个位来确定页面是否有效。 CPU/MMU 会忽略被认为无效的页面;因此,当页面交换到磁盘时,页面 table 条目中的其他位是存储磁盘交换地址的方便位置。

现代系统倾向于使用更复杂的数据结构来适应页面的瞬态共享和锁定,因此经常使用辅助结构。