2 TSS工作細節(jié) TSS在任務切換過程中起著重要作用,,通過它實現(xiàn)任務的掛起和恢復,。所謂任務切換是指,掛起當前正在執(zhí)行的任務,,恢復或啟動另一任務的執(zhí)行,。在任務切換過程中,首先,,處理器中各寄存器的當前值被自動保存到TR(任務寄存器)所指定的TSS中,;然后,下一任務的TSS的選擇子被裝入TR,;最后,,從TR所指定的TSS中取出各寄存器的值送到處理器的各寄存器中。由此可見,,通過在TSS中保存任務現(xiàn)場各寄存器狀態(tài)的完整映象,,實現(xiàn)任務的切換。 3 TSS的格式 任務狀態(tài)段TSS的基本格式如下圖所示,。 TSS的基本格式由104字節(jié)組成,。這104字節(jié)的基本格式是不可改變的,但在此之外系統(tǒng)軟件還可定義若干附加信息,。基本的104字節(jié)可分為鏈接字段區(qū)域,、內(nèi)層堆棧指針區(qū)域,、地址映射寄存器區(qū)域,、寄存器保存區(qū)域和其它字段等五個區(qū)域。 (1). 寄存器保存區(qū)域 寄存器保存區(qū)域位于TSS內(nèi)偏移20H至5FH處,,用于保存通用寄存器,、段寄存器、指令指針和標志寄存器,。當TSS對應的任務正在執(zhí)行時,,保存區(qū)域是未定義的;在當前任務被切換出時,,這些寄存器的當前值就保存在該區(qū)域,。當下次切換回原任務時,再從保存區(qū)域恢復出這些寄存器的值,,從而,,使處理器恢復成該任務換出前的狀態(tài),最終使任務能夠恢復執(zhí)行,。 從上圖可見,,各通用寄存器對應一個32位的雙字,指令指針和標志寄存器各對應一個32位的雙字,;各段寄存器也對應一個32位的雙字,,段寄存器中的選擇子只有16位,安排再雙字的低16位,,高16位未用,,一般應填為0。 (2). 內(nèi)層堆棧指針區(qū)域 為了有效地實現(xiàn)保護,,同一個任務在不同的特權級下使用不同的堆棧,。例如,當從外層特權級3變換到內(nèi)層特權級0時,,任務使用的堆棧也同時從3級變換到0級堆棧,;當從內(nèi)層特權級0變換到外層特權級3時,任務使用的堆棧也同時從0級堆棧變換到3級堆棧,。所以,,一個任務可能具有四個堆棧,對應四個特權級,。四個堆棧需要四個堆棧指針,。 TSS的內(nèi)層堆棧指針區(qū)域中有三個堆棧指針,它們都是48位的全指針(16位的選擇子和32位的偏移),,分別指向0級,、1級和2級堆棧的棧頂,依次存放在TSS中偏移為4、12及20開始的位置,。當發(fā)生向內(nèi)層轉移時,,把適當?shù)亩褩V羔樠b入SS及ESP寄存器以變換到內(nèi)層堆棧,外層堆棧的指針保存在內(nèi)層堆棧中,。沒有指向3級堆棧的指針,,因為3級是最外層,所以任何一個向內(nèi)層的轉移都不可能轉移到3級,。 但是,,當特權級由內(nèi)層向外層變換時,并不把內(nèi)層堆棧的指針保存到TSS的內(nèi)層堆棧指針區(qū)域,。實際上,,處理器從不向該區(qū)域進行寫入,除非程序設計者認為改變該區(qū)域的值,。這表明向內(nèi)層轉移時,,總是把內(nèi)層堆棧認為是一個空棧。因此,,不允許發(fā)生同級內(nèi)層轉移的遞歸,,一旦發(fā)生向某級內(nèi)層的轉移,那么返回到外層的正常途徑是相匹配的向外層返回,。 (3). 地址映射寄存器區(qū)域 從虛擬地址空間到線性地址空間的映射由GDT和LDT確定,,與特定任務相關的部分由LDT確定,而LDT又由LDTR確定,。如果采用分頁機制,,那么由線性地址空間到物理地址空間的映射由包含頁目錄表起始物理地址的控制寄存器CR3確定。所以,,與特定任務相關的虛擬地址空間到物理地址空間的映射由LDTR和CR3確定,。顯然,隨著任務的切換,,地址映射關系也要切換,。 [Page] TSS的地址映射寄存器區(qū)域由位于偏移1CH處的雙字字段(CR3)和位于偏移60H處的字字段(LDTR)組成。在任務切換時,,處理器自動從要執(zhí)行任務的TSS中取出這兩個字段,,分別裝入到寄存器CR3和LDTR。這樣就改變了虛擬地址空間到物理地址空間的映射,。 但是,,在任務切換時,處理器并不把換出任務但是的寄存器CR3和LDTR的內(nèi)容保存到TSS中的地址映射寄存器區(qū)域,。事實上,,處理器也從來不向該區(qū)域自動寫入。因此,如果程序改變了LDTR或CR3,,那么必須把新值人為地保存到TSS中的地址映射寄存器區(qū)域相應字段中,??梢酝ㄟ^別名技術實現(xiàn)此功能,。 (4). 鏈接字段 鏈接字段安排在TSS內(nèi)偏移0開始的雙字中,其高16位未用,。在起鏈接作用時,,地16位保存前一任務的TSS描述符的選擇子。 如果當前的任務由段間調(diào)用指令CALL或中斷/異常而激活,,那么鏈接字段保存被掛起任務的 TSS的選擇子,,并且標志寄存器EFLAGS中的NT位被置1,使鏈接字段有效,。在返回時,,由于NT標志位為1,返回指令RET或中斷返回指令IRET將使得控制沿鏈接字段所指恢復到鏈上的前一個任務,。 (5). 其它字段 為了實現(xiàn)輸入/輸出保護,,要使用I/O許可位圖。任務使用的I/O許可位圖也存放在TSS中,,作為TSS的擴展部分,。在TSS內(nèi)偏移66H處的字用于存放I/O許可位圖在TSS內(nèi)的偏移(從TSS開頭開始計算)。關于I/O許可位圖的作用,,以后的文章中將會詳細介紹,。 在TSS內(nèi)偏移64H處的字是為任務提供的特別屬性。在80386中,,只定義了一種屬性,,即調(diào)試陷阱。該屬性是字的最低位,,用T表示,。該字的其它位置被保留,必須被置為0,。在發(fā)生任務切換時,,如果進入任務的T位為1,那么在任務切換完成之后,,新任務的第一條指令執(zhí)行之前產(chǎn)生調(diào)試陷阱,。 |
|