事实上,在GDT中存放的不仅仅是段描述符,还有其它描述符(百度百科)。
一,段描述符的结构
描述符中指定了32位的起始地址和20位的段边界,
实模式下,段地址要左移4位,
32位保护模式下,段地址是32位的线性地址,如果未开启分页功能,该线性地址就是物理地址。
其他位的作用
G | 粒度位, |
G位为0时,段界限以字节为单位,段的扩展范围1B~1MB; G位为1时,段界限以4KB为单位,段的扩展范围4KB~4GB. |
S | 指定描述符的类型 |
S位为0时,表示系统段; S位为1时,表示代码段或数据段,栈段也是特殊的数据段。 |
DPL | 特权级别 |
共有4种处理器支持的特权级别,0,1,2,3; 0是最高级别,3是最低级别; 描述符的特权级用于指定访问该段所必须的最低特权级别,如果这里的数值为2,那么只有特权级别为0,1,2的程序才能访问该段,特权级别为3的程序访问该段时,将会被阻止。 |
P | 段存在位 | |
D/B | 默认的操作数大小 | |
L | 64位代码段标志 | 保留此位留给64位处理器使用 |
TYPE | 指示描述符的子类型,或者说是类别 |
对于数据段,这4位分别是X,E,W,A; 对于代码段,这4位分别是X,C,R,A; |
AVL | 软件可以使用的位 | 操作系统来用,处理器并不使用它 |
二,几个重要标志位的的作用
(一)DB位
(1)对CS段的影响:
D=1时,采用32位寻址方式;
D=0时,采用16位寻址方式;
前缀67改变寻址方式;
(2)对SS段的影响:
D=1时,隐式堆栈访问指令(如:PUSH,POP,CALL)使用32位堆栈指针寄存器ESP
D=0时,隐式堆栈访问指令(如:PUSH,POP,CALL)使用16位堆栈指针寄存器SP
(3)向下扩展的数据段:
D=1时,段上限位4GB;
D=0时,段上限位64KB;
(二)TYPE位
(三)快速从描述符表中判断一个描述符是代码段还是数据段
(1)结合段描述符高4字节的15,14,13,12这4个位先判断是系统段还是数据代码段
15号位,P=1,有效;P=0,无效;
14,13号位,权限位,Windows环境只有两种权限,0和3,所以这两位的数字要么全为0,要么全为1;
再结合12号位;
这4个位合在一起,在段描述符中对应的数字位F(权限位11)或9(权限位00)时,该描述符一定是数据段或代码段;
(2)再结合TYPE的最高位11位
TYPE最高位为1,表示代码段,此时,TYPE的4个位合起来的数值表示成十六进制一定不小于8;
TYPE最高位为0,表示数据段,此时,TYPE的4个位合起来的数值表示成十六进制一定不大于8;