【Windows内核】(2) 段描述符,段选择子
一、段描述符
GDT(全局描述符表) LDT(局部描述符表)
GDTR是一个寄存器
GDT是一张表 里面存储的段描述符(一个段描述符八个字节)
结构如下:

BASE: 段基址,由上图中的两部分(BASE 31-24 和 BASE 23-0)组成
G:LIMIT的单位,该位 0 表示单位是字节,1表示单位是 4KB
D/B: 该位为 0 表示这是一个 16 位的段,1 表示这是一个 32 位段
AVL: 该位是用户位,可以被用户自由使用
LIMIT: 段的界限,单位由 G 位决定。数值上(经过单位换算后的值)等于段的长度(字节)- 1。
P: 段存在位,该位为 0 表示该段不存在,为 1 表示存在。
DPL:段权限,访问我要有什么特权
S: 该位为 1 表示这是一个数据段或者代码段。为 0 表示这是一个系统段(比如调用门,中断门等)
TYPE: 根据 S 位的结果,再次对段类型进行细分。
拆分一个段描述符 0000FFFF 00CF9B00
0000 0000 0000 0000 1111 1111 1111 1111 0000 0000 1100 1111 1001 1011 0000 0000
BASE:00FF00CF
G:0
D/B:0
L:0
AVL:0
LImit:0
P:1
DPL:11
S:1
TYPE:1111
二、段选择子
段选择子有16位,结构如下:

其中,0-1位是RPL,请求特权级别,我用什么特权访问
2位是TI位,0表示查GDT表(windows不使用LDT所以此位永远是0)
3-15位是GDT表的下标,用这个检索GDT表中的段描述符
拆分一个段选择子:
0x0023
0000000000100 0 11
Index: 0x4 指向GDT中的第五个
TI: 0 查GDT表
RPL: 11 权限为3

浙公网安备 33010602011771号