任務狀態段(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 命令