TSS任務狀態段


任務狀態段(Task State Segment)是保存一個任務重要信息的特殊段。任務狀態段描述符用於描述這樣的系統段。任務狀態段寄存器TR的可見部分含有當前任務的任務狀態段描述符的選擇子,TR的不可見的高速緩沖寄存器部分含有當前任務狀態段的段基地址和段界限等信息。

  TSS在任務切換過程中起着重要作用,通過它實現任務的掛起和恢復。所謂任務切換是指,掛起當前正在執行的任務,恢復或啟動另一任務的執行。在任務切換過程中,首先,處理器中各寄存器的當前值被自動保存到TR所指定的TSS中;然后,下一任務的TSS的選擇子被裝入TR;最后,從TR所指定的TSS中取出各寄存器的值送到處理器的各寄存器中。由此可見,通過在TSS中保存任務現場各寄存器狀態的完整映象,實現任務的切換。
  任務狀態段TSS的基本格式如下圖所示。

 























BIT31—BIT16 BIT15—BIT1 BIT0 Offset
0000000000000000 鏈接字段 0
ESP0 4
0000000000000000 SS0 8
ESP1 0CH
0000000000000000 SS1 10H
ESP2 14H
0000000000000000 SS2 18H
CR3 1CH
EIP 20H
EFLAGS 24H
EAX 28H
ECX 2CH
EDX 30H
EBX 34H
ESP 38H
EBP 3CH
ESI 40H
EDI 44H
0000000000000000 ES 48H
0000000000000000 CS 4CH
0000000000000000 SS 50H
0000000000000000 DS 54H
0000000000000000 FS 58H
0000000000000000 GS 5CH
0000000000000000 LDTR 60H
I/O許可位圖偏移 000000000000000 T 64H

 

  從圖中可見,TSS的基本格式由104字節組成。這104字節的基本格式是不可改變的,但在此之外系統軟件還可定義若干附加信息。基本的104字節可分為鏈接字段區域、內層堆棧指針區域、地址映射寄存器區域、寄存器保存區域和其它字段等五個區域。

1.寄存器保存區域

  寄存器保存區域位於TSS內偏移20H至5FH處,用於保存通用寄存器、段寄存器、指令指針和標志寄存器。當TSS對應的任務正在執行時,保存區域是未定義的;在當前任務被切換出時,這些寄存器的當前值就保存在該區域。當下次切換回原任務時,再從保存區域恢復出這些寄存器的值,從而,使處理器恢復成該任務換出前的狀態,最終使任務能夠恢復執行。
  從上圖可見,各通用寄存器對應一個32位的雙字,指令指針和標志寄存器各對應一個32位的雙字;各段寄存器也對應一個32位的雙字,段寄存器中的選擇子只有16位,安排再雙字的低16位,高16位未用,一般應填為0。

2.內層堆棧指針區域

  為了有效地實現保護,同一個任務在不同的特權級下使用不同的堆棧。例如,當從外層特權級3變換到內層特權級0時,任務使用的堆棧也同時從3級變換到0級堆棧;當從內層特權級0變換到外層特權級3時,任務使用的堆棧也同時從0級堆棧變換到3級堆棧。所以,一個任務可能具有四個堆棧,對應四個特權級。四個堆棧需要四個堆棧指針。
  TSS的內層堆棧指針區域中有三個堆棧指針,它們都是48位的全指針(16位的選擇子和32位的偏移),分別指向0級、1級和2級堆棧的棧頂,依次存放在TSS中偏移為4、12及20開始的位置。當發生向內層轉移時,把適當的堆棧指針裝入SS及ESP寄存器以變換到內層堆棧,外層堆棧的指針保存在內層堆棧中。沒有指向3級堆棧的指針,因為3級是最外層,所以任何一個向內層的轉移都不可能轉移到3級。
  但是,當特權級由內層向外層變換時,並不把內層堆棧的指針保存到TSS的內層堆棧指針區域。實際上,處理器從不向該區域進行寫入,除非程序設計者認為改變該區域的值。這表明向內層轉移時,總是把內層堆棧認為是一個空棧。因此,不允許發生同級內層轉移的遞歸,一旦發生向某級內層的轉移,那么返回到外層的正常途徑是相匹配的向外層返回。
 
3.地址映射寄存器區域
  從虛擬地址空間到線性地址空間的映射由GDT和LDT確定,與特定任務相關的部分由LDT確定,而LDT又由LDTR確定。如果采用分頁機制,那么由線性地址空間到物理地址空間的映射由包含頁目錄表起始物理地址的控制寄存器CR3確定。所以,與特定任務相關的虛擬地址空間到物理地址空間的映射由LDTR和CR3確定。顯然,隨着任務的切換,地址映射關系也要切換。
  TSS的地址映射寄存器區域由位於偏移1CH處的雙字字段(CR3)和位於偏移60H處的字字段(LDTR)組成。在任務切換時,處理器自動從要執行任務的TSS中取出這兩個字段,分別裝入到寄存器CR3和LDTR。這樣就改變了虛擬地址空間到物理地址空間的映射。
  但是, 在任務切換時,處理器並不把換出任務但是的寄存器CR3和LDTR的內容保存到TSS中的地址映射寄存器區域。事實上,處理器也從來不向該區域自動寫入。因此,如果程序改變了LDTR或CR3,那么必須把新值人為地保存到TSS中的地址映射寄存器區域相應字段中。可以通過別名技術實現此功能。

4.鏈接字段

  鏈接字段安排在TSS內偏移0開始的雙字中,其高16位未用。在起鏈接作用時,地16位保存前一任務的TSS描述符的選擇子。
  如果當前的任務由段間調用指令CALL或中斷/異常而激活,那么鏈接字段保存被掛起任務的 TSS的選擇子,並且標志寄存器EFLAGS中的NT位被置1,使鏈接字段有效。在返回時,由於NT標志位為1,返回指令RET或中斷返回指令IRET將使得控制沿鏈接字段所指恢復到鏈上的前一個任務。

5.其它字段

  為了實現輸入/輸出保護,要使用I/O許可位圖。任務使用的I/O許可位圖也存放在TSS中,作為TSS的擴展部分。在TSS內偏移66H處的字用於存放I/O許可位圖在TSS內的偏移(從TSS開頭開始計算)。關於I/O許可位圖的作用,以后的文章中將會詳細介紹。
  在TSS內偏移64H處的字是為任務提供的特別屬性。在80386中,只定義了一種屬性,即調試陷阱。該屬性是字的最低位,用T表示。該字的其它位置被保留,必須被置為0。在發生任務切換時,如果進入任務的T位為1,那么在任務切換完成之后,新任務的第一條指令執行之前產生調試陷阱。

6.用結構類型定義TSS

  根據上圖給出的任務狀態段TSS的結構,可定義如下的TSS結構類型:
;----------------------------------------------------------------------------
;任務狀態段結構類型定義
;----------------------------------------------------------------------------
TSS             STRUC

TRLink          DW      0      ;鏈接字段
                DW      0      ;不使用,置為0
TRESP0          DD      0      ;0級堆棧指針

TRSS0           DW      0      ;0級堆棧段寄存器
                DW      0      ;不使用,置為0
TRESP1          DD      0      ;1級堆棧指針

TRSS1           DW      0      ;1級堆棧段寄存器
                DW      0      ;不使用,置為0
TRESP2          DD      0      ;2級堆棧指針

TRSS2           DW      0      ;2級堆棧段寄存器
                DW      0      ;不使用,置為0
TRCR3           DD      0      ;CR3

TREIP           DD      0      ;EIP
TREFlag         DD      0      ;EFLAGS
TREAX           DD      0      ;EAX

TRECX           DD      0      ;ECX
TREDX           DD      0      ;EDX
TREBX           DD      0      ;EBX

TRESP           DD      0      ;ESP
TREBP           DD      0      ;EBP
TRESI           DD      0      ;ESI

TREDI           DD      0      ;EDI
TRES            DW      0      ;ES
                DW      0      ;不使用,置為0

TRCS            DW      0      ;CS
                DW      0      ;不使用,置為0
TRSS            DW      0      ;SS

                DW      0      ;不使用,置為0
TRDS            DW      0      ;DS
                DW      0      ;不使用,置為0

TRFS            DW      0      ;FS
                DW      0      ;不使用,置為0
TRGS            DW      0      ;GS

                DW      0      ;不使用,置為0
TRLDTR          DW      0      ;LDTR
                DW      0      ;不使用,置為0
TRTrip          DW      0      ;調試陷阱標志(只用位0)
TRIOMap         DW      $ 2    ;指向I/O許可位圖區的段內偏移
TSS             ENDS


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM