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

Why enable A20 line in Protected Mode?

在Linux0.01的bootloader的汇编源文件中,使能了A20线。

来自boot/boot.s

| that was painless, now we enable A20

call     empty_8042
mov al,#0xD1

...

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

在实模式下,启用 A20 行可为我们提供一个地址 space 扩展 64 KiB - 16 字节。
在保护模式下,地址总线自动解锁。

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

In Real Mode, enabling the A20 line grants us an address space expansion of 64 KiB - 16 bytes.

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

的内存

In Protected Mode, the address bus is unlocked automatically.

保护模式是一种CPU模式,所以它不"unlock"总线,它只是允许使用额外的地址space,这需要地址上有更多的引脚公共汽车。

Why does the bootloader enable the A20 address line when the jump to Protected Mode would do that anyway?

因为不会。 "A20" 一般是指在 PC-AT 中添加的硬件破解,需要在保护模式正常运行之前将其禁用。

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

当286增加了更多的地址线后,IBM不想破坏与这个旧软件的兼容性,所以他们做了不可思议的事情:他们在external第 21 地址行 (A20),默认情况下将其关闭,重新启用环绕行为,因此旧软件仍可正常运行。所以 286 本身对这个黑客一无所知——它在 CPU 之外。对于CPU,A20和其他地址线没有区别。

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