上一篇只是简单的给出了段描述符的结构,但是并未详细讲解各个属性的含义。本篇讲解段描述符的 P/S/DB位。
当 S = 1 时,TYPE为不同值时,有以下含义。
图 1 代码段或数据段
A : 访问位,该段是否被访问过。每当处理器将该段选择子置入某个段寄存器时,就将该位置1.W : 该数据段是否可写。
E : 扩展方向。通常来说,描述符的 [base, base + limit] 这段空间是可访问的,其它空间不可访问。如果 E = 1,[base, base +limit] 就变的不可访问,相反,其它空间变的可访问。所以 E 位,有反转有效空间的含义。
C : C = 1 表示一致代码段。后面的文章会讲解。
R : R = 1 表示该代码段可读。代码段是不可写的。
S=0:该描述会描述系统段
当 S = 0 时,表示系统段,此时 TYPE 为不同值时,有以下含义。
TYPE含义0保留116位TSS段(可用)2LDT316位TSS段(忙)416位调用门5任务门616位中断门716位陷阱门8保留932位TSS段(可用)a保留b32位TSS段(忙)c32位调用门d保留e32位中断门f32位陷阱门这里,你还不需要知道各种系统段到底是什么意思,后续文章会逐渐拉开序幕。
D/B 位会影响指令操作数大小,为 0 时操作数大小为 16位,为 1 时操作大小为 32 位。什么意思呢?
比如说,执行 push 指令时,16 位操作数下,使用的堆栈指针寄存器是 SP,只有 16 位,PUSH一次 SP 的值减 2. 而 32 位操作数下,使用的堆栈指针寄存器是 ESP,PUSH 一次 ESP 的值减 4.
对于数据段的影响该位为 0 时,段大小最大为 64 KB,该位为 1 时,段大小最大为 4GB。
为了能熟练分析段描述符,必要的练习是必然少不了的。有些同学可能对此不屑,这种东西只要查查手册,对着看一下就行了。对此我也表示沉默,每个人学习方法和套路也是有所不同的,可以理解。
分析:数据段特征,第5位十六数字非9即f,第6位十六进制数字 0EWA, E表示扩展方向,W表示可写,A表示已访问
第6位常见数字分析: 0: 0000: 向上扩展,只读,未访问 1: 0001: 向上扩展,只读,已访问 2: 0010: 向上扩展,读写,未访问 3: 0011: 向上扩展,读写,已访问 数据段描述符: .------第5位 |.-----第6位 || 1) 00cf9300`0000ffff 向上扩展,读写,已访问 2) 00cff300`0000ffff 向上扩展,读写,已访问 3) ffc093df`f0000001 向上扩展,读写,已访问 4) 0040f300`00000fff 向上扩展,读写,已访问 5) 0000f200`0400ffff 向上扩展,读写,未访问 6) 00009302`2f40ffff 向上扩展,读写,已访问 7) 0000920b`80003fff 向上扩展,读写,未访问 8) ff0092ff`700003ff 向上扩展,读写,未访问 9) 80009240`0000ffff 向上扩展,读写,未访问 10) 00009200`00000000 向上扩展,读写,未访问 11) 00009200`0000ffff 向上扩展,读写,未访问 12) 00009200`0000ffff 向上扩展,读写,未访问 13) f8409337`9400ffff 向上扩展,读写,已访问 14) f8409337`9400ffff 向上扩展,读写,已访问 15) f8409337`9400ffff 向上扩展,读写,已访问分析:代码段特征,第5位十六进制数字非9即f,第6位十六进制数字 1CRA, C表示一致代码段,R表示可读,A表示已访问
第6位常见数字分析 8: 1000: 非一致代码段,只执行,未访问 9:1001:非一致代码段,只执行,已访问 a: 1010: 非一致代码段,可执行可读,未访问 b: 1011: 非一致代码段,可执行可读,已访问 代码段描述符 .------第5位 |.-----第6位 || 1) 00cf9b00`0000ffff 非一致代码段,可执行可读,已访问 2) 00cffb00`0000ffff 非一致代码段,可执行可读,已访问 3) 80009a40`0000ffff 非一致代码段,可执行可读,未访问 4) f7009f66`d000ffff 一致代码段,可执行可读,已访问 5) 8000984f`b6b003b7 非一致代码段,只执行,未访问分析:系统段特征,第5位十六进制数非8即e,第6位依具体值来判断到底属于什么断。参见下表:
0: 保留 1: 16位TSS段(可用) 2: LDT 3: 16位TSS段(忙) 4: 16位调用门 5: 任务门 6: 16位中断门 7: 16位陷阱门 8: 保留 9: 32位TSS段(可用) a: 保留 b: 32位TSS段(忙) c: 32位调用门 d: 保留 e: 32位中断门 f: 32位陷阱门 系统段描述符: .------第5位 |.-----第6位 || 1) 80008b04`200020ab 32位TSS段(忙) 2) 80008954`b1000068 32位TSS段(可用) 3) 80008954`b1680068 32位TSS段(可用) 4) 8600895e`a3300068 32位TSS段(可用)