任务状态段
任务状态段(Task State Segment, TSS)是x86架构电脑上是一个保存任务信息的数据结构,被操作系统内核用于任务管理。以下信息保存在任务状态段中:
- 寄存器状态
- I/O 端口权限
- 内层堆栈指针
- 先前的 TSS 链接
如 IA-32 手册所指明,以上所有信息应当保存在 TSS 中的指定位置。
数据结构
左图为 x86 平台下任务状态段的数据结构。其中的字段( field )有动态( dynamic field )和静态(static field )之分。当切换到另一个任务的时候,CPU 会自动更新 TSS 中的动态字段; 而静态字段一般从这个任务被创建开始都不会改变。
动态字段:
- 通用寄存器 ( General-purpose registers )
- 段寄存器 ( Segment selector registers )
- EFLAGS 寄存器
- EIP 字段
- 指向前一个任务( Previous Task Link )字段
静态字段:
任务切换
以下 4 种情况引起任务切换:
- 在当前任务中使用 jmp 或 call 指令使用 GDT 中的 TSS 描述符
- 在当前任务中使用 jmp 或 call 指令使用 GDT 中的或者当前任务所属的 LDT 中的任务门描述符 (任务门中有指向 TSS 的 TSS 选择符)
- 指向当前 LDT 中的任务门描述符的中断或者异常
- 当 EFLAGS 寄存器中的 NT 位被设为 1 时,当前任务执行了 IRET 命令