为啥启用/禁用 A20 线
Posted
技术标签:
【中文标题】为啥启用/禁用 A20 线【英文标题】:Why Enable/Disable A20 Line为什么启用/禁用 A20 线 【发布时间】:2012-12-03 07:16:33 【问题描述】:我对@987654321@ 有疑问。我读过一篇关于它的文章,说存在解决地址“环绕”问题的机制,当较新的 CPU 使用 32 位地址总线而不是较旧的 20 位总线时出现的问题。
在我看来,处理环绕的正确方法是关闭所有位 A20-A31,而不仅仅是 A20。
为什么只关闭A20位就可以解决问题?
【问题讨论】:
wiki.osdev.org/A20_Line 谢谢我之前读过!!但我认为仍然没有回应! 【参考方案1】:原来的问题与x86 memory segmentation有关。
将使用segment:offset
访问内存,其中segment
和offset
都是16 位整数。实际地址计算为segment*16+offset
。在 20 位地址总线上,这自然会被截断为最低 20 位。
当相同的代码在超过 20 位的地址总线上运行时,这种截断可能会出现问题,因为程序可以访问超过第一个兆字节的内存,而不是回绕。虽然本身不是问题,但这可能是向后兼容性问题。
为了解决这个问题,他们引入了一种将A20
地址行强制为零的方法,从而强制回绕。
你的问题是:“为什么只是A20
?那A21
-A31
呢?”
请注意,使用 16 位 segment:offset
方案可以寻址的最高位置是 0xffff * 16 + 0xffff = 0x10ffef
。这适合 21 位。因此,A21
-A31
的行始终为零,需要控制的只有 A20
。
【讨论】:
这就是我想要的!!谢谢NPE以上是关于为啥启用/禁用 A20 线的主要内容,如果未能解决你的问题,请参考以下文章