我正在学习8086微处理器上的汇编编程,我想了解有效地址和物理地址之间的区别
我老师说有效地址和物理地址是一样的,但是其他参考文献说有效地址就是偏移量。
x86架构具有三个阶段的地址计算:
在第一阶段,计算“有效地址”。 该地址是执行由存储器操作数的寻址模式给出的计算的结果,即索引乘以标度并添加到基址和位移以产生地址。 如果您使用 lea
(加载有效地址)指令,这就是计算的地址。 例如,如果您有一个内存操作数
[eax + 2*ecx + 1]
以及 eax = 0x1000
和 ecx = 0x100
,则有效地址将为 0x1000 + 2*0x100 + 1 = 0x1201
。在第二阶段,查询段描述符缓存,将内存操作数访问的段的段基地址应用到有效地址,形成线性地址(如,不分段)。 段的默认段取决于所使用的基址寄存器。 如果基址寄存器是 rbp
或
rsp
(或这些的不同大小的变体),则 ss
段是默认值,否则 ds
段是默认值。 一些带有隐式内存操作数的指令具有其他默认值(例如 stos
和 movs
,它们使用 es
作为目标)。 可以使用段前缀覆盖该段。例如,如果您的内存操作数与上面相同,并且段ds
的基地址是
0x1000
,则线性地址将为0x1000 + 0x1201 = 0x2201
。这一步通常可以忽略。 在长(64 位)模式下,为 cs
、
ds
、ss
和 es
配置的基址将被忽略。 在 32 位模式下,它们通常设置为零。 然而,fs
和gs
的基地址通常设置为某个非零值,以方便使用线程本地存储。 如果您看到 fs
或 gs
段覆盖,则强烈表明正在使用 TLS。第三步,在 TLB 中查找线性地址,如果失败,则在页表中查找,以形成“物理地址”。 然后使用该地址来访问内存。 物理地址由您的操作系统管理。 一般情况下您也可以忽略此步骤。
如果使用虚拟化,可能需要一个额外的转换步骤来将虚拟化物理地址转换为物理地址。 这称为“嵌套分页”。 访问设备内存时,作为 IOMMU 的一部分,还可能有一个额外的地址转换步骤,将虚拟设备地址转换为物理设备地址。 除了第一个阶段外,内存地址转换可能会失败。 计算线性地址时,段可能不存在或类型不正确,或者可能超出段限制或访问权限可能不足。 计算物理地址时,页面可能不存在或不可访问。 这同样适用于嵌套分页或 IOMMU。