A20线在保护模式下扮演什么角色?

Pan*_*der 3 x86 assembly operating-system kernel gdt

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

请尽可能解释.谢谢.

Mar*_*oom 11

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

上述地址0FFFFFH简单地缠2,所以10ffefh是一个别名0ffefh.
一些程序开始依赖于此.

当80286出来时,地址总线有24位.
10ffefh这样的地址不再包围了.
模拟旧的行为当时需要太多的晶体管(10Effh不能用AND掩盖)所以引入了A20掩模.

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

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


可以使用扁平模型启用受保护模式的A20,这与"32位模式"最接近,但是需要小心将代码放入内存.

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


1由下式给出,例如,一个段0f000h和偏移0FFFFH.
2第21位被简单地丢弃了.
3如果您要编写16位或32位代码,请简单地说明.

  • 尽管在你的回答中有暗示,但我只是想说清楚这一点.如果未启用A20线,则从奇数兆字节(1024k)边界开始的所有内存区域将映射到其下方的偶数兆字节区域.当然,副作用是无法访问一半的可用物理内存地址. (3认同)
  • @PantherCoder迈克尔说,范围*100000h* - *1FFFFFh*将被映射到*000000h* - *0FFFFFh*,范围*300000h* - *3FFFFFh*到*200000h* - *2FFFFFh*,范围*500000h*- *5FFFFFh*至*400000h* - *4FFFFFh*等等.范围*000000h* - *0FFFFFh*,*200000h* - *2FFFFFh*,*400000h* - *4FFFFFh*等不受影响.这是因为A20被强制为零,实际上有一点超出地址(32位 - > 31位),从而使地址空间减半.取一些随机的32位,看看当你屏蔽位20时会发生什么. (2认同)