我有一个关于A20 gate的问题。我读了一篇有关它的文章,说存在一种机制来解决地址“回绕”的问题,当新的CPU使用32位地址总线而不是较旧的20位总线时,就会出现这种问题。

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

为什么仅关闭A20位就足以解决问题?

最佳答案

最初的问题与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

关于memory - 为什么启用/禁用A20线,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13893056/

10-09 17:23