使用 PAE 在 x86 中转换虚拟内存

Translating virtual memory in x86 with PAE

为什么从虚拟内存地址转换为三级分页(2-9-9-12,4K页)的物理地址需要在计算下一个之前将每个页索引乘以8?

例如,如果我有虚拟地址:0xabde203(二进制:1010 1011 1101 1110 0010 0000 0011)。

第一步是提取由两位 - 10 表示的 "Page directory pointer table" 索引,将其乘以 8 => 10000 并将其值与外部 table 物理地址相加为了找到页面目录索引。

在正常的 x86 虚拟翻译中,我知道分页是通过两级分页 (10-10-12) 完成的,因此将每个索引(由 10 位表示)乘以 4(2 位)等于页面大小。

但是为什么在使用 PAE 时乘以 8,它如何表示页面目录table?

在传统的32位分页中,每个页面目录条目和每个页面table条目都是4个字节,因此索引乘以4。在PAE和64位分页中,每个table entry 是 8 个字节,所以 index 乘以 8.

1024 个 4 字节的条目适合一个 4 KB 的页面,因此在两级分页中,每个索引为 10 位。 512 个 8 字节条目适合一个 4 KB 页,因此在 PAE 中,每个索引为 9 位。

您认为 4*2^10 是 4K 是恰当的。 8*2^9 也是 4K.