当IBM设计IBM PC AT机器时,它使用的是较新的英特尔80286微处理器,在实模式下与以前的x86微处理器不完全兼容。问题出在哪里?较早的x86处理器没有地址线A20到A31。他们还没有那么大的地址总线。任何超过前1MB的程序看起来都会绕过去。当时,80286的地址空间需要32条地址线。然而,如果所有32行都是可访问的,我们又遇到了换行问题。
以上内容摘自以下OS开发链接:
http://www.brokenthorn.com/Resources/OSDev9.html
我确实怀疑我并不完全理解包装问题到底是什么,但我猜这意味着尝试访问大于1MB的地址将返回到1MB以内的地址,因为由于从A0到A19只存在20条地址线,地址的高位没有任何意义。
我的猜测正确吗?
我的第二个问题是A-20线路是如何解决这个问题的?我猜当它被启用时,以某种方式为较高地址线中的位分配了意义,但我不知道如何将这种猜测视为令人信服的答案。
那么A-20线路如何解决这个问题呢?
发布于 2018-10-08 01:26:29
考虑逻辑地址0xffff:0xffff,它的线性地址是0x10FFEF。
如果查看二进制形式的0x10FFEF,您将看到以下内容:
B B B B B B B
i i i i i i i
t t t t t t t
2 1 1 1 0 0 0
0 9 5 1 7 3 0
--------------------------
1 0000 1111 1111 1110 1111如您所见,它需要21位(从第0位到第20位)来表示此地址。0xffff:0xffff是一个有效的逻辑地址,因此0x10ffef是一个有效的线性地址。
这表明16位程序可以生成21位地址。
但是8086和80186总线的宽度是20位。
现在会发生什么?
当你开这么多英里,你的里程表显示999,999.9英里时,会发生什么?

它会绕来绕去。
从数学上讲,我们只是丢弃了第7位,所以1,000,000.0变成了000,000.0。
这与第21位相同-它被丢弃,0x10ffef变成0x0ffef。
考虑这个问题的另一个好方法是在一个指针上做算术:7+7= 14 = 2。
在结束之后,它又开始了。
另一种可视化的方法是想象记忆的末端已经粘在了开头:

现在,一些程序依赖于这种包装。
不确定这是否是一种模糊的形式,即这是否由已经将段设置为指向存储器末尾的bios使用。
不管是什么原因,当80286将内存总线扩展到24位时,这种包络就被消除了。
这就像我们在里程表上多加了四位数,1,000,000.0现在可以毫无问题地表示出来。
为了模拟旧的20位总线地址,添加了一个外部与门,以强制bit20为零。
这就像在里程表的第7位上手写0一样。
问题解决了。
这是一个黑客攻击,只有位20被设置为0,更高的位未被触及。
这种操作总是会生成重复的模式,这有助于花一些时间来绘制它们-特别是看看如果忘记启用a20,它们会变得多么麻烦。
https://stackoverflow.com/questions/52690395
复制相似问题