关于虚拟内存这个术语有些混淆,它实际上是指以下两个非常不同的概念
- 使用磁盘页面来扩展计算机物理内存的概念数量 - 正确的术语实际上是 分页
- 各种操作系统/CPU 使用的一种抽象,用于创建每个进程在单独的连续地址空间中运行的假象。
交换空间,OTOH,是磁盘部分的名称,用于在不使用时存储额外的 RAM 页面。
一个重要的认识是,由于后者的硬件和操作系统支持,前者是透明的。
为了更好地理解这一切,您应该考虑 CPU 和操作系统如何支持“虚拟内存”(如定义 2)。
假设您有一个 32 位指针(64 位指针类似,但使用的机制略有不同)。一旦启用了“虚拟内存”,处理器就会将此指针视为三个部分。
- 最高 10 位是页面目录条目
- 以下 10 位是 页表条目
- 最后 12 位构成 页面偏移量
现在,当 CPU 试图访问指针的内容时,它首先会查阅 Page Directory 表——一个由 1024 个条目组成的表(在 X86 架构中,它的位置被指向由 CR3 寄存器)。 10 位的Page Directory Entry 是该表中的一个索引,它指向Page Table 的物理位置。这又是另一个包含 1024 个条目的表,每个条目都是物理内存中的一个指针,以及几个重要的控制位。 (我们稍后会回到这些)。找到页面后,最后 12 位用于在该页面中查找地址。
还有许多更多细节(TLB、大页面、PAE、选择器、页面保护),但上面的简短说明抓住了要点。
使用这种转换机制,操作系统可以为每个进程使用一组不同的物理页面,从而给每个进程一个拥有所有内存的错觉(因为每个进程都有自己的页面目录)
在这个虚拟内存之上,操作系统还可以添加分页的概念。前面讨论的控制位之一允许指定条目是否“存在”。如果它不存在,则尝试访问该条目将导致 Page Fault 异常。操作系统可以捕获此异常并采取相应措施。因此,支持交换/分页的操作系统可以决定从 交换空间 加载页面,修复转换表,然后再次发出内存访问。
这是两个术语结合的地方,支持虚拟内存和分页的操作系统可以通过分页(交换)页面进出交换区域,使进程产生比实际内存更多的错觉。
关于您的最后一个问题(为什么说 32 位 CPU 仅限于 4GB 虚拟内存)。这指的是定义 2 的“虚拟内存”,是指针大小的直接结果。如果 CPU 只能使用 32 位指针,那么您只有 32 位来表示不同的地址,这给您 2^32 = 4GB 的可寻址内存。
希望这能让事情更清楚一点。