我对A20 gate有疑问。我读了一篇关于它的文章说这个机制存在解决当新的CPU有32位地址总线而不是旧的20位总线时出现的地址“环绕”的问题。
在我看来,处理环绕的正确方法是关闭所有位A20-A31,而不仅仅是A20。
为什么只关闭A20位才能解决问题呢?
答案 0 :(得分:11)
最初的问题与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
来控制。