我对虚拟地址和物理地址之间关系的理解是否正确?

Is my understanding of the relationship between virtual addresses and physical addresses correct?

我一直在研究(在 SO 和其他地方)虚拟地址和物理地址之间的关系。如果有人能确认我对这个概念的理解是否正确,我将不胜感激。

页 table 被分类为 'virtual space' 并包含每个页的虚拟地址。然后它映射到 'physical space',其中包含每个页面的物理地址。

一张维基百科图表让我的解释更清楚:

https://upload.wikimedia.org/wikipedia/commons/3/32/Virtual_address_space_and_physical_address_space_relationship.svg

我对这个概念的理解是否正确?

谢谢。

不完全正确。

每个程序都有自己的虚拟地址space。从技术上讲,只有一个地址 space,即物理随机存取存储器。因此它被称为 "virtual" 因为对于用户程序来说它似乎有自己的地址 space.

现在以指令mov 0x1234, %eax(AT&T)或MOV EAX, [0x1234](Intel)为例:

  1. CPU 将虚拟地址 0x1234 发送到它的一部分,MMU。
  2. MMU从页面table获取对应的物理地址。这个调整地址的过程也被亲切地称为"massaging."
  3. CPU 从物理地址指向的 RAM 位置检索数据。

具体的翻译过程很大程度上取决于实际的架构和CPU。

The page table is classified as 'virtual space' and contains the virtual addresses of each page. It then maps to the 'physical space', which contains the physical addresses of each page.

这并不正确。页table定义了一个由页组成的逻辑地址space。页 table 将逻辑页映射到物理页框,它们表示页框 [还] 不存在于内存中,在这种情况下,您有一个虚拟映射。使用磁盘模拟内存时,页面是 VIRTUAL space.

在过去,页面 tables 总是建立一个虚拟地址 space。现在在没有虚拟内存(分页)的情况下使用逻辑地址转换变得越来越普遍(例如嵌入式系统)。因此,术语 "virtual memory" 和 "logical memory" 经常被混淆。

物理地址space只存在于操作系统中。该进程只看到一个逻辑地址 space.

这有点过于简单化了,因为进程在发生异常或中断后成为操作系统,并且内核在公共逻辑地址范围内运行。然而,操作系统内核确实必须在某种程度上管理物理内存。

例如,页面 tables 的某些方面必须使用物理地址。如果页面 tables 使用所有逻辑地址,那么地址转换就会遇到先有鸡还是先有蛋的问题。各种硬件系统以不同的方式解决这个问题。

最后,您 link 的图表是一个非常糟糕的插图。