【问题标题】:Why enable A20 line in Protected Mode?为什么要在保护模式下启用 A20 线?
【发布时间】:2016-02-22 23:42:05
【问题描述】:

在Linux 0.01的bootloader的汇编源文件中,启用了A20行。

来自boot/boot.s

| that was painless, now we enable A20

call     empty_8042
mov al,#0xD1

...

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

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

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

【问题讨论】:

    标签: linux assembly linux-kernel x86 operating-system


    【解决方案1】:

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

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

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

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

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

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

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

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

    此门(A20 门)由键盘控制器 IC 上的 GPIO 引脚控制。因此,您需要在进入保护模式之前启用它。如果你没有,(假设你平面映射了所有 4GB 物理内存),那么作为Micheal Petch indicated,“每个奇数兆字节区域都将无法访问。所以 1mb-2mb 实际上将引用 0-1mb、3mb-4mb将参考 2mb-3mb 等" 另见:

    【讨论】:

    • 1.因此,保护​​模式不会启用 A20,而是启用与该模式相关的所有其他地址线(16 位 -> A0 - A23、32 位 -> A0 - A31),对吗? 2. 据我所知,“'A20 line' [...] 需要在保护模式按预期运行之前禁用”和“您需要在进入保护模式之前启用它 [A20 line]”相互矛盾其他。请你澄清一下好吗? 3. “这不准确”是什么意思?
    • @cad 啊,我现在明白了。是的,您是对的,在实模式下(在 286+ 上)您可以将段寄存器设置为 0xFFFF,这将允许您访问高达 (0xFFFF
    • @cad 实际上不需要启用 A20 线。如果你不这样做,那么效果是每个奇数兆字节区域都将无法访问。所以 1mb-2mb 实际上将引用 0-1mb,3mb-4mb 将引用 2mb-3mb 等。如果不启用 A20 位,该地址线将始终为零。当然这没什么用,但仍然是允许的。
    • @cad 一个脚注可能是原始版本的 DOS 通过允许与用于制作 BDOS 的 CALL 5 机制(基本磁盘操作system) 调用 CP/M
    • @MichaelPetch 谢谢,我引用了你对别名的解释,因为它比我的更准确(我忘了它会发生在 每个 奇数 MB)。
    猜你喜欢
    • 2016-11-21
    • 2020-04-27
    • 2012-12-03
    • 2016-01-16
    • 1970-01-01
    • 2016-12-06
    • 1970-01-01
    • 2015-09-08
    • 1970-01-01
    相关资源
    最近更新 更多