我正在阅读关于内存pipe理的新书Windows Internals 5(物理地址扩展PAE部分的第9章)。 它提到了“一个32位系统在内部用24位表示物理地址”在770页。我完全困惑,我认为x86物理内存也应该用32位来寻址,这就是为什么系统被称为32位系统。
任何想法有什么不对?
提前致谢,
乔治
我认为这里的混乱可能是物理寻址与虚拟寻址的结果。 在32位Windows上,虚拟内存地址(即应用程序和其他更高级进程使用的地址)是32位。 物理内存地址在与硬件直接对话的层面上是下降的,(1)禁止内核/ HAL以外的任何事情;(2)实现细节,所以在那里发生的事情肯定会出现奇怪比这更多的实例。
显然不正确。 要正确处理PAE,请查看维基百科: 链接文本
我还没有读完这本书的确切内容,但是我想我可以告诉它是怎么回事。
内存被处理器分解成“页面”。 每个页面在x86或x64处理器上都是4K大小的。 (在某些情况下,页面实际上可能会更大,但是现在我们不必担心这种复杂性。)操作系统将构build将虚拟地址转换为物理地址的页表。 处理器在执行代码时获取这些页表项,以便软件只使用虚拟地址进行操作。
虚拟地址与物理地址相同,地址的低12位,因为4K是2到12的功率。
在打开PAE模式的x86处理器中,物理地址大小为36位。 (稍后扩展一点,在某些机器上可以是37或38位)。如果减去页表项中未指定的12位(因为它们在虚拟地址和物理地址中相同)你剩下24位。 页表项中的那些高24位的物理地址replace了虚拟地址的高位,以使得处理器使用实际的物理地址。
请注意,虚拟地址不具有36位。 它只有32位。 所以那些高24位代替虚拟地址的高20位。 这指出,虽然PAE模式允许机器拥有超过4GB的内存(4GB是2到32的功率),但没有一个进程可以拥有超过4GB的虚拟内存。
也许这是指物理页码? 使用36位物理地址总线(我认为这是32位x86处理器和4K页面的最大值),您需要24位来唯一标识每个物理页面。
#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
作者真的应该在墙上自杀。 “用24位内部表示物理地址”意味着只有16Mb可用于寻址,所以它将是可用的最大RAM)))
这个引言没有提到任何“布特页面寻址”(就像Stephen Veiss所说的那样),所以这是不正确的。