段描述符属性测试

BASE: 段基址,由上图中的两部分(BASE 31-24 和 BASE 23-0)组成
G:LIMIT的单位,该位 0 表示单位是字节,1表示单位是 4KB
当G=0时,Limit的范围是0x00000000-0x000FFFFF,其中,段描述符的20位在低位,高位补0.
当G=1时,Limit的范围是0x00000FFF-0xFFFFFFFF,其中,段描述符的20位在高位,低位补F。
D/B: 该位为 0 表示这是一个 16 位的段,1 表示这是一个 32 位段
AVL: 该位是用户位,可以被用户自由使用
LIMIT: 段的界限,单位由 G 位决定。数值上(经过单位换算后的值)等于段的长度(字节)- 1。
P: 当P=1时,段描述符有效;当P=0时,段描述符无效。
DPL:段权限
S: 该位为 1 表示这是一个数据段或者代码段。为 0 表示这是一个系统段(比如调用门,中断门等)
TYPE: 根据 S 位的结果,再次对段类型进行细分。
通过windbg在GDT表中查找一个空缺位置通过eq指令(修改8字节数据)插入自己构建的短描述符
P位(present)
测试 有效位 第15位
P = 1:描述符有效
P = 0:描述符无效
当描述符无效时,任何尝试加载该描述符、访问该描述符对应的段间地址都会报错。

G位 (granularity)
假设显式Limit为0xFFFFF 情况下:
G == 0 粒度为(BYTE)(0xFFFFF + 1)*1 -1 0x000FFFFF(Limit最终大小)
G == 1 粒度为(BYTE)(0xFFFFF + 1)*4KB -1 0xFFFFFFFF(Limit最终大小)
G位影响Limit
S位(descriptor type)
描述符类型位。
S=0时,是系统段描述符
S=1时,是代码或数据段描述符
具体类型需要搭配type属性来判断。
Type域
决定了具体是代码段还是数据段描述符
当S为1时,type针对代码或数据段,具体含义如下:
数据段:
A位:数据段是否被访问过位,访问过为1,未访问过为0 段描述符是否被加载过
W位:数据段是否可写位,可写为1,不可写为0
E位:向下扩展位,0向上扩展:段寄存器.base+limit区域可访问。1向下扩展:除了base+limit以外的部分可访问。
代码段:
A位:代码段是否被访问过位,访问过为1,未访问过为0 段描述符是否被加载过
R位:代码段是否可读位,可读为1,不可读为0
C位:一致位。1:一致代码段。 0:非一致代码段 具体后文解释
DPL 当前段描述符的特权级别
S==1 作用域如下图

- 数据段测试
S==1时 <8 数据段(base~base+limist) (默认只读)
-
- E= 扩展方向
E==0 向上扩展 可访问Base~Base+limit 00000000~00000000 + 00000000 +FFFFFFFF || 00000000-FFFFFFFF
//向下扩展并未使用
E==1 向下扩展 可访问线长取决于DB - DB
DB==1 有效地址范围是Base + limit ~ 1 - Base + limit +0xFFFFFFFF 4GB
DB==0 有效地址范围是Base + limit ~ 1 - Base + limit +0XFFFFH 64K - W
W=是否可写 - A
A=访问 (表示该位最后一次被操作系统清零后,该段是否被访问过,每当处理器将该段选择符置入某个段寄存器时,就将该位置为1)
- E= 扩展方向
- 代码段测试
S位为1 Type位≥8时候就是代码段
C==一致位置
C==0非一致代码段(跨段跳转同级权限)
C==1非一致代码段(跨段跳转不同权限)
R可读
A=访问 - S==0 作用域如下图

- 系统段测试
S==0
TYPE: 0001 == 1 16位任务段(空闲)
TYPE: 0011 == 3 16位任务段(占用)
TYPE: 0100 == 4 16位调用门
TYPE: 0101 == 5 任务门
TYPE: 0110 == 6 16位中断门
TYPE: 0111 == 7 16位陷阱门
TYPE: 1001 == 9 32位任务段(空闲)
TYPE: 1011 == B 32位任务段(占用)
TYPE: 1100 == C 32位调用门
TYPE: 1110 == E 32位中断门
TYPE: 1111 == F 32位陷阱门
DB
- 特权
RPL请求特权级别
DPL 特权级别
CPL 当前特权级别
