GDT的粒度位究竟对寻址内存有何影响?

时间:2014-10-26 20:40:41

标签: assembly x86 protected-mode addressing gdt

如果该位为零,那么内存是逐字节寻址的吗? 如果它是1,则存储器通过4Kb寻址4Kb?

因此,例如,如果此位设置为0,并且我已解决 内存位置a000h,然后我将寻址该字节 在那个位置对吗?如果我在下一个地点发言 a001h,然后那将是内存中的下一个字节吧?

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

那么解决a000h会给我一个4Kb大块和a001 内存中的下一个4Kb?

2 个答案:

答案 0 :(得分:5)

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

当设置粒度位时,限制确实向左移12位,但重要的是要注意插入 1位。因此,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 20 - 1或1兆字节)。当G = 1时,处理器将12个低位1位附加到限制字段中的值。在这种情况下,实际限制范围可以从0FFFH(2 12 - 1或4千字节)到0FFFFFFFFH(2 32 - 1或4千兆字节)。

     

Table 6-2

答案 1 :(得分:-2)

如果未设置粒度位,则按原样使用限制。因此,如果限制为0xfffff,并且基数为0,则可以寻址0xfffff或1048575字节。但如果该位置1,则20位限制将向左移位12位。因此,对于相同的0xfffff限制和0的基数,实际限制将为十进制的0xfffff000或4294963200,为您提供完整的4gb寻址能力。