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

如果可能,请解释。
谢谢你。

最佳答案

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

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

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

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

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

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

通过告诉汇编程序目标大小,x86 汇编程序同样可以用于生成 16 位或 32 位代码。

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

关于assembly - A20 线在保护模式下扮演什么角色?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38442880/

10-11 07:08