首页 文章

为什么在保护模式下启用A20线路?

提问于
浏览
7

在Linux 0.01的引导加载程序的汇编源文件中,启用了A20行 .

boot/boot.s

| that was painless, now we enable A20

call     empty_8042
mov al,#0xD1

...

之后,引导加载程序跳转到保护模式 .

在实模式下,启用A20线路可以为我们提供64 KiB - 16字节的地址空间扩展 .
在保护模式下,地址总线自动解锁 .

当跳转到保护模式时,为什么引导加载程序会启用A20地址线呢?

1 回答

  • 10

    在实模式下,启用A20线路可以为我们提供64 KiB - 16字节的地址空间扩展 .

    正确,在实模式下(在286上),您可以将段寄存器设置为 0xFFFF ,这将允许您访问高达 (0xFFFF << 4) + 64K 的内存 .

    在保护模式下,地址总线自动解锁 .

    保护模式是CPU模式,因此它不会“解锁”总线,它只允许使用额外的地址空间,这需要地址总线上有更多的引脚 .

    当跳转到保护模式时,为什么引导加载程序会启用A20地址线呢?

    因为它不会 . “A20”通常是指在PC-AT中添加的硬件黑客,需要在保护模式按预期运行之前禁用 .

    首先,回想一下旧的旧CPU(通过80186)最多只能访问1 MiB的内存,因此有20条地址线(A0-A19) . 一些非常古老的软件利用了1 MiB以上的内存访问将包装到较低内存的事实 .

    当286增加了更多地址线时,IBM不想破坏与这个旧软件的兼容性,所以他们做了不可想象的事情:他们在21号地址线(A20)上放置了一个外部门,并在默认情况下将其关闭 - 启用环绕行为,因此旧软件仍可正常运行 . 所以286本身对这个黑客一无所知 - 它在CPU外部 . 对于CPU,A20与任何其他地址线没有什么不同 .

    该门(A20门)由键盘控制器IC上的GPIO引脚控制 . 因此,您需要在进入保护模式之前启用它 . 如果你没有,(并说你平面映射了所有4GB的物理内存),那么Micheal Petch indicated,"every odd numbered megabyte region will be inaccessible. So 1mb-2mb will actually reference 0-1mb, 3mb-4mb will reference 2mb-3mb etc."参见:

相关问题