任务状态段(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 种情况引起任务切换:

  1. 在当前任务中使用 jmp 或 call 指令使用 GDT 中的 TSS 描述符
  2. 在当前任务中使用 jmp 或 call 指令使用 GDT 中的或者当前任务所属的 LDT 中的任务门描述符 (任务门中有指向 TSS 的 TSS 选择符)
  3. 指向当前 LDT 中的任务门描述符的中断或者异常
  4. 当 EFLAGS 寄存器中的 NT 位被设为 1 时,当前任务执行了 IRET 命令