C语言 如果CPU看到虚拟地址,页错误处理程序如何用物理地址填充页表项?



我正在阅读关于页面错误的内容,从我所读到的内容来看,MMU咨询页表以将虚拟地址转换为物理地址。操作系统负责(通过页错误处理程序)填充这些页表项。

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

如果对内存中不存在的某个4K页面进行访问,并且页面故障处理程序成功地定位到磁盘上相应的4K页面,它如何获取物理内存的4K页面并计算出物理内存的4K页面的物理地址?

操作系统的部分职责是跟踪物理列表页面。您可以在OSDev上查看这是如何完成的—通常是通过查询BIOS/uefi公开的函数,这些函数为您提供(通常是非连续的)空闲内存列表。

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


给定一个维护的可用物理页面列表-当操作系统处理页面错误时,它可以访问发生故障的虚拟地址,并且它可以决定做什么。如果它需要分配一个新页,那么它将查询它的空闲页列表,并选择一个可用的物理页映射到虚拟地址空间。在x86上,这种映射是通过修改页表并将其加载到cr3寄存器来完成的。

一旦页面被映射,就可以使用虚拟地址对其进行写操作。

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

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

相关内容

最新更新