80286 任務狀態段與任務切換
調用門描述符用於系統調用 中斷門描述符本質是新的中斷向量表 任務狀態描述符則用來在任務切換時保存任務狀態
任務
任務的一個例子就是進程。任務切換的一個例子就是進程切換。 一個任務包括以下內容: 1. 一段或幾段可執行的任務代碼 2. 一段或幾段任務中用得到的數據 3. 任務在各個特權級上執行時用到的堆棧 4. 任務的LDT,用來構成該任務私有的局部地址空間 5. 一個任務狀態段
任務狀態段的格式
當一個任務被暫停執行時,CPU將該任務的某些信息存在任務狀態段中。當一個原來掛起的任務被恢復執行時,CPU從該任務的任務狀態段讀取這些信息,恢復到任務被暫停時的狀態,接著執行。存在任務狀態段的信息是CPU規定並在任務切換時CPU讀寫的,不是一個程序員自己定義的數據結構。
任務狀態段(TSS, Task State Segment)由兩部分組成:
動態部分,處理器在每次任務切換時會設置這些欄位值: 1.1 通用寄存器(EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI)。 1.2 段寄存器(ES,CS,SS,DS,FS,GS) 1.3 狀態寄存器(EFLAGS) 1.4 指令指針(EIP) 1.5 前一個執行的任務的TSS段的選擇子(只有當要返回時才更新)。
靜態欄位,處理器讀取,但從不更改。這些欄位包括: 2.1 任務的LDT選擇子 2.2 頁目錄基址寄存器(PDBR)(當啟用分頁時,只讀 當前討論的80286並沒有,到80386才有 2.3 內層堆棧指針,特權級0-2,三個特權級每個特權級一個,特權3不需要,原因是(1)當前特權級為3時,堆棧指針存在SS,SP中,(2)當前特權級不是3時,特權級3的堆棧指針被複制到當前代碼的堆棧中。 2.4 T-位,指示了處理器在任務切換時是否引發一個調試異常。 2.5 I/O 點陣圖基址,描述當前任務具有哪些IO口(in, out指令訪問的那種IO口)的訪問許可權。
任務切換
任務切換操作將做以下的步驟:
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中載入的。
直接任務切換和間接任務切換
任務的切換有幾種方式: 1、 直接切換,當前任務執行了一個JMP或CALL,而操作數中指定了一個TSS描述符。 2、 間接切換,當前任務執行了一個JMP或CALL,而操作數中指定了一個任務門。 3、 一個在IDT中的中斷向量或異常向量導致向一個新的任務切換。 4、 當前任務執行了一條IRET指令,而且NT位設置時。
拋開中斷相關的內容,任務切換有兩種方式,直接方式(通過任務狀態段)和間接方式(通過任務門、任務門再指向任務狀態段)。 通過任務狀態段切換任務的流程圖如下:
通過任務門切換任務的流程圖如下:
一個任務門描述符提供了一個間接的、有保護性的對一個TSS的的訪問方法。
任務門描述符和任務狀態段描述符的格式
一個任務狀態段(TSS)由一個任務狀態段描述符(TSS描述符)來描述。TSS描述符的結構如下:
一個任務門描述符的格式如下:
推薦閱讀:
※為什麼說阿里巴巴和Google終有一戰?
※網路安全法執行在即 國產操作系統引業界關注
※你為什麼不買正版操作系統和軟體?
※YunOS 2016年要實現1億目標,是在做夢嗎?
※有誰知道2036年9月18日是什麼特別的日子嗎?