首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >A-20行是如何克服换行问题的

A-20行是如何克服换行问题的
EN

Stack Overflow用户
提问于 2018-10-08 00:10:39
回答 1查看 100关注 0票数 0

当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线路如何解决这个问题呢?

EN

回答 1

Stack Overflow用户

发布于 2018-10-08 01:26:29

考虑逻辑地址0xffff:0xffff,它的线性地址是0x10FFEF

如果查看二进制形式的0x10FFEF,您将看到以下内容:

代码语言:javascript
复制
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,它们会变得多么麻烦。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52690395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档