4 级页表中 VA 到 PA 的转换如何只需要 4 次内存访问

4 级页表中 VA 到 PA 的转换如何只需要 4 次内存访问

我正在学习页表管理,并且我了解到VA to PA translation需要 4 次内存访问4-level page table(考虑 TLB 未命中和页遍历缓存中的未命中)。

但是,由于 Linux 使用follow_pagePTW 函数,并且该函数在内部调用follow_page_mask.这进一步调用p4d_offsetpud_offsetpgd_offset等。

所以,我的问题是,例如,当pud_offset被调用时,它将返回PMD目录的虚拟地址(我猜)并且要获取目录的物理地址PMD,再次需要执行 PTW。

那么,memory accesses4 的地址转换是如何进行的呢?不是4个多吗?

答案1

当人们说在 x86 上使用四级页表进行虚拟到物理地址转换需要四次内存访问(最多)时,他们指的是 CPU(严格来说,MMU)必须完成的解码线性内存的工作。地址并将其转换为物理地址。

该过程在第 3A 卷中有详细介绍英特尔® 64 和 IA-32 架构软件开发人员手册,第 4.5 节。在具有 4KiB 页的四级模式(最坏情况)下,线性地址的结构如下:

47-39 38-30 29-21日 20-12日 11-0
PML4 目录指针 目录 桌子 抵消

给定这样的地址,如果需要完整地址解码,CPU 必须:

  • 使用基数 inCR3加上 PML4 值来查找相关的 PML4 条目(一次内存访问)
  • 在与PML4条目对应的页目录指针表中,读取目录指针的条目(一次内存访问)
  • 在页目录中,读取该目录的条目(一次内存访问)
  • 在页表中,读取该表的条目(一次内存访问)

最后一次读取的结果与线性地址的偏移部分相结合,在总共四次内存访问之后给出了物理地址。

仅当发生页面错误时内核才会参与;与理想情况下的 CPU 相比,它需要做更多的工作来处理这个问题。

答案2

页目录和页表条目包含页表和页目录开头的物理地址。因此不需要执行页表遍历来查找这些位置。

内存访问是由内存管理单元中的硬件完成的,因此除非出现一些错误,例如尝试访问无效地址或未映射的页面,否则访问对软件来说是透明的。

相关内容