相对和逻辑地址之间的区别

问题描述 投票:0回答:1

我读内存管理从一个名为操作系统的书。我以前研究过这个问题,这是所有清楚,因为当时只有两个被引入的地址类型:物理和逻辑(物理和虚拟)。但是,这本书似乎引进三类它的视图有时两个人一样,有时不同。

这里有一个引号(翻译自己,所以可能不是最好的):

在写程序是不知道此时在存储器中的程序将是,这就是为什么符号地址被使用(变量名)的时间。翻译符号地址到物理地址的过程称为地址绑定,它可以在不同的时间点来完成。如果在编译过程中,它在内存的哪个部分称为程序会再地址绑定则在这一点上进行。否则(最常见的情况),编译器产生(相对于该工艺得到的存储器的部分的开始)相对地址。当执行程序装载器相对地址映射到物理地址。

这一切都似乎是相当清楚的。相对映射到物理。以下是之后的部分:

在进程执行期间,与存储器的相互作用是通过读出和写入到存储器位置的序列来完成。的CPU或者从存储器中读取指令或数据或将数据写入到存储器中。在这两项任务时,CPU不使用物理地址,但其CPU产生本身,而逻辑的。该组中的所有逻辑地址被称为虚拟地址空间。

这已经是令人困惑,因为它是。什么是逻辑和相对地址的区别?任何其他地方我期待这件事他们永不分离。这里谈到一个更加混乱的句子:

如果地址绑定在编译和加载的时间完成那么虚拟地址空间中的物理地址空间相匹配。

在早前的声明地址绑定是将符号地址到物理地址的过程。但后来才有了后来的介绍是相对地址的概念。和装载据说是相对转换成物理的过程。所以现在我完全失去了这里。

假设我们没有过程是要占用内存的哪个部分的知识:怎样的时间表去了?程序编译时,变量名(符号地址)翻译成...相对那些我猜?然后,CPU需要做一些读/写,它使用...逻辑的吗?

进而,相对的,逻辑的条款似乎在这本书的以下部分随机使用。就好像它们是相同的,但仍然被定义为不同的。

任何人都可以澄清这对我?完美的答案将是可能的节目时间表的一个人为的例子。在哪个点哪个地址推出,是什么逻辑和相对地址的区别?

提前致谢。

memory-management operating-system
1个回答
0
投票

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

例如,在x86呼叫和跳转指令具有指定距离(呼叫/跳转指令结束后从字节计数)来调用/跳跃的形式。这距离简单地添加到指令指针寄存器([R | E] IP),这就是定位下一个指令将来自(再次,我无视逻辑,...,身体现在)。

如果你的程序中包含一个子程序和使用这种指令调用它,它并不重要,因为整个的两个位置之间的距离保持不变(事情会变得好像整个方案包括更为复杂,其中程序位于内存一些移动部件,包括一个或多个库,但我们不要去那里)。

现在,让我们说你的程序有一个全局变量,需要读它。如果有类似于上述的调用指令的存储器读取指令,可以再次使用从指令指针的距离可变的位置。在64位x86 CPU在此之前没有这样的指令/机制来访问数据,只要求和跳跃可能是IP-相对的。

在不存在这样的IP-相对数据寻址机制的,你需要知道变量,就不会知道,直到程序被加载到存储器以供执行的实际地址。什么在这种情况下的完成是最初读取变量的指令接收变量相对于IP(即读取变量的指令),或者仅仅是程序的起始地址。这就是今天的节目是如何存储在磁盘上,与指令中的相对地址。一旦加载,但该计划开始执行,在读它的指令变量的地址之前被调整,使得它成为实际地址,而不是相对的东西(IP或程序的启动)。在进一步远离该程序的开始是从地址0,较大的调整需要被添加到该相对地址。

明白了吧?

而现在的东西几乎完全不同的,不相关的...

在x86处理器的情况下,也有这类地址:

  • 合乎逻辑
  • 线性/虚拟
  • 物理

如果我们所有的方式回到8086/8088 ......其实,如果我们再进一步回到八千零八十五分之八千零八十零,所有的内存地址都是16位的,他们不通过CPU进行任何转换和呈现原样到内存中,因此它们是物理(我们不是在谈论IP / PC-相对调用/跳转指令这里)。

16位允许对存储器64KB。 8086/8088扩展与其他16位中的16个地址来寻址的内存大于64KB以上,但它不只是扩大所有寄存器和地址从16位到32位。相反,它出台了专门的段寄存器,这将在对与8085分之8080的那些老的16位地址来使用。所以,一对寄存器诸如DS(段寄存器)和BX的(常规的通用寄存器)可以解决在地址DS * 16 + BX存储器。该对DS:BX是逻辑地址,该值是DS * 16 + BX的物理地址。有了这个计划,我们可以访问约1MB的内存(只需插入65535两个寄存器)。

80286稍微改变上述通过引入所谓的保护模式,在计算物理地址segment_table[DS] + BX(这允许去从1MB到16MB),但这个想法仍然是一样的。

接着沿80386来到和加宽寄存器为32位,并介绍的间接又一层。物理地址现在,简化了一下,page_tables[segment_table[DS] + EBX]

该对DS:EBX构成的逻辑地址,这就是该程序以(例如,在指令MOV EAX, DS:[EBX]),这是它可以观察操纵。

segment_table[DS] + EBX构成线性/虚拟地址(该程序可能不总是知道,因为它不能看到成segment_table[],由OS管理的表)。如果未启用页面转换,这个线性/虚拟地址也等于最终的物理地址。

启用页转换,物理地址是page_tables[segment_table[DS] + EBX]

更重要的是要知道:

  • 逻辑地址可以更复杂,例如DS:[EAX + EBX * 2 + 3]
  • 操作系统通常设置segment_table[]使得segment_table[any segment register]=0,有效地去除所述分段机制出来的画面,并用例如结束了物理地址= page_tables[EAX + EBX * 2 + 3]。虽然这是不完全正确地说,在这样的设置逻辑和线性/虚拟地址是相同的(EAX + EBX * 2 + 3),这无疑简化思维。

现在,做这些表和页表与在开始讨论相对地址和搬迁办?这些表只是让你随时随地把你的程序在物理内存中,往往在一个非常透明的方式对程序本身。它并不需要知道它是在物理上还是网页翻译功能已启用。

不过,也有使用网页翻译一定的好处,但是这是这里的范围之外。

© www.soinside.com 2019 - 2024. All rights reserved.