假设我们用C编写一个程序并打印程序中声明的一个变量的地址,那么在屏幕上打印的地址是虚拟地址还是变量的物理地址? 如果它是虚拟地址,为什么它仍然具有与物理内存的位范围相同的范围?例如。对于32位机器,如果它返回0x833CA23E。
答案 0 :(得分:5)
该地址将成为虚拟内存中的虚拟地址,因为该应用程序不了解物理内存。这是由内核和MMU隐藏的。
我不确定你的意思是同一个"位范围"。如果你有一个32位的地址空间,它将覆盖整个32位空间,无论你有多少物理内存。同样适用于64位。
答案 1 :(得分:4)
在大多数典型情况下(Windows,Linux等),它都是虚拟地址。
在Linux和Windows等典型情况下,虚拟地址和物理地址通常都是32位,因此数字在同一范围内变得不可避免。它 可以分配超过4千兆字节的内存,当你这样做时,你最终会得到大于32位的地址 - 但除非你采取特殊的步骤来做到这一点,地址是您默认获得的地址。
如果在32位操作系统下使用超过4 GB的内存,通常可以通过某些特殊的API(例如Windows' Address Windowing Extensions。使用这些,您可以访问超过4 GB的RAM,但它不是默认情况下会发生的代码甚至接近便携式。
某些(某些版本的)操作系统也使用英特尔的物理地址扩展(PAE)来为整个系统提供超过4 GB的RAM访问权限,但即使这些内存正在使用中,任何一个在系统上运行的进程仍然仅限于4 GB(即使用PAE,每个进程可以有4 GB的限制,而旧系统的总数限制为4 GB,按进程间的需要划分)。
答案 2 :(得分:0)
在大多数情况下,它将是一个32位的虚拟地址。
如果您的操作系统支持分页,则它将是虚拟地址。它可以使用分页映射到相同的物理地址。 Linux和Windows进行分页。
另一件重要的事情是架构。在Intel x86 32位系统上,它将是32位地址。地址的前10位将用于获取页表。第二个10位将用于从所选页表中获取页面。最后12位将为您提供该页面的实际物理地址。
我希望它能回答你的问题。