内核如何知道虚拟地址空间中的哪些页面对应于换出的物理页面框架?

Bor*_*kov 30 kernel memory-management virtual-memory mmu

请考虑以下情况:内核耗尽了物理RAM并需要换出页面.它选择最近最少使用的页面框架,并希望将其内容交换到磁盘并将该框架分配给另一个进程.

困扰我的是,这个页面框架已经映射到一般来说,几个(相同的)几个进程的页面.内核必须以某种方式找到所有这些进程并将页面标记为已换出.它是如何实现的?

谢谢.

编辑:问题的插图:

在交换过程1和2之前有一个共享的Page 1,它位于物理内存帧1中:

在此输入图像描述

现在,系统中的内存耗尽,内核通过从第1帧交换第1页并将其替换为第2页来为进程3分配内存.为了做到这一点,它必须

1)找到所有流程,参考第1页(在我们的案例中为流程1和流程2)

2)修改其页表条目,将"Present"位设置为0并在Swap中设置Page 1位置

在此输入图像描述

所以,我不知道,第1步是如何进行的.内核不能只是迭代地查看每个进程的页表,以便找到指向第1帧的页表条目.应该存在从页框到页表条目的某种反向映射.

答案是:

"页表管理最重要和最重要的变化是引入了反向映射(rmap).将其称为"rmap"是故意的,因为它是"首字母缩略词"的常见用法,不应与-rmap混淆由Rik van Riel开发的树,它对库存VM的更多改动而不仅仅是反向映射.

在一个句子中,rmap授予定位所有PTE的能力,这些PTE仅在给定结构页面的情况下映射特定页面.在2.4中,找到映射共享页面的所有PTE(例如内存映射共享库)的唯一方法是线性搜索属于所有进程的所有页表.这太昂贵了,Linux试图通过使用交换缓存来避免这个问题(参见11.4节).这意味着对于许多共享页面,无论页面使用时间和使用模式如何,Linux都可能必须更换整个进程.2.6而是有一个与每个结构页面相关联的PTE链,可以遍历该页面以从引用它的所有页面表中删除页面.这样,LRU中的页面可以以智能方式交换出来,而无需交换整个过程."

了解Linux内存管理,"Linux2.6中的新功能"

Run*_*ium 11

Linux的:

使用交换文件时,页面表条目将更新为标记为无效的页面条目,并保存有关交换文件中保存位置的信息.即:swap_info数组的索引和数组内的偏移量swap_map.

pte_tx86上的(有点旧)页表条目类型()的示例.一些位被硬件用作标志:

Bit         Function
_PAGE_PRESENT   Page is resident in memory and not swapped out
_PAGE_PROTNONE  Page is resident but not accessable
_PAGE_RW        Set if the page may be written to
_PAGE_USER      Set if the page is accessible from user space
_PAGE_DIRTY     Set if the page is written to
_PAGE_ACCESSED  Set if the page is accessed
Run Code Online (Sandbox Code Playgroud)

表3.1:页表条目保护和状态位

另请参阅另一个SO答案,其中包含x86-64页表格式的图表.当低位= 0时,硬件忽略所有其他位,因此内核可以将它们用于任何事情.即使在"当前"条目中,也有一些保证忽略的位不保留供将来的硬件使用,因此内核可以将它们用于自己的目的.

据推测,其他架构是相似的.


简单来说:一个进程指向一个页面,页面得到更新.因此,这些过程实际上也得到了更新.当物理页面被请求时,它被交换进来,因此也是所有进程.重点是在换出内存时不删除页表条目.

您可能会发现其中一些有用:

内核文档包括梅尔·戈尔曼的书(2007):