如果该位为零,那么内存是逐字节寻址的吗?如果它是 1,那么内存是 4Kb x 4Kb 寻址的吗?
例如,如果该位设置为 0,并且我寻址内存位置 a000h,那么我将寻址该位置的字节,对吗?如果我寻址下一个位置 a001h,那么那将是内存中的下一个字节,对吗?
但是如果这个位是 1,我会寻址 4Kb 块吗?
那么寻址a000h会给我一个4Kb的块,而a001是内存中的下一个4Kb吗?
如果该位为零,那么内存是逐字节寻址的吗?如果它是 1,那么内存是 4Kb x 4Kb 寻址的吗?
例如,如果该位设置为 0,并且我寻址内存位置 a000h,那么我将寻址该位置的字节,对吗?如果我寻址下一个位置 a001h,那么那将是内存中的下一个字节,对吗?
但是如果这个位是 1,我会寻址 4Kb 块吗?
那么寻址a000h会给我一个4Kb的块,而a001是内存中的下一个4Kb吗?
kbzombie 的答案几乎是正确的。互联网上的各种资源实际上都犯了同样的错误,可能是因为一个复制另一个。
当设置粒度位时,限制确实向左移动了 12 位,但重要的是要注意插入了一位。因此0xfffff
导致 的限制0xffffffff
,并0x00000
导致 的限制0x00000fff
。
80386 Programmer's Reference Manual有这样的说法:
6.3.1.2 极限检查
处理器使用段描述符的限制字段来防止程序在段外寻址。处理器对限制的解释取决于 G(粒度)位的设置。对于数据段,处理器对限制的解释还取决于 E 位(扩展方向位)和 B 位(大位)(参见表 6-2)。
当 G= 0 时,实际限制是描述符中出现的 20 位限制字段的值。在这种情况下,限制范围可以从 0 到 0FFFFFH(2 20 - 1 或 1 兆字节)。当 G= 1 时,处理器将 12 个低位 1 位附加到限制字段中的值。在这种情况下,实际限制的范围可能从 0FFFH(2 12 - 1 或 4 KB)到 0FFFFFFFFH(2 32 - 1 或 4 GB)。
If the granularity bit is not set, the limit is used as it is. So with a limit of 0xfffff, and a base of 0, you can address 0xfffff, or 1048575 bytes. But if the bit is set, then the 20 bit limit is shifted left by 12 bits. So for the same limit of 0xfffff, and base of 0, the actual limit will be 0xfffff000 or 4294963200 in decimal giving you the full 4gb of addressing capability.