【发布时间】:2022-01-02 12:13:31
【问题描述】:
当程序调用mmap 分配一个匿名页,也称为零需求页时,对应的页表项(PTE)的地址字段中出现了什么?我假设内核确实不在物理内存中创建一个零初始化页面(并将该物理页面的页码输入PTE),直到请求进程实际接触该页面 - 因此术语需求为零。由于它不是磁盘地址,也不是 0(用于未分配的页面),所以那里会出现什么值?作为一个不同但相关的问题,内核如何“知道”该页面将作为零需求页面处理,即故障处理程序应该找到一个物理页面并将其初始化为 0 而不是从磁盘?
【问题讨论】:
-
我不知道答案,但这完全取决于软件:一旦硬件看到页面已清除当前位,它就会忽略其他所有内容,因此地址字段可以包含内核的任何内容请 - 它不一定代表一个地址。尤其是在 64 位系统上,有大量可用位,因此可以使用一个来表示“请求零页面”。
-
或者就此而言,内核可以完全忽略 PTE 内容,并维护一些其他数据结构,它可以在其中查找虚拟地址并查看应该如何处理它。我隐约记得 Linux 做了一些组合:一些相关数据在 PTE 中,一些在其他 vm 结构中。
-
我认为您的第二个问题已由第一个回答:故障处理程序查看 PTE 和 vm 数据结构,并根据该信息看到此页面的需求为零- 此时它分配一个物理页面,更新 PTE 以指向该页面,刷新 TLB,并返回用户空间以恢复错误指令。
-
@Nate Eldredge——谢谢。是的,当然这取决于内核(但感谢为普通读者记录了这一点)——但我的问题来自 Bryant 和 O'Hallaron 对 Linux 页表的描述,其中地址字段是物理页码(如果页面存在于内存中),磁盘地址(如果不存在,但页面已分配),或 0/NULL(如果页面未分配)——所以它们没有描述如果页面已分配,它有什么但不存在,也没有磁盘地址。
标签: linux-kernel virtual-memory page-tables zero-initialization demand-paging