http://hi.baidu.com/study_together/
段描述符:代码段描述符、数据段描述符、系统描述符
系统描述符:系统段描述符、门描述符
系统段描述符:局部描述符表(LDT)的段描述符、任务状态段(TSS)描述符
门描述符:调用门描述符、中断门描述符、陷阱门描述符、任务门描述符。
部分段限长、基地址被存放在2个或3个位置,将由CPU按照值的高位存放在内存高地址处的规则进行整合。
1. 段选择子
15...3 |
2 |
1...0 |
索引值 |
TI |
RPL |
(1) 索引值(index):给出了描述符在GDT或LDT中的索引项号;
(2) 表指示标志TI(Table Index):TI=0 描述符在GDT中,TI=1 描述符在LDT
(3) 请求特权级RPL(Requested Privilege Level):0,1,2,3三个特权级。
2. 段描述符的一般格式(先高32位,后低32位,下同)
31...24 |
23 |
22 |
21 |
20 |
19...16 |
15 |
14...13 |
12 |
11...8 |
7...0 |
基地址 |
G |
D/B |
保留位 |
AVL |
段限长 |
P |
DPL |
S |
TYPE |
基地址 |
31...16 |
15...0 |
基地址 |
段限长 |
3. 数据段描述符
31...24 |
23 |
22 |
21 |
20 |
19...16 |
15 |
14...13 |
12 |
11...8 |
7...0 |
|||
基地址 |
G |
B |
0 |
AVL |
段限长 |
P |
DPL |
1 |
0 |
E |
W |
A |
基地址 |
31...16 |
15...0 |
基地址 |
段限长 |
4. 代码段描述符:
31...24 |
23 |
22 |
21 |
20 |
19...16 |
15 |
14...13 |
12 |
11...8 |
7...0 |
|||
基地址 |
G |
D |
0 |
AVL |
段限长 |
P |
DPL |
1 |
1 |
C |
R |
A |
基地址 |
31...16 |
15...0 |
基地址 |
段限长 |
5. 系统段描述符
31...24 |
23 |
22 |
21 |
20 |
19...16 |
15 |
14...13 |
12 |
11...8 |
7...0 |
基地址 |
G |
|
0 |
|
段限长 |
P |
DPL |
0 |
TYPE |
基地址 |
31...16 |
15...0 |
基地址 |
段限长 |
6. 任务状态段TSS描述符
31...24 |
23 |
22 |
21 |
20 |
19...16 |
15 |
14...13 |
12 |
11...8 |
7...0 |
|||
基地址 |
G |
0 |
0(保留) |
AVL |
段限长 |
P |
DPL |
0 |
1 |
0 |
B |
1 |
基地址 |
31...16 |
15...0 |
基地址 |
段限长 |
7. 调用门描述符
31...16 |
15 |
14...13 |
12 |
11...8 |
7...5 |
4...0 |
段中偏移值 |
P |
DPL |
0(S) |
1100(TYPE) |
000 |
参数个数 |
31...16 |
15...0 |
段选择符 |
段中偏移值 |
8. 中断门描述符
31...16 |
15 |
14...13 |
12 |
11...8 |
7...5 |
4...0 |
过程入口点偏移值 |
P |
DPL |
|
(TYPE) |
|
|
31...16 |
15...0 |
段选择符 |
过程入口点偏移值 |
9. 陷阱门描述符
31...16 |
15 |
14...13 |
12 |
11...8 |
7...5 |
4...0 |
过程入口点偏移值 |
P |
DPL |
0(S) |
1111(TYPE) |
000 |
|
10. 任务门描述符
31...16 |
15 |
14...13 |
12 |
11...8 |
7...0 |
|
P |
DPL |
|
|
|
31...16 |
15...0 |
段选择符 |
(1) G颗粒度标志(Granularity):确定段限长字段Limit值的单位,G=0 单位为B,G=1 单位为4KB(不影响基地址颗粒度,总为B);
(2) D/B:对于可执行代码段,称为D标志,D=0 默认16位地址和16位或8位操作数,D=1 默认32位地址和32位操作数或8位操作数.(指令前缀0x66:选择非默认值的操作数大小,0x67 选择非默认值的地址大小);
对于栈段,称为B标志,B=0 使用16位栈指针,B=1 使用32位栈指针.
对于下扩数据段,称为B标志,B=0 堆栈段上界限0xFFFF(64KB),B=1 堆栈段上界限0xFFFFFFFF(4GB)
(32位代码段和数据段总是设置为1,16位代码段和数据段总是设置为0)
(上扩段:偏移地址 0~段限长
下扩段:偏移地址 段限长~ 最大地址(0xffff或 0xffffffff,根据B标志决定))
(3) 21保留位:总是设置为0;
(4) AVL:软件可利用位。80386对该位的使用未做规定,Intel公司也保证今后开发生产的处理器只要与80386兼容,就不会对该位的使用做任何定义或 规定。
(5) 段限长(Segment limit field):段的长度,有多个段限长字段的由处理器合并;
(6) P段存在标志(Segment present):p=0 段不在内存中,p=1 段在内存中;
(7) DPL描述符特权级字段(Descriptor privilege level);
(8) S描述符类型标志(Descriptor type flag):S=0 系统段描述符,S=1 代码段或数据段描述符
(9) TYPE:段类型字段(Type field)
对于数据段描述符,4bit由高到低,0EWA,E=0 向上扩展 E=1 向下扩展,W=0 只读W=1 可写,A=0 未访问 A=1 已访问
对于代码段描述符,4bit由高到低,1CRA,C=0 非一致代码段C=1 一致代码段,R=0 只执行R=1执行/可读,A=0 未访问 A=1 已访问
对于TSS描述符,4bit由高到低,10B1 ,B=0 任务处于非活动状态, B=1 任务正忙
对于系统段描述符和门描述符如下:
十进制 |
二进制 |
说明 |
0 |
0000 |
Reserved,保留 |
1 |
0001 |
16-Bit TSS(Available),16位TSS(可用) |
2 |
0010 |
LDT |
3 |
0011 |
16-Bit TSS(Busy) |
4 |
0100 |
16-Bit Call Gate,16位调用门 |
5 |
0101 |
Task Gate,任务门 |
6 |
0110 |
16-Bit Interrupt Gate,16位中断门 |
7 |
0111 |
16-Bit Trap Gate,16位陷阱门 |
8 |
1000 |
Reserved |
9 |
1001 |
32-Bit TSS(Available) |
10 |
1010 |
Reserved |
11 |
1011 |
32-Bit TSS(Busy) |
12 |
1100 |
32-Bit Call gate |
13 |
1101 |
Reserved |
14 |
1110 |
32-Bit Interrupt Gate |
15 |
1111 |
32-Bit Trap Gate |