## 7.5 任務切換(Task Switching)
以下情況中,80386切換到另一個任務執行:
1、? 當前任務執行了一個JMP或CALL,而操作數中指定了一個TSS描述符。
2、? 當前任務執行了一個JMP或CALL,而操作數中指定了一個任務門。
3、? 一個在IDT中的中斷向量或異常向量導致向一個新的任務切換。
4、? 當前任務執行了一條IRET指令,而且NT位設置時。
JMP, CALL, IRET, 中斷和異常原先被設計用于在同一個任務內的機制,不需要任務切換。訪問到何種類型的描述符還是在標志字段NT(nested taks)位可以用于區分出標標準的機制還是變種的任務切換機制。
為了引起任務切換,JMP或CALL指令可以指定一個TSS描述符或者一個任務門。兩種情況下作用是相同的:80386切換到指定的任務。
當在IDT中的中斷或異常向量指示了一個任務門時,中斷或異常將引起任務切換。如果指示了一個IDT中的中斷門或陷阱門,不發生任務切換。關于中斷的更多信息,請參看第9章。
當以一個任務或一個中斷子程序來引發時,中斷處理程序總是將控制返回到被中斷任務的子程序。如果NT位被置位,中斷處理程序則是一個中斷任務,IRET指令將返回到被中斷的子程序。
任務切換操作將做以下的步驟:
1、? 檢測當前任務有權切換到指定的任務。這時數據訪問規則將用于檢測JMP或CALL指令。TSS描述符或者任務門的DPL字段必須小于或者等于CPL和門選擇子RPL字段的最大值。中斷、異常、IRET指令可以切換到任何任務,而不必管目標TSS描述符或者目標任務門的DPL字段。
2、? 檢測目標TSS描述符存在的,而且有一個有效的界限值。到這時,所有的錯誤都算是在的引發任務切換(outgoing task)的上下文中發生的。錯誤是可以被處理和重起的,且對于應用程序是透明的。
3、? 保存當前任務的狀態。處理器從任務寄存器中緩存的不可見部分來找到當前任務的基址。處理器拷貝寄存器值到當前任務TSS(EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI, ES, CS, SS, DS, FS, GS, 和 標志寄存器EFLAG)。EIP字段則指向引起任務切換的指令的下一條指令。
4、? 將新的任務的選擇子加載到任務寄存器,將新任務的TSS描述符設置為忙。設置MSW的TS(task switched)標志位。選擇子或是從指令操作數中得到,或是從任務門中得到。
5、? 從新的任務的TSS中加載任務的狀態,并恢復其執行。加載的寄存器是LDT寄存器,標志寄存器(EFLAG)通用寄存器EIP,EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI;段寄存器ES,CS,SS,DS,FS,和GS。還有PDBR(CR3)。所有檢測到的錯誤將發生在新任務的上下文中。對于一個異常處理程序,看來起好似新任務的第一條指令還未執行。
注意,不管怎么樣,舊任務的狀態總是會被保存。如果這個任務被重新執行,它執行引起任務切換的指令的后一條指令。當任務執行時,所有寄存器的值將被恢復。
每一次任務切換都會設置MSW(machine status word)的TS(task switched)位。TS標志對于有協處理器的系統來說是很重要的。TS位指出了協處理器的狀態可能和當前任務的狀態不一致了。第11章進一步討論TS位。
處理任務切換異常的處理程序(表7-1中由第4到16引起的異常)應該注意加載引起異常的選擇子的操作。這樣的操作可能引發第二次異常,除非異常處理程序首先檢查了選擇子并修定了潛在的問題。
將要執行的任務的特權級即不被引起任務切換的任務所影響,也不會被它所約束。因為每個任務的地址空間是分開的,且有不同的TSS,還有就是特權級規則可以用于防止不合法的TSS訪問,但是沒有哪種特權級規則需要用來去約束不同任務間的CPL。新的任務將在CS選擇子的RPL字段特權級執行,這個CS是由TSS中加載的。

- 第一章 80386介紹
- 1.1 該手冊的組織結構
- 1.2 其他文獻
- 第二章 編程基本模型
- 2.1 存儲器組織和段
- 2.2 數據類型
- 2.3 寄存器
- 2.4 指令格式
- 2.5 操作數選擇
- 2.6 中斷和異常
- 第4章 系統寄存器
- 4.1 系統寄存器 (System Registers)
- 4.2 系統指令 (System Instructions)
- 第五章 內存管理
- 5.1 分段地址轉換(Segment Translation)
- 5.2 分頁地址轉換(Page Translation)
- 5.3 混合分段和分頁地址轉換(Combining Segment and Page Translation)
- 第六章 內存管理
- 6.1 為什么要保護(Why Protection?)
- 6.2 80386保護機制概述(Overview of 80386 Protection Mechnaisms)
- 6.3 段級保護(Segment-Level Protection)
- 6.4 頁級保護(Page-Level Protection)
- 6.5 混合分頁和分段保護(Combining Page and Segment Protection)
- 第7章 多任務(Multitasking)
- 8.1 I/O 尋址(I/O Addressing)
- 7.1 任務狀態段(Task State Segment)
- 7.3 任務寄存器(Task Register)
- 7.4 任務門描述符(Task Gate Descriptor)
- 7.5 任務切換(Task Switching)
- 7.6 任務鏈(Task Linking)
- 7.7 任務尋址空間(Task Address Space)
- 第8章 輸入 輸出
- 8.2 I/O 指令(I/O Instructions)
- 8.3 保護和I/O(Protection and I/O)
- 第9章 異常和中斷(Exceptions and Interrupts)
- 9.1 識別中斷(Identifying Interrupts)
- 9.2 允許和禁止中斷(Enabling and Disabling Interrupts)
- 9.3 同時發生的中斷和異常的優先級(Priority Among Simultaneous Interrupts and Exceptions)
- 9.4 中斷描述符表(Interrupt Descriptor Table)
- 9.5 IDT 描述符(IDT Descriptors)
- 9.6 中斷任務和中斷子程序(Interrupt Tasks and Interrupt Procedures)
- 9.7 出錯碼(Error Code)
- 9.8 異常條件(Exception Conditions)
- 9.9 異常總結(Exception Summary)
- 9.10 出錯碼總結(Error Code Summary)
- 第10章 初始化(Initialization)
- 10.1 復位后處理器狀態(Processor State After Reset)
- 10.2 實模式初始化(Software Initialization for Real-Address Mode)
- 10.3 切換到保護模式(Switching to Protected Mode)
- 10.4 保護模式初始化(Software Initialization for Protected Mode)
- 10.5 初始化示例
- 10.6 TLB測試
- 第十四章 80386實地址模式
- 14.1 物理地址構成
- 14.2 寄存器和指令
- 14.3 中斷和異常處理
- 14.4 進入和離開實地址模式
- 14.6 實地址模式異常
- 14.7 與8086的不同
- 14.8 與80286實地址模式的不同