为什么启用/禁用A20线路

时间:2012-12-15 14:28:03

标签: osdev

我对A20 gate有疑问。我读了一篇关于它的文章说这个机制存在解决当新的CPU有32位地址总线而不是旧的20位总线时出现的地址“环绕”的问题。

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

为什么只关闭A20位才能解决问题呢?

1 个答案:

答案 0 :(得分:11)

最初的问题与x86 memory segmentation有关。

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

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

要解决此问题,他们介绍了一种强制A20地址行为零的方法,从而强制进行环绕。

您的问题是:“为什么只是A20A21 - A31怎么办?”

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