虚拟内存或物理内存

Virtual Memory or Physical Memory

本文关键字:物理内存 虚拟内存      更新时间:2023-10-16

假设我们用C语言写一个程序,输出程序中声明的一个变量的地址,打印在屏幕上的地址是该变量的虚拟地址还是物理地址?如果它是虚拟地址,为什么它仍然具有与物理内存的位范围相同的范围?如。如果它返回0x833CA23E,

地址将是虚拟内存中的虚拟地址,因为应用程序对不了解物理内存。这是由内核和MMU隐藏的

我不确定你所说的相同的"位范围"是什么意思。如果您有一个32位地址空间,它将跨越整个32位空间,而不管您有多少物理内存量。64位也一样。

在大多数典型情况下(Windows, Linux等),它将是一个虚拟地址。

在Linux和Windows等典型情况下,虚拟地址和物理地址通常都是32位,因此在相同范围内的数字是不可避免的。如果可以分配超过4gb的内存,那么当/如果您这样做时,您最终会得到大于32位的地址——但是除非您采取特殊步骤,否则默认情况下您将获得32位地址。

当你在32位操作系统下使用超过4gb的内存时,你通常是通过一些特殊的API来实现的,比如Windows的地址窗口扩展。使用这些,您可以访问超过4gb的RAM, 但是这不是默认情况下会发生的事情,甚至接近可移植的代码。

一些(版本)的操作系统也使用英特尔的物理地址扩展(PAE)给系统作为一个整体访问超过4 GB的内存,但是即使这些正在使用,任何一个进程运行在系统仍局限于寻址4 GB(也就是说,PAE,你可以有一个4 GB/过程的限制,而旧系统有一个4 GB的限制,根据需要划分之间的过程)。

多数情况下为32位虚拟地址。

如果您的操作系统支持分页,那么它将是虚拟地址。它可以通过分页映射到相同的物理地址。Linux和Windows做分页。

另一件重要的事情是架构。在Intel x86 32位系统上,它将是32位地址。地址的前10位将用于获取页表。第二个10位将用于从所选页表中获取页。最后12位将给出该页面的实际物理地址。

我希望它能回答你的问题。