虚拟内存或物理内存

假设我们用C编写程序并打印程序中声明的变量之一的地址,是在屏幕上打印虚拟地址或变量的物理地址的地址? 如果它是虚拟地址,为什么它仍然具有与物理内存的位范围相同的范围? 例如。 对于32位机器,如果它返回0x833CA23E。

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

我不确定你的意思是同一个“位范围”。 如果你有一个32位的地址空间,它将覆盖整个32位空间,无论你有多少物理内存。 同样适用于64位。

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

在Linux和Windows等典型情况下,虚拟地址和物理地址通常都是32位,因此数字在同一范围内变得不可避免。 可以分配超过4千兆字节的内存,当你这样做时,你最终会得到大于32位的地址 – 但除非你采取特殊措施,否则32位地址就是你的意思。我会默认获取。

当您在32位操作系统下使用超过4 GB的内存时,通常是通过某些特殊的API(例如Windows的Address Windowing Extensions)来实现的 。 使用这些,您可以访问超过4 GB的RAM, 默认情况下不会发生甚至接近便携式的代码。

一些(某些版本的)操作系统也使用英特尔的物理地址扩展(PAE)来为整个系统提供超过4 GB的RAM访问权限,但即使这些内存正在使用中,系统上运行的任何单个进程仍然是仅限于4 GB(即使用PAE,每个进程可以有4 GB的限制,而旧系统的总数限制为4 GB,在进程之间按需要划分)。

在大多数情况下,它将是一个32位的虚拟地址。

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

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

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