9

我有一个关于A20 登机口的问题。我读过一篇关于它的文章,说存在解决地址“环绕”问题的机制,当较新的 CPU 使用 32 位地址总线而不是较旧的 20 位总线时出现的问题。

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

为什么只关闭 A20 位就可以解决问题?

4

1 回答 1

15

最初的问题与x86 内存分段有关。

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

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

为了解决这个问题,他们引入了一种强制A20地址线为零的方法,从而强制回绕。

你的问题是:“为什么只是A20? - 怎么A21A31?”

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

于 2012-12-16T15:04:47.733 回答