Assembly 关于寻址内存,GDT的粒度位到底发生了什么变化?

Assembly 关于寻址内存,GDT的粒度位到底发生了什么变化?,assembly,x86,protected-mode,addressing,gdt,Assembly,X86,Protected Mode,Addressing,Gdt,如果该位为零,那么内存是逐字节寻址的吗? 如果它是1,那么内存的地址是4Kb乘以4Kb 例如,如果这个位被设置为0,我 内存位置a000h,则我将对字节进行寻址 在那个地方,对吗?如果我找到下一个地方 a001h,那么这将是内存中的下一个字节,对吗 但是如果这个位是1,我会处理4Kb的块吗 那么寻址a000h会给我一个4Kb的块吗,和a001 内存中的下一个4Kb吗?如果未设置粒度位,则按原样使用限制。因此,如果限制为0xfffff,基数为0,则可以寻址0xfffff或1048575字节。但如果

如果该位为零,那么内存是逐字节寻址的吗? 如果它是1,那么内存的地址是4Kb乘以4Kb

例如,如果这个位被设置为0,我 内存位置a000h,则我将对字节进行寻址 在那个地方,对吗?如果我找到下一个地方 a001h,那么这将是内存中的下一个字节,对吗

但是如果这个位是1,我会处理4Kb的块吗

那么寻址a000h会给我一个4Kb的块吗,和a001
内存中的下一个4Kb吗?

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

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

设置粒度位时,限制确实向左移动了12位,但需要注意的是插入了一位。因此,
0xfffff
导致限制为
0xFFFFFF
0x00000
导致限制为
0x00000fff

有这样的说法:

6.3.1.2限额检查

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

当G=0时,实际限制是描述符中显示的20位限制字段的值。在这种情况下,限制范围可能在0到0FFFFFH(220-1或1兆字节)之间。当G=1时,处理器向限制字段中的值追加12个低阶1位。在这种情况下,实际限制可能在0FFFH(212-1或4千字节)到0FFFFFFH(232-1或4千兆字节)之间


该标志定义了限制字段的解释方式。实际上,它甚至比这更简单:顾名思义,粒度只是选择限制字段的度量单位。G=0:使用字节。G=1:使用4KiB。其余部分(移位、向下扩展、最小大小)要么与粒度无关,要么只是实现细节。@MargaretBloom我发现“使用4KB”的描述有点混乱,因为它意味着
0x00000
的限制实际上意味着0。那么,转移的实施不是一个重要的细节吗?诚然,我仍然需要达到实现分页的程度,所以我对事情的看法有限。是的,你是对的。最好将其视为一种转变,尽管现代版本的手册称较低的12位未经测试。令人惊讶的是,英特尔竟然在这样一个基本的话题上做出令人困惑的陈述@Stijn,0x00000的限制(G=1)意味着段限制内的最高4KB页面是第0页。