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



在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地址线?

在真实模式下,启用A20线可以使我们的地址空间扩展64 KiB-16字节。

正确,在Real Mode(在286+上)中,您可以将段寄存器设置为0xFFFF,这将允许您访问高达(0xFFFF << 4) + 64K的内存。

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

保护模式是CPU模式,所以它不会"解锁"总线,它只是允许使用额外的地址空间,这需要在地址总线上有更多的引脚。

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

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

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

当286增加了更多的地址线时,IBM不想破坏与这个旧软件的兼容性,所以他们做了一件难以想象的事:他们在第21条地址线(A20)上放了一个外部门,并在默认情况下将其关闭,重新启用环绕行为,这样旧软件仍然可以正常工作。所以286本身对这种黑客攻击一无所知——它是CPU外部的。对于CPU来说,A20与任何其他地址线都没有什么不同。

该门(A20门)由键盘控制器IC上的GPIO引脚控制。因此,在进入保护模式之前,您需要启用它。如果你没有,(并说你平面映射了所有4GB的物理内存),那么正如Micheal Petch所指出的,"每个奇数兆字节的区域都将不可访问。所以1mb-2mb实际上将引用0-1mb,3mb-4mb将引用2mb-3mb等。"另请参阅:

  • A20行(维基百科)

最新更新