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

10

在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个回答

16
在实模式下,启用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指出的那样,“每个奇数兆字节区域都将无法访问。因此,1mb-2mb实际上将引用0-1mb,3mb-4mb将引用2mb-3mb等。”


@cad A20 门是一种外部黑客技术。如果不是IBM PC-AT设计师添加它,我们今天就不会进行这个对话了。286本身并没有对待A20有任何区别。2. 我的意思是,“黑客”即A20环绕需要被禁用…通过启用A20门来实现。 - Jonathon Reinhart
1
@cad 啊,我现在明白了。是的,在实模式下(在286+上),您可以将段寄存器设置为0xFFFF,这将允许您访问高达(0xFFFF << 4)+ 64K的内存。谢谢,我已经更正了那个地址。 - Jonathon Reinhart
1
@cad 实际上并不需要启用A20线路。但如果不这样做,则每个奇数兆字节区域将无法访问。因此,1mb-2mb实际上将引用0-1mb,3mb-4mb将引用2mb-3mb等。如果不启用A20位,则该地址线始终为零。当然,这相当无用,但仍然被允许。 - Michael Petch
1
@cad 一个注脚可能是,DOS 的原始版本需要兼容 CP/M 操作系统的换行符,通过允许一些与 CALL 5 机制兼容来实现,在 CP/M 上使用 BDOS(基本磁盘操作系统)调用。 - Michael Petch
1
@MichaelPetch 谢谢,我引用了你对别名的解释,因为它比我的更准确(我忘记了它会发生在每个奇数MB)。 - Jonathon Reinhart
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接