【问题标题】:Segment and offset uses段和偏移使用
【发布时间】:2020-06-13 09:50:03
【问题描述】:

早期,内存大小很小 (64 KiB),只需要一个 16 位寄存器来寻址它。但是后来出现了 1 MiB 的内存。所以我们需要更大的地址寄存器。但在 8086 CPU 中,他们使用了另一个寄存器,并将其称为偏移量。

因此,使用 16 位主寄存器,我们可以寻址 65536 个段,而使用 16 位偏移量,我们可以寻址这些段中的 65536 个字节,所以我们可以寻址的整个内存应该是 65536 * 65536,这意味着我们可以寻址 4 GiB地址。

但在 8086 上,我们可以使用 32 位远指针(16 位段 + 16 位偏移)寻址 1 MiB。这是为什么呢?

【问题讨论】:

  • 片段重叠!
  • 你的意思是我们可以用多种方式解决一个位。这意味着我们可以通过 3855 种方式添加一些内容
  • 实际上有 4096 种方式。 (您的问题中似乎有很多数字和其他拼写错误。)例如,seg:ofs 地址12AB:34CD12AC:34BD 都指的是同一字节,位于线性地址15F7D

标签: x86-16 real-mode addressing-mode memory-segmentation


【解决方案1】:

正如 Nate Eldredge 在 cmets 中所提到的,这些部分是重叠的。每个后续的 86 模式段在前一个之后的 16 个字节开始。所以(如前所述)有 4096(4 Ki)方法来寻址任何一个字节。

例外情况与更高版本的 x86 CPU 上的 A20 处理有关。在那些上,如果启用 A20,前 64 KiB 中的内存指向它的别名更少。在 8086 上“换行”的地址(以 0FFFFh:0010h 开头)将指向前 64 KiB(以线性地址 00_0000h 开头)。

如果启用 A20,则高地址不再“换行”,因此 0FFFFh:0010h 实际上指的是线性地址 10_0000h(正好在 1 MiB = 1_048_576 字节)。在启用 A20 的实或虚拟 86 模式下,最高可访问地址是 0FFFFh:0FFFFh,它指向线性 10_FFEFh(略低于 1088 KiB - 16 字节),即 1_114_096 字节可使用 16:16 远地址寻址。

【讨论】:

  • 既然你调出了v8086模式。如果您不使用分页,则不会有换行,并且您将访问大约 1MiB 的线性地址(假设启用了 A20!)。然而,当启用分页时,刚好高于 1MiB 的 64Kib 可以映射到地址空间的前 64KiB,以模拟 A20 被禁用的外观。一些 v8086 软件允许以这种方式模拟 A20。我认为 Quarterdeck/Desqview 有这样的选择。在评论之前我已经投票了
  • @Michael Petch:虽然这是真的,但这个兼容性功能只是模拟了 A20 被 MMU 禁用,即线性地址到物理地址的转换。 HMA 地址仍然计算为 1 MiB 以上的 线性 地址。这些线性地址只是映射到与前 64 KiB 相同的物理地址。可以说,在实际的 8086 上,线性地址也环绕,尽管可以认为它没有 MMU,所以线性和物理是相同的。
猜你喜欢
  • 2014-02-04
  • 1970-01-01
  • 1970-01-01
  • 2018-06-18
  • 2014-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-21
相关资源
最近更新 更多