Memory management 相对地址和逻辑地址之间的差异

Memory management 相对地址和逻辑地址之间的差异,memory-management,operating-system,Memory Management,Operating System,我正在读一本名为《操作系统》的书中有关内存管理的内容。 我以前研究过这个问题,这是很清楚的,因为这里只介绍了两种类型的地址:物理地址和逻辑地址(物理地址和虚拟地址)。然而,这本书似乎介绍了三种类型,有时将其中两种视为相同,有时视为不同 这里有一句话(我自己翻译,所以可能不是最好的): 在编写程序时,不知道程序中的哪个点 程序将使用内存,这就是使用符号地址的原因 (变量名)。把符号地址翻译成数字地址的过程 物理地址称为地址绑定,可以在 不同的时间点。如果在编译过程中,在 程序将在内存的哪一部分进行

我正在读一本名为《操作系统》的书中有关内存管理的内容。 我以前研究过这个问题,这是很清楚的,因为这里只介绍了两种类型的地址:物理地址和逻辑地址(物理地址和虚拟地址)。然而,这本书似乎介绍了三种类型,有时将其中两种视为相同,有时视为不同

这里有一句话(我自己翻译,所以可能不是最好的):

在编写程序时,不知道程序中的哪个点 程序将使用内存,这就是使用符号地址的原因 (变量名)。把符号地址翻译成数字地址的过程 物理地址称为地址绑定,可以在 不同的时间点。如果在编译过程中,在 程序将在内存的哪一部分进行地址绑定 在那一点上我们必须完成。否则(最常见的情况)编译器 生成相对地址(相对于该部分的开头) 进程获得的内存)。当执行一个程序时 加载器将相对地址映射为物理地址

这一切似乎都很清楚。相对映射到物理对象。下面是接下来的内容:

在进程执行期间,与内存的交互是通过 读取和写入内存位置的顺序。CPU也不例外 从内存中读取指令或数据,或将数据写入 记忆。在这两个任务中,CPU不使用物理内存 而不是CPU自己生成的逻辑地址。所有逻辑的集合 地址称为虚拟地址空间。

这已经令人困惑了。逻辑地址和相对地址有什么区别?不管我在哪里查到这个,他们从来没有分开过。下面是一个更令人困惑的句子:

如果在编译时完成了地址绑定 然后加载虚拟地址空间与物理地址匹配 空间

前面提到,地址绑定是将符号地址转换为物理地址的过程。但直到后来才引入相对地址的概念。加载被称为是将相对转换为物理的过程。所以现在我完全迷路了

假设我们不知道这个过程将占用哪一部分内存:时间线是如何走的?程序被编译,变量名(符号地址)被翻译成。。。我想是亲戚吧?然后CPU需要执行一些读/写操作,它使用。。。合乎逻辑的

此外,在本书的以下章节中,相对和逻辑两个术语似乎是随机使用的。好像它们是一样的,但定义却不同

有人能帮我澄清一下吗?完美的答案可能是一个程序时间表的人工示例。在哪一点引入了哪个地址,逻辑地址和相对地址之间的区别是什么


提前谢谢

相对地址是指两个位置或地址之间的距离(可以是逻辑的、线性的/虚拟的或物理的,在这一点上并不重要)

例如,x86调用和跳转指令有一个表单,用于指定调用/跳转的距离(从调用/跳转指令结束后的字节开始计算)。这个距离被简单地添加到指令指针寄存器([R | E]IP)中,这就是下一条指令将来自的位置(同样,我现在忽略逻辑,…,物理)

如果您的程序包含一个子例程并使用这样的指令调用它,那么程序在内存中的位置并不重要,因为整个程序的两个位置之间的距离保持不变(如果整个程序由多个活动部分组成,包括一个或多个库,事情会变得更加复杂,但我们还是别说了)

现在,假设您的程序有一个全局变量,需要读取它。如果有一个类似于上述调用指令的内存读取指令,您可以再次使用从指令指针到变量位置的距离。在64位x86 CPU之前,没有这样的指令/机制来访问数据,只有c跳转和跳转可能是IP相关的

如果没有这样的IP相对数据寻址机制,您需要知道变量的实际地址,直到程序加载到内存中执行时才知道。在这种情况下,读取变量的指令最初接收到变量相对于IP的地址(读取变量的指令的名称)或者只是程序的开始。这就是程序存储在磁盘上的方式,指令中有一个相对地址。一旦加载,但在程序开始执行之前,读取它的指令中变量的地址会被调整,使其成为实际地址,而不是相对于某个东西(IP或程序的开始).程序的起始位置离地址0越远,需要将较大的调整添加到该相对地址

明白了吗

而现在一些几乎完全不同和不相关的东西

在x86 CPU的上下文中,有以下几种地址:

  • 合乎逻辑
  • 线性/虚拟
  • 物理的
如果我们一直回到8086/8088…实际上,如果我们再回到8080/8085,所有的内存地址都是16位的,它们不需要CPU进行任何转换,而是按原样呈现给内存,因此它们是物理的(我们这里不讨论IP/PC相关的调用/跳转指令)

16位允许64KB的内存。8086/8088将这些16位地址扩展为另外16位,以寻址64KB以上的内存,但它没有JU