有效地址和物理地址的区别

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

我正在学习8086微处理器上的汇编编程,我想了解有效地址和物理地址之间的区别

我老师说有效地址和物理地址是一样的,但是其他参考文献说有效地址就是偏移量。

assembly x86-16 memory-address memory-segmentation
1个回答
0
投票

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。

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