实模式内存寻址中的段和偏移量是多少?
我正在读关于内存寻址的内容。我读了关于段偏移然后关于描述符偏移的内容。我知道如何计算实模式下的确切地址。这一切都没问题,但我无法理解究竟是什么偏移?到处都读到:
在实模式下,寄存器只有16位,因此您只能寻址
高达64k。为了允许寻址更多的内存,地址是
从段* 16 +偏移量计算。
在这里我可以理解第一行。我们有16位,所以我们可以解决最多2 ^ 16 = 64k。
但这第二行是什么?细分代表什么?为什么我们将它乘以16?为什么我们添加偏移。我只是无法理解这个偏移是什么?有人可以解释我或给我链接吗?
没有找到相关结果
已邀请:
6 个回复
献导外拘
另请参阅:实模式内存管理
窃誓额
开始,“offset”可以指向该块内的任何位置。为了计算实际地址,您将地址的段部分乘以16(或将其左移4位......相同的事物),然后添加偏移量。当你完成后,你有一个20位的地址。
例如,如果段为0x8000,偏移量为0x0100,则实际地址为
==
。
数学很少很整洁,但是 -
可以用几千个不同的段表示:偏移组合(4096,如果我的数学是正确的)。
膝垫富顷
好按紊叉
款去芳尾脊
segment =
所以如果你想访问64k以上的内存:
请注意,如果您使用以下内容,则允许大于20位宽的地址:
在只有20条地址线的早期处理器上,它被简单地截断了,但后来事情变得复杂了A20线(第21条地址线):https://en.wikipedia.org/wiki/A20_line 在带有所需样板的GitHub仓库上运行它。
逆捐凶撤小
),但是没有......英特尔不得不对我们感到奇怪。 从历史上看,前端总线(FSB)只有20条地址线,因此只能传输20位地址。为了“纠正”这一点,英特尔设计了一种方案,其中段寄存器仅将地址扩展4位(理论上为16位+ 4 = 20)。 为实现此目的,段寄存器从其原始值左移4位,然后添加到通用寄存器中的地址(例如
)。注意:左移4位相当于乘以16。 而已。这是一些说明性的例子:
因此,您仍然可以处理超过20位。怎么了?地址“环绕”,就像模数运算(作为硬件的自然结果)。所以,
变成了
。 你有它!英特尔聘请了一些愚蠢的工程师,我们必须忍受它。