为啥启用/禁用 A20 线

Posted

技术标签:

【中文标题】为啥启用/禁用 A20 线【英文标题】:Why Enable/Disable A20 Line为什么启用/禁用 A20 线 【发布时间】:2012-12-03 07:16:33 【问题描述】:

我对@9​​87654321@ 有疑问。我读过一篇关于它的文章,说存在解决地址“环绕”问题的机制,当较新的 CPU 使用 32 位地址总线而不是较旧的 20 位总线时出现的问题。

在我看来,处理环绕的正确方法是关闭所有位 A20-A31,而不仅仅是 A20。

为什么只关闭A20位就可以解决问题?

【问题讨论】:

wiki.osdev.org/A20_Line 谢谢我之前读过!!但我认为仍然没有回应! 【参考方案1】:

原来的问题与x86 memory segmentation有关。

将使用segment:offset 访问内存,其中segmentoffset 都是16 位整数。实际地址计算为segment*16+offset。在 20 位地址总线上,这自然会被截断为最低 20 位。

当相同的代码在超过 20 位的地址总线上运行时,这种截断可能会出现问题,因为程序可以访问超过第一个兆字节的内存,而不是回绕。虽然本身不​​是问题,但这可能是向后兼容性问题。

为了解决这个问题,他们引入了一种将A20 地址行强制为零的方法,从而强制回绕。

你的问题是:“为什么只是A20?那A21-A31呢?”

请注意,使用 16 位 segment:offset 方案可以寻址的最高位置是 0xffff * 16 + 0xffff = 0x10ffef。这适合 21 位。因此,A21-A31 的行始终为零,需要控制的只有 A20

【讨论】:

这就是我想要的!!谢谢NPE

以上是关于为啥启用/禁用 A20 线的主要内容,如果未能解决你的问题,请参考以下文章

我对A20线检查代码的理解是否正确?

启用 A20 门时需要这么多键盘控制器等待调用吗

为啥我可以禁用但不能启用可丢弃功能?

为啥“barrier()”足以禁用或启用抢占?

魔兽世界如何才能启用DIRECTX11

为啥 UIBarButtonItem 默认是禁用的?