虚拟内存或物理内存
Posted
技术标签:
【中文标题】虚拟内存或物理内存【英文标题】:Virtual Memory or Physical Memory 【发布时间】:2014-06-29 22:39:25 【问题描述】:假设我们用 C 语言编写一个程序并打印程序中声明的变量之一的地址,打印在屏幕上的地址是变量的虚拟地址还是物理地址? 如果是虚拟地址,为什么它仍然与物理内存的位范围相同?例如。对于 32 位机器,如果它返回 0x833CA23E。
【问题讨论】:
C 和 C++ 编程语言都不包含任何“虚拟”或“物理”内存的概念。只有“记忆”。该问题无法用任何一种语言回答。 您会发现物理地址和虚拟地址相同的唯一机器是根本没有虚拟内存(和内存管理单元)的系统,例如许多嵌入式系统。例如,ucLinux 是设计用于在这些平台上运行的 Linux 版本。 FreeRTOS 是一个微型操作系统(可以将其降至 8kB 左右),不支持虚拟内存。 另外,在现代系统中,机器的“位数”是虚拟地址中的位数。物理地址可能没有那么多位(例如,在 64 位机器上,实际连接的物理地址可能只有 40 或 48 位;忽略高阶物理地址位)。在旧架构中,它描述了内部数据寄存器的宽度,并且(物理)地址有更多位。例如 8086 是 16 位但有 20 位寻址 (1024k); 6502 是 8 位的,但有 16 位地址 (64k)。 @MikeDeSimone:请注意,在硬件层面,当前的 x86-64 也只有 48 位的虚拟地址。 是的,但是指针仍然是 8 个字节,而不是 6 个。 【参考方案1】:地址将是虚拟内存中的虚拟地址,因为应用程序不知道物理内存。这被内核和 MMU 隐藏了。
我不确定您所说的相同“位范围”是什么意思。如果您有一个 32 位地址空间,则无论您拥有多少物理内存,它都将跨越整个 32 位空间。对于 64 位也是如此。
【讨论】:
这是否意味着如果我在 32 位机器上有 4GB 内存,运行 32 位操作系统,虚拟内存空间和物理内存空间将相同? @shaveenk,不,内核将选择一个映射,而 MMU 将强制执行该映射。通常,您的程序与内核和其他应用程序共享资源,因此将所有虚拟地址映射到所有应用程序的相同物理地址是没有意义的。 另外,如果你有虚拟内存支持,计算机可以使用一些磁盘空间作为额外的内存,当 RAM 页面不使用时“分页”到磁盘,而其他一些进程需要更多 RAM .在分页发生时,所涉及的进程会停止,因此它们不会注意到任何异常;对他们来说,看起来他们的数据总是在 RAM 中。【参考方案2】:在大多数典型情况下(Windows、Linux 等),它将是一个虚拟地址。
在 Linux 和 Windows 等典型情况下,虚拟地址和物理地址通常都是 32 位,因此具有相同范围内的数字是不可避免的。 是可能分配超过 4 GB 的内存,当/如果你这样做,你最终会得到大于 32 位的地址 - 但除非你采取特殊步骤来做到这一点,否则 32 -bit 地址是你默认得到的。
当您在 32 位操作系统下使用超过 4 GB 的内存时,您通常是通过一些特殊的 API 来执行此操作的,例如 Windows 的Address Windowing Extensions。使用这些,您可以访问超过 4 GB 的 RAM,但这不是默认情况下会发生的情况,甚至接近可移植的代码。
某些(某些版本)操作系统还使用 Intel 的物理地址扩展 (PAE) 来使整个系统能够访问超过 4 GB 的 RAM,但即使在使用这些 RAM 时,运行在系统仍然限于寻址 4 GB(即,使用 PAE,每个进程可以有 4 GB 的限制,而旧系统总共有 4 GB 的限制,根据需要在进程之间分配)。
【讨论】:
【参考方案3】:在大多数情况下它将是一个 32 位的虚拟地址。
如果您的操作系统支持分页,那么它将是虚拟地址。它可以使用分页映射到相同的物理地址。 Linux 和 Windows 进行分页。
另一件重要的事情是架构。在 Intel x86 32 位系统上,它将是 32 位地址。地址的前 10 位将用于获取页表。第二个 10 位将用于从选定的页表中获取页面。最后 12 位将为您提供该页面的实际物理地址。
我希望它能回答你的问题。
【讨论】:
以上是关于虚拟内存或物理内存的主要内容,如果未能解决你的问题,请参考以下文章