我正在学习页表管理,并且我了解到VA to PA translation
需要 4 次内存访问4-level page table
(考虑 TLB 未命中和页遍历缓存中的未命中)。
但是,由于 Linux 使用follow_page
PTW 函数,并且该函数在内部调用follow_page_mask
.这进一步调用p4d_offset
、pud_offset
、pgd_offset
等。
所以,我的问题是,例如,当pud_offset
被调用时,它将返回PMD
目录的虚拟地址(我猜)并且要获取目录的物理地址PMD
,再次需要执行 PTW。
那么,memory accesses
4 的地址转换是如何进行的呢?不是4个多吗?
答案1
当人们说在 x86 上使用四级页表进行虚拟到物理地址转换需要四次内存访问(最多)时,他们指的是 CPU(严格来说,MMU)必须完成的解码线性内存的工作。地址并将其转换为物理地址。
该过程在第 3A 卷中有详细介绍英特尔® 64 和 IA-32 架构软件开发人员手册,第 4.5 节。在具有 4KiB 页的四级模式(最坏情况)下,线性地址的结构如下:
47-39 | 38-30 | 29-21日 | 20-12日 | 11-0 |
---|---|---|---|---|
PML4 | 目录指针 | 目录 | 桌子 | 抵消 |
给定这样的地址,如果需要完整地址解码,CPU 必须:
- 使用基数 in
CR3
加上 PML4 值来查找相关的 PML4 条目(一次内存访问) - 在与PML4条目对应的页目录指针表中,读取目录指针的条目(一次内存访问)
- 在页目录中,读取该目录的条目(一次内存访问)
- 在页表中,读取该表的条目(一次内存访问)
最后一次读取的结果与线性地址的偏移部分相结合,在总共四次内存访问之后给出了物理地址。
仅当发生页面错误时内核才会参与;与理想情况下的 CPU 相比,它需要做更多的工作来处理这个问题。
答案2
页目录和页表条目包含页表和页目录开头的物理地址。因此不需要执行页表遍历来查找这些位置。
内存访问是由内存管理单元中的硬件完成的,因此除非出现一些错误,例如尝试访问无效地址或未映射的页面,否则访问对软件来说是透明的。