Windows 内核详解:GDT
- 作者: 刘杰
- 来源: 技术那些事
- 阅读:209
- 发布: 2025-06-29 10:39
- 最后更新: 2025-07-10 15:07
GDT(全局描述符表)
GDT的引入
在实模式下最大可以访问1M大小的地址,进入保护模式后,由于需要内存保护,必须一五一十的记录段的权限–哪个段是系统级别的权限,哪个段时应用级别的权限,这样就可以使得系统可以对所有硬件进行直接访问,限定应用程序对硬件的直接访问,以免怀有恶意的应用程序对计算机破坏。
全局描述符结构:

-
Base:段的基地址,由一个字大小组成,意味着它可以是保护模式下4G内存中任意一个地址。
-
Limit 和 G:Limit 是段的大小范围也叫段界限,由20个比特组成,也就是1M大小,G是段界限的单位。另外,如果G位为0就以字节为单位,如果为1就以4KB为单位。假设G位为0,那么Limit+1是多少,此段大小就为多少字节,范围为
1B~1M;设G位位1,那么此段大小为(Limit+1)*4KB大小,范围为4KB~4G。 -
P:存在标志位,为0就说明段不存在内存中,为1就存在内存中。这里可以引发一个中断,当CPU检查到这一位为0,后面指令又要使用此段的时候,可以引发一个缺段中断,然后跳转到加载段的中断程序以加载此段到内存中。
-
DPL: 此段的特权等级,由两位比特组成,最高特权等级为00,最低特权等级为11,一共有三个特权等级。
-
S 和 TYPE: S 位用于指定描述符的类型。当该位是0时,表示是一个系统段;为“1时,表示是一个代码段或者数据段(栈段也是特殊的数据段)。当S为1时,也就是为代码段或数据段时,TYPE的情况如下:

也就是说,X为0时候就是数据段,X为1时候就是代码段,而关于依从的概念是关系到切换任务时候特权的更变的,后面再说。当S为0时也就是此段是一个系统段,而系统段也有好几种,TYPE里所代表的就是系统段的种类。(目前据我所知,TYPE是0010的为 LDT描述符、是1011或1001的为TSS描述符、是1100的为调用门描述符等)
-
D/B:默认的操作数大小或者默认的栈指针大小,该标志位主要是为了能够在32位处理器上兼容运行16 位保护模式的程序。该标志位对不同的段有不同的效果。对于代码段,此位为D位,用于指示指令中默认的偏移地址和操作数尺寸。D=0 表示指令中的偏移地址或者操作数是16 位的;D=1,指示32 位的偏移地址或者操作数。对于数据段,此位为B位…
-
L:是64 位代码段标志,保留此位给64位处理器使用。如果还是32位保护模式,我们将此位置0即可。 AVL:此位是保留位,留给操作系统用的,用也可以不用也可以。