为什么启用/禁用A20线路

sma*_*noo 6 memory x86 osdev

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

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

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

NPE*_*NPE 12

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

将使用segment:offset两个segmentoffset16位整数访问内存.实际地址计算为segment*16+offset.在20位地址总线上,这自然会被截断为最低的20位.

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

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

你的问题是:"为什么只是A20?怎么样A21- A31?"

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