前言
- 任務切換可以分爲協同和搶佔
- 協同就是任務自己主動交出控制權,搶佔就是利用中斷,強制從任務手中獲得控制權
N位
- 任務門和調用門類似,任務門描述符可以放置在GDT,LDT中
- 當發生中斷的時候,中斷號x8+中斷描述符表基地址,當CPU辨別這是一個任務門的時候就執行任務切換
- 除此之外,還可以通過 call 任務門或者call TSS選擇子進行任務切換
- 矛盾在於用iret返回的時候,怎麼鑑別是從中斷返回還是從任務返回
- 在EFLAGS裏面有一個N位,當該位是1時,表明當前任務屬於嵌套在其他任務之中,那麼就屬於從任務返回
- 當中斷或者Call 發生執行任務切換會發生任務嵌套,將當前任務的所有狀態進行保存,不改變N位和B位,將下一個任務TSS的任務鏈接域指向上一個任務,並且將B位和N位置爲1
- 當用Jump的時候並不會,將當前B位置0,不改變N位。然後加載下一個任務的TSS進TR,並將其B位置1,不改變N位
- 任務切換不允許重入
- A切換到A無法進行狀態保存
- ABC任務嵌套,C再去嵌套A,就會導致死循環
- 通過中斷髮生的任務切換,不檢驗特權級
- 數據訪問的特權級檢查規則適用於jmp和call指令,當前任務的cpl和新任務段選擇子的RPL必須在數值上小於或者等於目標TSS或者任務門的DPL。異常,中斷和iret指令引起的任務切換忽略目標任務門或者TSS描述符DPL。對於以int n 指令產生的中斷,要檢查DPL
- 通過B位來檢驗。
IOPL
- 在處理器的標誌寄存器EFLAGS中,位13,位12是IOPL,也就是輸入/輸出特權級,它代表着當前任務的I/O特權級別
- 如果當前特權級CPL高於,或者和任務的I/O特權級IOPL相同時,所有I/O操作都是允許的
- 處理器不限制0特權級程序的I/O訪問,總是允許的