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