tss在任務切換過程中起著重要作用,通過它實現任務的掛起和恢復。所謂任務切換是指,掛起當前正在執行的任務,恢復或啟動另一任務的執行。在任務切換過程中,首先,處理器中各暫存器的當前值被自動儲存到tr所指定的tss中;然後,下一任務的tss的選擇子被裝入tr;最後,從tr所指定的tss中取出各暫存器的值送到處理器的各暫存器中。由此可見,通過在tss中儲存任務現場各暫存器狀態的完整映象,實現任務的切換。(tr 當前任務狀態暫存器)
任務狀態段tss的基本格式如下圖所示。 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確定。顯然,隨著任務的切換,位址對映關係也要切換。 [page]
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,那麼在任務切換完成之後,新任務的第一條指令執行之前產生除錯陷阱。
TSS任務狀態段
1.什麼是tss tss全稱task state segment 是作業系統在進行程序切換時儲存程序現場資訊的段 2.tss什麼時候用,有什麼用 tss在任務 程序 切換時起著重要的作用,通過它儲存cpu中各暫存器的值,實現任務的掛起和恢復。比如說,當cpu執行a程序的時間片用完,要切換到b程序時,...
驅動 TSS(任務段)
是一塊記憶體有104位元組,執行緒切換時填充,乙個cpu乙份,作用為替換所有暫存器,為了讓你乙個cpu執行多個任務,第乙個存的是前乙個tss,進入0環,從中取出esp0 ss0放入esp ss暫存器,倒數第8位元組存放ldt ldt存放在ldtr中,每個任務乙個ldtr區域性描述符表中 tr暫存器來...
關於利用任務狀態段TSS進行程序切換的一點說明
關於利用任務狀態段tss進行程序切換的一點說明 由於在時鐘中斷裡進行任務切換,也就是用jmp指令跳轉到新的任務中去,這時的時鐘中斷是遮蔽的,但任務切換是直接進入新任務,沒有將時鐘中斷遮蔽開啟,所以造成了任務無法切換的情況,所以在對時鐘中斷任務切換程式設計時,不能簡單的跳到新任務中去,要將中斷遮蔽開啟...