我正在读一本新书,Windows Internals 5,关于内存管理(第 9 章物理地址扩展 PAE 部分)。第 770 页提到“32 位系统内部用 24 位表示物理地址”。我完全糊涂了,我认为 x86 物理内存也应该用 32 位寻址,这就是系统被称为 32 位系统的原因。
知道哪里出了问题吗?
提前致谢,
乔治
答案1
我认为这里的混淆可能是物理寻址与虚拟寻址的结果。在 32 位 Windows 上,虚拟内存地址(即应用程序和其他高级进程使用的地址)是 32 位。物理内存地址处于直接与硬件对话的级别,这 (1) 几乎禁止内核/HAL 之外的任何操作,以及 (2) 实现细节,那么那里发生了什么可以在很多情况下肯定会显得很奇怪,而不仅仅是这种情况。
答案2
我没有读过书中的确切段落,但我想我能知道它的意思。
处理器将内存划分为“页面”。在 x86 或 x64 处理器上,每个页面大小为 4K。(在某些情况下,页面实际上可能更大,但现在我们先不考虑这种复杂性。)操作系统会构建页表,将虚拟地址转换为物理地址。处理器在执行代码时会获取这些页表条目,以便软件可以仅使用虚拟地址进行操作。
虚拟地址与物理地址相同,都是地址的低12位,因为4K是2的12次方。
在开启 PAE 模式的 x86 处理器中,物理地址大小为 36 位。(后来略有扩展,在某些机器上可以是 37 位或 38 位。)如果减去页表项中未指定的 12 位(因为它们在虚拟地址和物理地址中相同),则剩下 24 位。页表项中物理地址的高 24 位替换虚拟地址的高位,以构成处理器使用的实际物理地址。
请注意,虚拟地址不是 36 位。它只有 32 位。因此,高 24 位替换了虚拟地址的高 20 位。这表明,虽然 PAE 模式允许机器拥有超过 4GB 的内存(4GB 是 2 的 32 次方),但没有一个进程可以拥有超过 4GB 的虚拟内存。
答案3
显然是错误的。有关 PAE 的准确处理,请查看 Wikipedia: 链接文本
答案4
#include <stdio.h>
int main() {
int total = 5;
int *ptr = &total; /*Set ptr to the address of total*/
printf("%d",ptr);
return 0;
}
输出:2293620
即 0x22FF74,即 24 位。
当然,我对 Windows 的内存仍然一无所知,所以我不知道这意味着什么。:D