天天看點

IA32處理器任務切換過程 學習總結

IA32處理器任務切換

以下4中情況會使處理器跳轉到其它任務:

(1)目前的程式或任務執行JMP或CALL指令指向GDT中TSS描述符。

(2)目前的程式或任務執行JMP或CALL指令指向GDT或目前LDT中的任務門描述符。

(3)一個中斷或異常指向IDT中的任務門描述符。

(4)當EFLAGS寄存器中NT标志置位時,目前任務執行IRET指令。

當切換到新任務時,處理器完成以下操作:

(1)從任務門或先前的任務連結字段中獲得新任務的TSS段選擇符作為指令JMP或CALL的操作數。

(2)檢查目前任務是否允許切換到新任務。目前任務的CPL和針對新任務的選擇符的RPL必須小于等于引用的TSS描述符或任務門的DPL。異常、中斷和IRET指令允許不管目的任務門或TSS描述符的DPL,切換任務。如果INT n指令産生的中斷,需要檢查DPL。

(3)檢查新任務TSS描述符标記為存在和有有效的界限。

(4)檢查新任務是否可用(調用、跳轉、異常或中斷)或者忙(IRET傳回)。

(5)檢查目前的TSS,新TSS 和所有任務切換用到的段描述符是否在記憶體頁表中。

(6)如果JMP和IRET指令發起的任務切換,處理器在目前任務TSS描述符中清除B忙位;如果CALL指令、異常或中斷發起的,B位保留設定。

(7)如果IRET指令發起的任務切換,處理器暫時清除儲存在EFLAGS寄存器的NT标志;如果CALL指令、異常或中斷發起的,在儲存的EFLAGS寄存器内容中,NT标志不變。

(8)在目前任務的TSS儲存目前任務的狀态資訊。

(9)如果CALL指令、異常、中斷發起的任務切換,處理器從新任務中加載EFLAGS并設定NT标志。如果IRET指令或JMP指令發起,從新任務中加載的EFLAGS寄存器中的NT标志反映NT的狀态。

(10)如果CALL指令、JMP指令、異常或中斷發起任務切換,處理器在新任務的TSS描述符中設定B忙位;如果IRET指令發起,B位保留。

(11)加載新任務的段選擇符和TSS描述符。

(12)處理器加載TSS狀态。包括LDTR,PDBR(CR3),EFLAGS,EIP,通用寄存器等。

(13)加載和段選擇符相關的描述符并确認。

(14)開始執行新任務。

good luck!