未缓存页的页表地址字段

未缓存页的页表地址字段

根据 Bryant 和 O'Hallaron 的(有点抽象的)类 Linux 系统上的页表模型,每个页表条目 (PTE) 都有一个地址字段,该字段保存三种值之一:(1) 物理地址(实际上是,虚拟页映射到的页号); (2) 长期存储设备的等效位置标识符——可以在其中找到页面;或 (3) 0,表示未分配的页。假设一个页面已从长期存储交换到主内存。在此帐户中,内核将长期存储地址(2)替换为物理地址(1)。现在假设物理内存中的同一页需要被逐出,以便为其他页换入腾出空间。如果原始长期存储地址已被物理地址覆盖,如何将其恢复到 PTE?谢谢。

答案1

PTE的代表虚拟的页。正如您所说,当主内存中存在虚拟页时,PTE 的地址字段将保存物理页帧号(PFN)。

每个身体的页面有对应的struct page.这有:

以下flags是:

struct address_space *mapping;

对于页面缓存中的页面(大多数系统上的大部分页面),mapping指向访问备份页面的文件所需的信息。但是,如果该页面是匿名页面(由交换支持的用户空间内存),则将mapping指向一个anon_vma结构 [...]

--将更多内容塞入结构页面、LWN.net

然后,该page→index字段用于存储swp_entry_t匿名页面的结构。 (对于页面缓存中的页面,它保存文件偏移量)。

swp_entry_t保存交换设备的索引以及该交换设备内的位置。

有关其在 2004 年如何运作的具体细节可以在以下位置找到:了解 Linux 虚拟内存管理器 - 交换管理,梅尔·戈尔曼撰写。

答案2

从你的问题中我并不完全清楚你是否在询问mmap()页面缓存中的 ped 文件、交换或被动映射文件,因此我将回答所有问题。

在非 mmap 情况下,逐出就是逐出:一旦页面变得干净,就可以简单地删除它。当没有文件支持的页面从主存储器中逐出时,通常不需要恢复任何地址,因为它们会在下次访问文件时简单地将页面错误转移到新的缓存条目中。在交换情况下也会发生类似的情况:如果我们在交换中的某个页面中出现故障,并且稍后必须逐出同一页面,那么我们可能会在下次给出一个新的交换地址并将其设置在 PTE 中(或者在以下情况下使用交换缓存)该页面存在并且是干净的)。*

在 mmap 情况下,生命周期由系统调用控制mmap()。该范围显式映射到 上的虚拟内存的连续部分mmap(),并且此映射的元数据(例如我们有引用计数的后备 FD、偏移量、大小等)存储在相关的虚拟内存区域中(音乐管理协会)。即使页面被逐出,VMA 也会保留映射信息,从而使内核能够知道下次访问时从哪里出错。

* 实际上,交换和一般分页活动通常都不会发生在页面级别,而是经常发生在某些较低的粒度上,例如交换集群或预读批处理。

相关内容