从物理地址(x86)计算逻辑地址

从物理地址(x86)计算逻辑地址,x86,computer-architecture,x86-16,16-bit,X86,Computer Architecture,X86 16,16 Bit,据我所知,物理地址是通过将段地址(16位)左移4次并将其与16位偏移地址相加来计算的。 我的问题是,如果两组不同的segment:offset地址值给出相同的结果会怎样 例如,对于200A:B608和2138:A328 200A0 +B608 2B6A8 及 21380 +A328 2B6A8 两者的结果相同 现在,这是否意味着它们指向同一个物理地址(如果是,如何?) 或者物理地址是否不打算以上述方式计算 或者,如果它有效,那么我如何从物理地址获取段:偏移地址(可能吗?在实地址模式中,段

据我所知,物理地址是通过将段地址(16位)左移4次并将其与16位偏移地址相加来计算的。 我的问题是,如果两组不同的segment:offset地址值给出相同的结果会怎样 例如,对于200A:B608和2138:A328

200A0 +B608
2B6A8
及 21380 +A328
2B6A8
两者的结果相同

现在,这是否意味着它们指向同一个物理地址(如果是,如何?)

或者物理地址是否不打算以上述方式计算


或者,如果它有效,那么我如何从物理地址获取段:偏移地址(可能吗?

在实地址模式中,段选择器实际上向左移动4位,然后添加到偏移量以形成20位线性地址(在该模式中与物理地址相同)

显然,这意味着不同的段:偏移对可以转换为相同的物理地址(就像启用分页的受保护模式中的不同线性地址可以转换为相同的物理地址一样)。由于逻辑地址和线性地址之间没有1:1的映射,所以从线性地址中只能得到一组转换为它的段:偏移对


您可以在《英特尔手册》第3B卷第20.1.1节中找到更详细的说明。

我认为现代操作系统不再使用分段内存模式,尽管大多数x86芯片仍然包含启用该功能的电路。即使DOS通常大部分都在虚拟环境中运行…@twalberg实际上,操作系统使用分段内存,但仅用于保护地址空间(环或特权级别链接到分段IIRC)。在x86上,NT系列(包括7个)至少使用了4个段,关于这个问题,IIRC(可能更多)。。我发现在这里使用物理和逻辑地址有点混乱(可能从操作系统的角度来看,它们对我来说有不同的意义。无论如何,我相信段选择器是16位长的,但在8086上只有4位有意义?这就是为什么可寻址内存是1MB(20位),这就是为什么只需要移位4位。(作为评论发布,我不太确定,需要检查,但我现在没有材料)