如果 CPU 看到虚拟地址,页面错误处理程序如何用物理地址填充页面 table 条目?

How does page fault handler fill up the page table entry with a physical address if CPU sees virtual addresses?

我正在阅读有关页面错误的信息,根据我的阅读,MMU 查阅页面 table 以将虚拟地址转换为物理地址。 OS(通过页面错误处理程序)负责填充这些页面 table 条目。

让我困惑的是页面错误处理程序首先是如何获得物理地址的?在我看到的图表和注释中,CPU 似乎使用虚拟地址,MMU 透明地将它们转换为物理地址。 CPU 是否专门使用物理地址而不是虚拟地址来处理页面错误?

如果访问内存中不存在的某个 4K 页面并且页面错误处理程序成功地在磁盘上找到相应的 4K 页面,它如何获取物理内存的 4K 页面并找出物理地址物理内存的 4K 页?

OS 的部分职责是跟踪 物理 页的列表。您可以查看 OSDev 以了解这是如何完成的 - 通常通过查询 BIOS/UEFI-exposed 函数,这些函数为您提供(通常是非连续的)空闲内存列表。

UEFI 尤其在启动时公开 GetMemoryMap 以获取内存描述符数组。


给定可用物理页面的维护列表 - 当 OS 处理页面错误时,它可以访问错误的虚拟地址,并且可以决定要做什么。如果它需要分配一个新页面,那么它会查询它的空闲页面列表,并选择一个可用的 physical 页面映射到 virtual地址 space。在 x86 上,此映射是通过修改页面 table 并将其加载到 cr3 寄存器中来完成的。

页面映射后,可以使用虚拟地址写入。

操作系统在基本层面上使用虚拟地址,但它也必须管理物理地址。在操作系统内存管理子系统中,有一个部分称为物理内存管理器。基本上,在启动时,它会读取固件提供给它的 table,告诉它哪些内存区域是空闲的。它设置空闲列表以包含此地图中的所有空闲页面。当页面错误发生时,它从该列表中拉出一个页面,将其映射到 PTE,如果该地址不存在页面 table,则抓取另一个页面以创建页面 table(注意它将根据尚未映射的级别继续执行该步骤),刷新该地址的 TLB,然后继续。

请注意,大多数物理内存分配器比这个复杂得多,但从根本上说,这就是算法。