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位代码,请简单地说明.