我有一个关于A20 gate的问题。我读了一篇有关它的文章,说存在一种机制来解决地址“回绕”的问题,当新的CPU使用32位地址总线而不是较旧的20位总线时,就会出现这种问题。
在我看来,处理折回的正确方法是关闭所有位A20-A31,而不仅仅是A20。
为什么仅关闭A20位就足以解决问题?
最佳答案
最初的问题与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
。
关于memory - 为什么启用/禁用A20线,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13893056/