2014-10-26 41 views
1

如果该位为零,那么内存是逐字节寻址的? 如果它是1,那么内存是4Kb的4Kb?因此,例如,如果这个位被设置为0,并且我的地址是 ,那么我会在该位置处寻址 对吗?如果我处理下一个位置 a001h,那么这将是内存中的下一个字节?关于寻址内存,GDT的粒度位有什么变化?

但是,如果这个位是1,我会寻址4Kb块吗?

那么,解决一个000h给我一个4Kb块,然后a001 下一个4Kb在内存中?

+4

标志定义了如何所解释[这里]极限字段被解释(http://wiki.osdev.org/Global_Descriptor_Table)。 – 2014-10-26 22:14:21

回答

-1

如果未设置粒度位,则会按原样使用该限制。因此,如果限制为0xfffff,基数为0,则可以使用0xfffff或1048575个字节。但是,如果该位被设置,则20位限制向左移位12位。因此,对于相同的0xfffff限制和基数为0的情况,实际限制为0xfffff000或4294963200(十进制),可以提供完整的4GB寻址能力。

3

kbzombie的答案几乎是正确的。互联网上的各种资源实际上也犯了同样的错误,可能是因为一方复制了另一方。

当设置粒度位时,限制确实向左移位了12位,但重要的是要注意插入了的一位。因此0xfffff的结果限制为0xffffffff,而0x00000的结果限制为0x00000fff

The 80386 Programmer's Reference Manual有这样说:

6.3.1.2限制检查

段描述符的限制字段由处理器使用,以防止程序从外段寻址。处理器对限制的解释取决于G(粒度)位的设置。对于数据段,处理器对限制的解释还取决于E位(扩展方向位)和B位(大位)(参见表6-2)。

当G = 0时,实际限制是它在描述符中出现的20位限制字段的值。在这种情况下,限制范围可以从0到0FFFFFH(2 - 1或1兆字节)。当G = 1时,处理器将12个低位1位附加到限制字段中的值。在这种情况下,实际限制范围可以从0FFFH(2 -1或4千字节)到0FFFFFFFFH(2 -1或4千兆字节)。

Table 6-2

+0

它实际上比这更简单:顾名思义*粒度*只是选择* limit *字段的度量单位。 * G * = 0:使用字节。 * G * = 1:使用4KiB。其余部分(移位,向下扩展,最小尺寸)都可以独立于粒度或实现细节。 – 2017-09-20 22:07:07

+0

@MargaretBloom我发现“使用4KiB”的描述有点混乱,因为它意味着'0x00000'的限制实际上意味着0。那么这个转变的实施不是一个重要的细节呢?无可否认,我仍然需要实现分页,所以我对事物的看法有限。 – Stijn 2017-09-20 22:12:00

+1

是的,你说得对。尽管手册的现代版本说低12位没有经过测试,但它更好地被视为一种转变。英特尔如何在这样一个基本主题上做出令人困惑的表述,真是令人惊叹! – 2017-09-20 22:17:31