处理器在实施任务切换时的操作——《x86汇编语言:从实模式到保护模式》读书笔记39
處理器在實施任務切換時的操作——《x86匯編語言:從實模式到保護模式》讀書筆記39
處理器可以通過以下四種方法實施任務切換:
1. call指令或者jmp指令的操作數是GDT內的某個TSS描述符的選擇子;
2. call指令或者jmp指令的操作數是GDT或者LDT內某個任務門的選擇子;
3. 一個異常或者中斷發生時,中斷號指向IDT內的某個任務門;
4. 在EFLAGS寄存器的NT位置位的情況下,當前任務執行了一個iret指令。
對于這四種方法,首先都可以得到一個TSS描述符的選擇子:
對于1,指令的操作數直接就是TSS選擇子;
對于2和3,任務門里包含了TSS選擇子;
對于4,當前任務的TSS的任務鏈接域內就是TSS選擇子。
這個TSS選擇子就決定了要切換到哪個任務。
在任務切換時,處理器執行以下操作:
1. 取得新任務的TSS描述符的選擇子(如上文所述)。
2. 檢查是否允許從當前任務切換到新任務。
(1)數據訪問的特權級檢查規則適用于JMP和CALL指令,當前任務的CPL和新任務段選擇子(TSS描述符的選擇子或者任務門的選擇子)的RPL必須在數值上<=目標TSS描述符或者任務門的DPL;
(2)異常、中斷(int n指令發起的中斷除外)和IRET指令引起的任務切換忽略目標任務門或者TSS描述符的DPL;
(3)對于int n指令發起的中斷,要檢查DPL,要求在數值上,CPL<=任務門描述符的DPL;
3. 檢查新任務的TSS描述符是否已經標記為有效(P=1),并且界限也有效(>=103);
4. 檢查新任務是否可用。對于以CALL,JMP,異常或者中斷發起的任務切換,要求B=0;對于IRET發起的任務切換,要求B=1;
5. 檢查當前任務和新任務的TSS,以及所有在任務切換時用到的段描述符已經安排到系統內存中;
6. 如果任務切換是由JMP或者IRET發起的,處理器清除當前任務的B標志;如果是由CALL指令、異常或者中斷發起的,當前任務的B位保持原來的狀態(=1);
7. 處理器建立EFLAGS寄存器的一個臨時副本。如果任務切換由IRET指令發起,則清除副本中的NT標志;如果是由CALL、JMP、異常或者中斷發起的,則保持副本中NT標志不變。
8. 保存當前任務的狀態到它的TSS中:所有通用寄存器、段寄存器中的段選擇子、剛才那個EFLAGS的副本,以及EIP;
9. 加載新任務的EFLAGS寄存器。如果任務切換是由CALL、異常或者中斷發起的,處理器把EFLAGS的NT標志置位;如果是由IRET或JMP發起的,NT位不變。
10. 如果任務切換是由CALL、JMP、異常或者中斷發起的,處理器將新任務TSS描述符中的B標志置位;如果由IRET發起,B保持原來的狀態(=1);
11. 用新任務的TSS選擇子和TSS描述符加載TR;
12. 新任務的TSS狀態數據被加載到處理器:包括LDTR寄存器、CR3、EFLAGS、EIP、通用寄存器、段選擇子;
13. 與段選擇子相對應的描述符在驗證后也被加載;
14. 開始執行新任務。
注意:任務切換時,新任務的特權級別是由其段寄存器CS的低2位決定的,該寄存器的內容取自新任務的TSS。
最后,再次給出那個表格,因為它太重要了。
總結
以上是生活随笔為你收集整理的处理器在实施任务切换时的操作——《x86汇编语言:从实模式到保护模式》读书笔记39的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 左右伸缩_SSFB梳齿型桥梁伸缩缝安装步
- 下一篇: 第15章习题解答(一)——《x86汇编语