【问题标题】:What role does A20 line plays in Protected mode?A20线在保护模式下起什么作用?
【发布时间】:2016-11-21 10:11:36
【问题描述】:

我正在浏览 x86 的保护模式部分。我刚刚了解了 GDT。之前,我研究过要进入保护模式(即:使用所有 32 位地址线)必须启用 A20 门。 那么,启用 A20 的代码必须是 16 位的吧? 最近浏览wiki.osdev站点时,发现启用A20的代码是用x86汇编编写的。 X86 程序集生成的 32 位操作码无法在 16 位模式下加载,对吧?

如果可能请解释一下。 谢谢。

【问题讨论】:

  • 有 16 位和 32 位 x86 程序集。您可以为任一模式组装 x86 程序集。
  • 生成的代码类型取决于汇编器和汇编器指令以及汇编器标志,就像它取决于实际使用的操作码一样。

标签: assembly x86 operating-system kernel gdt


【解决方案1】:

8086 寻址模型将 16 位段和 16 位偏移量组合为 segment * 16 + offset
最小地址为000000h,最大为10ffefh
虽然后者在技术上是 21 位值,但 CPU 只有 20 位地址总线,因此可访问的最大地址是 0fffffh1

0fffffh 上面的地址只是简单地包裹在2 周围,所以 10ffefh0ffefh 的别名。
一些程序开始依赖它。

当 80286 出来时,它有 24 位地址总线。
10ffefh 之类的地址不再环绕。
当时模拟旧的行为需要太多的晶体管(10ffefh 不能用 AND 来掩蔽),因此引入了 A20 掩膜。

顾名思义,地址线 20,即第 21 位,与 8055/8042 芯片中特定寄存器的特定位进行“与”运算。
BIOS 在启动时清除该位,从而将第 21 位强制为零,模拟旧行为。

如果不启用 A20,每个物理地址的第 21 位将始终为零。


A20 可以在保护模式下使用平面模型启用,这是最接近“32 位模式”的东西,但需要小心将代码放入内存中。

只需告诉汇编器目标大小,x86 汇编就可以同样用于生成 16 位或 32 位代码。


1 例如,由 0f000h 的段和 0ffffh 的偏移量给出。
2 sup> 第 21 位被简单地丢弃了。
3 简单地说,如果您正在编写 16 位或 32 位代码。

【讨论】:

  • 尽管您的回答中暗示了这一点,但我只是为了清楚起见。如果不启用 A20 线,则从奇数兆字节 (1024k) 边界开始的所有内存区域将映射到其正下方的偶数兆字节区域。当然,副作用是一半的可用物理内存地址将无法访问。
  • 你能详细解释一下@Michael Petch吗?
  • @PantherCoder Michael 说范围 100000h - 1FFFFFh 将映射到 000000h - 0FFFFFh ,范围300000h - 3FFFFFh200000h - 2FFFFFh,范围500000h - 5FFFFFh400000h - 4FFFFFh 等等。范围 000000h - 0FFFFFh, 200000h - 2FFFFFh, 400000h - 4FFFFFh 等不受影响。这是由于 A20 被强制为零,有效地在地址之外留下了一个位(32 位 -> 31 位),从而将地址空间减半。取一些随机的 32 位,看看当你屏蔽 20 位时会发生什么。
【解决方案2】:

问题在于,如果 A20 门关闭,第 20 个地址位将设置为零。例如,如果你想访问地址 0x000100ab,你实际上是在访问 0x000000ab,或者如果你想访问 0x06570021,你实际上是在访问 0x0656021,无论你是处于保护模式还是实模式。这样做的原因是,在实模式下,您可以使用例如 0x001000ab 生成一个占用更多 20 位的物理地址。段:有效地址组合 FFFF:00bb,但 8086 将其截断为 0x000ab,而如果 A20 门打开,80286 或更新版本将访问 0x001000ab,这对于依赖于“环绕”的程序(如某些 BIOS 代码)是不利的功能”。

当然,关闭的 A20 Gate 会完全搞砸你,因为它们在保护模式下是 20 位地址,这就是为什么你必须确保在切换到保护模式时它已打开。

【讨论】:

    猜你喜欢
    • 2016-02-22
    • 2020-04-27
    • 2012-12-03
    • 2016-12-06
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 1970-01-01
    • 2013-11-22
    相关资源
    最近更新 更多