Windows 内核详解:GDT

GDT(全局描述符表)

GDT的引入

在实模式下最大可以访问1M大小的地址,进入保护模式后,由于需要内存保护,必须一五一十的记录段的权限–哪个段是系统级别的权限,哪个段时应用级别的权限,这样就可以使得系统可以对所有硬件进行直接访问,限定应用程序对硬件的直接访问,以免怀有恶意的应用程序对计算机破坏。

全局描述符结构:

b7e6763cd52ae29df802db6fff6c59ca.png

  • 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的情况如下:

    c5663d313197d1693883800c24cb4b63.png

    也就是说,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:此位是保留位,留给操作系统用的,用也可以不用也可以。