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