段描述符

事实上,在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;

原文地址:https://www.cnblogs.com/a-s-m/p/12756119.html