保护模式
段描述符属性
问题:段寄存器中的值是通过段描述符来填充的,但段描述符只有64位,那如何从64位变为80位呢?
段描述符与段寄存器的对应关系
P位和G位
P位 = 1:段描述符有效
P位 = 0:段描述符无效
S位和TYPE域
TYPE域结构图
S位 = 1:是一个代码或数据段的描述符
S位 = 0:是一个系统段的描述符
tips:高4字节中DPL要么全为0,要么全为1,那么我们把P,DPL,S位连在一起看时,如果为F或者为9那么就表示这是一个代码段或数据段的描述符,又刚好是4个字节,那么通过段描述符中的高字节第5位就可以确定出来
一但确定了是代码段或者是数据段后,就可以看TYPE域了,从上面的图可以看出,如果TYPE的值小于8,那么它就一定是代码段
图中的数据段
的A,W,E分别代表的意思:
- A:访问位(没访问过为0,访问过了为1)
- W:是否可写
- E:扩展位(向上扩展或向下扩展)
图中的代码段
的A,R,C分别代表的意思:
- A:访问位(没访问过为0,访问过了为1)
- R:可读位
- C:一致位
- C = 0 :一致代码段
- C = 1 :非一致代码段
Table 3-1. 代码段与数据段类型
数据段(Type[3] = 0)
Type (Hex) | Type[2:0] | 名称 | 描述 |
---|---|---|---|
0 | 000 | 只读数据段 | 段内容可读,不可写入。 |
1 | 001 | 读写数据段 | 段内容可读可写。 |
2 | 010 | 只读,向下扩展 | 栈段专用,界限值为最大偏移,访问时需满足 ESP <= Limit 。 |
3 | 011 | 读写,向下扩展 | 同上,但可写入。 |
4 | 100 | 只读,已访问 | 只读段,CPU访问后自动置位Accessed标志(位8)。 |
5 | 101 | 读写,已访问 | 读写段,Accessed标志有效。 |
6 | 110 | 只读,向下扩展+已访问 | 向下扩展栈段,Accessed标志有效。 |
7 | 111 | 读写,向下扩展+已访问 | 同上,可写入。 |
代码段(Type[3] = 1)
Type (Hex) | Type[2:0] | 名称 | 描述 |
---|---|---|---|
8 | 000 | 仅执行 | 代码可执行,不可直接读取(如MOV [CS:...] 会触发异常)。 |
9 | 001 | 可执行可读 | 代码可执行且可读取(如读取常量数据)。 |
A | 010 | 仅执行,符合段 | 低特权级程序可直接跳转至此段(DPL不检查)。 |
B | 011 | 可执行可读,符合段 | 同上,但允许读取代码。 |
C | 100 | 仅执行,已访问 | 仅执行段,Accessed标志有效。 |
D | 101 | 可执行可读,已访问 | 可读代码段,Accessed标志有效。 |
E | 110 | 仅执行,符合段+已访问 | 符合段,Accessed标志有效。 |
F | 111 | 可执行可读,符合段+已访问 | 同上,可读取代码。 |
系统段描述符
之前有提到过当S位为0时,该段的描述符为系统描述符
Table 3-2. 系统段与门描述符类型
系统段与门描述符(S=0)
Type (Hex) | bit | 名称 | 描述 |
---|---|---|---|
0 | 0000 | Reserved | 保留未使用。 |
1 | 0001 | 16-bit TSS (Available) | 16位任务状态段(可用),用于硬件任务切换。 |
2 | 0010 | LDT | 局部描述符表(LDT)描述符。 |
3 | 0011 | 16-bit TSS (Busy) | 16位任务状态段(繁忙),表示任务正在执行。 |
4 | 0100 | 16-bit Call Gate | 16位调用门,用于特权级切换的远调用。 |
5 | 0101 | Task Gate | 任务门,用于通过中断/异常触发任务切换。 |
6 | 0110 | 16-bit Interrupt Gate | 16位中断门,用于处理中断(不清除EFLAGS.IF)。 |
7 | 0111 | 16-bit Trap Gate | 16位陷阱门,用于处理异常(不清除EFLAGS.IF)。 |
8 | 1000 | Reserved | 保留未使用。 |
9 | 1001 | 32-bit TSS (Available) | 32位任务状态段(可用)。 |
A | 1010 | Reserved | 保留未使用。 |
B | 1011 | 32-bit TSS (Busy) | 32位任务状态段(繁忙)。 |
C | 1100 | 32-bit Call Gate | 32位调用门。 |
D | 1101 | Reserved | 保留未使用。 |
E | 1110 | 32-bit Interrupt Gate | 32位中断门(清除EFLAGS.IF)。 |
F | 1111 | 32-bit Trap Gate | 32位陷阱门(不清除EFLAGS.IF)。 |