我所理解的是,我们在用户空间程序中处理的地址是虚拟内存地址,而不是实际的物理内存地址。 Memory-Management-Unit将这些虚拟地址映射到实际的物理地址。
但是在32位机器上,我观察到指针的大小大部分是32位,但是一个进程实际上可以占用超过4GB,即程序的虚拟地址空间可以通过超过32位来寻址(对于具有8GB虚拟地址空间的程序,它的虚拟内存由33位寻址)。 所以我不能在程序中使用指针(大小只有32位)来访问4GB后的内存位置。
那么为什么指针的大小只有32位,为什么不比32位机器上的大?是什么决定了指针的大小?
答案 0 :(得分:1)
您的程序大部分时间都在虚拟内存上运行(除非您自己编写操作系统)。也就是说,您可以同时寻址的内存量始终受虚拟内存大小的限制。从技术上讲,地址大小与底层硬件的地址总线大小有关,因为HW(即实际将这些地址转换为物理内存地址的MMU)使用这些大小。
尽管如此,您的计算机还是可以选择在32位上使用比4 GiB更多的物理内存。在x86上,这被称为Physical Address Extension。使用PAE,您的计算机可以拥有超过4 GiB的内存,但您的单个程序仍然只能同时访问4 GiB(由于32位地址大小限制)。