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

时间:2013-05-15 09:15:40

标签: kernel virtual-memory memory-management mmu

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

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

谢谢。

编辑:问题的插图:

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

enter image description here

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

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

2)修改页面表项,将“Present”位设置为0并在Swap中设置Page 1位置

enter image description here

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

答案是:

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

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

来自Understanding the Linux Memory Management,“Linux2.6中的新功能”

1 个答案:

答案 0 :(得分:11)

Linux的:

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

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

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

Table 3.1: Page Table Entry Protection and Status Bits

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

据推测,其他架构类似。


简单来说:进程指向页面,页面得到更新。因此,这些过程实际上也得到了更新。当物理页面被请求时,它被交换进来,因此也是所有进程。关键在于换掉内存时不会删除页面表项。

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

kernel documentation included book of Mel Gorman(2007):