首页 文章

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

提问于
浏览
3

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

请尽可能解释 . 谢谢 .

2 回答

  • 10

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

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

  • -2

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

    当然,一个封闭的A20门完全混淆了你在保护模式下的20位地址,这就是为什么你必须确保它切换到保护模式时打开它 .

相关问题