TSS 任务状态段
TSS(任務(wù)狀態(tài)段) 1 什么是TSS
TSS 全稱task state segment,是指在操作系統(tǒng)進程管理的過程中,任務(wù)(進程)切換時的任務(wù)現(xiàn)場信息。?
2 TSS工作細節(jié)
TSS在任務(wù)切換過程中起著重要作用,通過它實現(xiàn)任務(wù)的掛起和恢復(fù)。所謂任務(wù)切換是指,掛起當(dāng)前正在執(zhí)行的任務(wù),恢復(fù)或啟動另一任務(wù)的執(zhí)行。在任務(wù)切換過程中,首先,處理器中各寄存器的當(dāng)前值被自動保存到TR(任務(wù)寄存器)所指定的TSS中;然后,下一任務(wù)的TSS的選擇子被裝入TR;最后,從TR所指定的TSS中取出各寄存器的值送到處理器的各寄存器中。由此可見,通過在TSS中保存任務(wù)現(xiàn)場各寄存器狀態(tài)的完整映象,實現(xiàn)任務(wù)的切換。
3 TSS的格式 任務(wù)狀態(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處,用于保存通用寄存器、段寄存器、指令指針和標(biāo)志寄存器。當(dāng)TSS對應(yīng)的任務(wù)正在執(zhí)行時,保存區(qū)域是未定義的;在當(dāng)前任務(wù)被切換出時,這些寄存器的當(dāng)前值就保存在該區(qū)域。當(dāng)下次切換回原任務(wù)時,再從保存區(qū)域恢復(fù)出這些寄存器的值,從而,使處理器恢復(fù)成該任務(wù)換出前的狀態(tài),最終使任務(wù)能夠恢復(fù)執(zhí)行。 從上圖可見,各通用寄存器對應(yīng)一個32位的雙字,指令指針和標(biāo)志寄存器各對應(yīng)一個32位的雙字;各段寄存器也對應(yīng)一個32位的雙字,段寄存器中的選擇子只有16位,安排再雙字的低16位,高16位未用,一般應(yīng)填為0。
(2). 內(nèi)層堆棧指針區(qū)域 為了有效地實現(xiàn)保護,同一個任務(wù)在不同的特權(quán)級下使用不同的堆棧。例如,當(dāng)從外層特權(quán)級3變換到內(nèi)層特權(quán)級0時,任務(wù)使用的堆棧也同時從3級變換到0級堆棧;當(dāng)從內(nèi)層特權(quán)級0變換到外層特權(quán)級3時,任務(wù)使用的堆棧也同時從0級堆棧變換到3級堆棧。所以,一個任務(wù)可能具有四個堆棧,對應(yīng)四個特權(quán)級。四個堆棧需要四個堆棧指針。 TSS的內(nèi)層堆棧指針區(qū)域中有三個堆棧指針,它們都是48位的全指針(16位的選擇子和32位的偏移),分別指向0級、1級和2級堆棧的棧頂,依次存放在TSS中偏移為4、12及20開始的位置。當(dāng)發(fā)生向內(nèi)層轉(zhuǎn)移時,把適當(dāng)?shù)亩褩V羔樠b入SS及ESP寄存器以變換到內(nèi)層堆棧,外層堆棧的指針保存在內(nèi)層堆棧中。沒有指向3級堆棧的指針,因為3級是最外層,所以任何一個向內(nèi)層的轉(zhuǎn)移都不可能轉(zhuǎn)移到3級。 但是,當(dāng)特權(quán)級由內(nèi)層向外層變換時,并不把內(nèi)層堆棧的指針保存到TSS的內(nèi)層堆棧指針區(qū)域。實際上,處理器從不向該區(qū)域進行寫入,除非程序設(shè)計者認為改變該區(qū)域的值。這表明向內(nèi)層轉(zhuǎn)移時,總是把內(nèi)層堆棧認為是一個空棧。因此,不允許發(fā)生同級內(nèi)層轉(zhuǎn)移的遞歸,一旦發(fā)生向某級內(nèi)層的轉(zhuǎn)移,那么返回到外層的正常途徑是相匹配的向外層返回。
(3). 地址映射寄存器區(qū)域 從虛擬地址空間到線性地址空間的映射由GDT和LDT確定,與特定任務(wù)相關(guān)的部分由LDT確定,而LDT又由LDTR確定。如果采用分頁機制,那么由線性地址空間到物理地址空間的映射由包含頁目錄表起始物理地址的控制寄存器CR3確定。所以,與特定任務(wù)相關(guān)的虛擬地址空間到物理地址空間的映射由LDTR和CR3確定。顯然,隨著任務(wù)的切換,地址映射關(guān)系也要切換。 [Page] TSS的地址映射寄存器區(qū)域由位于偏移1CH處的雙字字段(CR3)和位于偏移60H處的字字段(LDTR)組成。在任務(wù)切換時,處理器自動從要執(zhí)行任務(wù)的TSS中取出這兩個字段,分別裝入到寄存器CR3和LDTR。這樣就改變了虛擬地址空間到物理地址空間的映射。 但是,在任務(wù)切換時,處理器并不把換出任務(wù)但是的寄存器CR3和LDTR的內(nèi)容保存到TSS中的地址映射寄存器區(qū)域。事實上,處理器也從來不向該區(qū)域自動寫入。因此,如果程序改變了LDTR或CR3,那么必須把新值人為地保存到TSS中的地址映射寄存器區(qū)域相應(yīng)字段中。可以通過別名技術(shù)實現(xiàn)此功能。
(4). 鏈接字段 鏈接字段安排在TSS內(nèi)偏移0開始的雙字中,其高16位未用。在起鏈接作用時,地16位保存前一任務(wù)的TSS描述符的選擇子。 如果當(dāng)前的任務(wù)由段間調(diào)用指令CALL或中斷/異常而激活,那么鏈接字段保存被掛起任務(wù)的 TSS的選擇子,并且標(biāo)志寄存器EFLAGS中的NT位被置1,使鏈接字段有效。在返回時,由于NT標(biāo)志位為1,返回指令RET或中斷返回指令I(lǐng)RET將使得控制沿鏈接字段所指恢復(fù)到鏈上的前一個任務(wù)。
(5). 其它字段 為了實現(xiàn)輸入/輸出保護,要使用I/O許可位圖。任務(wù)使用的I/O許可位圖也存放在TSS中,作為TSS的擴展部分。在TSS內(nèi)偏移66H處的字用于存放I/O許可位圖在TSS內(nèi)的偏移(從TSS開頭開始計算)。關(guān)于I/O許可位圖的作用,以后的文章中將會詳細介紹。 在TSS內(nèi)偏移64H處的字是為任務(wù)提供的特別屬性。在80386中,只定義了一種屬性,即調(diào)試陷阱。該屬性是字的最低位,用T表示。該字的其它位置被保留,必須被置為0。在發(fā)生任務(wù)切換時,如果進入任務(wù)的T位為1,那么在任務(wù)切換完成之后,新任務(wù)的第一條指令執(zhí)行之前產(chǎn)生調(diào)試陷阱。
TSS 全稱task state segment,是指在操作系統(tǒng)進程管理的過程中,任務(wù)(進程)切換時的任務(wù)現(xiàn)場信息。?
2 TSS工作細節(jié)
TSS在任務(wù)切換過程中起著重要作用,通過它實現(xiàn)任務(wù)的掛起和恢復(fù)。所謂任務(wù)切換是指,掛起當(dāng)前正在執(zhí)行的任務(wù),恢復(fù)或啟動另一任務(wù)的執(zhí)行。在任務(wù)切換過程中,首先,處理器中各寄存器的當(dāng)前值被自動保存到TR(任務(wù)寄存器)所指定的TSS中;然后,下一任務(wù)的TSS的選擇子被裝入TR;最后,從TR所指定的TSS中取出各寄存器的值送到處理器的各寄存器中。由此可見,通過在TSS中保存任務(wù)現(xiàn)場各寄存器狀態(tài)的完整映象,實現(xiàn)任務(wù)的切換。
3 TSS的格式 任務(wù)狀態(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處,用于保存通用寄存器、段寄存器、指令指針和標(biāo)志寄存器。當(dāng)TSS對應(yīng)的任務(wù)正在執(zhí)行時,保存區(qū)域是未定義的;在當(dāng)前任務(wù)被切換出時,這些寄存器的當(dāng)前值就保存在該區(qū)域。當(dāng)下次切換回原任務(wù)時,再從保存區(qū)域恢復(fù)出這些寄存器的值,從而,使處理器恢復(fù)成該任務(wù)換出前的狀態(tài),最終使任務(wù)能夠恢復(fù)執(zhí)行。 從上圖可見,各通用寄存器對應(yīng)一個32位的雙字,指令指針和標(biāo)志寄存器各對應(yīng)一個32位的雙字;各段寄存器也對應(yīng)一個32位的雙字,段寄存器中的選擇子只有16位,安排再雙字的低16位,高16位未用,一般應(yīng)填為0。
(2). 內(nèi)層堆棧指針區(qū)域 為了有效地實現(xiàn)保護,同一個任務(wù)在不同的特權(quán)級下使用不同的堆棧。例如,當(dāng)從外層特權(quán)級3變換到內(nèi)層特權(quán)級0時,任務(wù)使用的堆棧也同時從3級變換到0級堆棧;當(dāng)從內(nèi)層特權(quán)級0變換到外層特權(quán)級3時,任務(wù)使用的堆棧也同時從0級堆棧變換到3級堆棧。所以,一個任務(wù)可能具有四個堆棧,對應(yīng)四個特權(quán)級。四個堆棧需要四個堆棧指針。 TSS的內(nèi)層堆棧指針區(qū)域中有三個堆棧指針,它們都是48位的全指針(16位的選擇子和32位的偏移),分別指向0級、1級和2級堆棧的棧頂,依次存放在TSS中偏移為4、12及20開始的位置。當(dāng)發(fā)生向內(nèi)層轉(zhuǎn)移時,把適當(dāng)?shù)亩褩V羔樠b入SS及ESP寄存器以變換到內(nèi)層堆棧,外層堆棧的指針保存在內(nèi)層堆棧中。沒有指向3級堆棧的指針,因為3級是最外層,所以任何一個向內(nèi)層的轉(zhuǎn)移都不可能轉(zhuǎn)移到3級。 但是,當(dāng)特權(quán)級由內(nèi)層向外層變換時,并不把內(nèi)層堆棧的指針保存到TSS的內(nèi)層堆棧指針區(qū)域。實際上,處理器從不向該區(qū)域進行寫入,除非程序設(shè)計者認為改變該區(qū)域的值。這表明向內(nèi)層轉(zhuǎn)移時,總是把內(nèi)層堆棧認為是一個空棧。因此,不允許發(fā)生同級內(nèi)層轉(zhuǎn)移的遞歸,一旦發(fā)生向某級內(nèi)層的轉(zhuǎn)移,那么返回到外層的正常途徑是相匹配的向外層返回。
(3). 地址映射寄存器區(qū)域 從虛擬地址空間到線性地址空間的映射由GDT和LDT確定,與特定任務(wù)相關(guān)的部分由LDT確定,而LDT又由LDTR確定。如果采用分頁機制,那么由線性地址空間到物理地址空間的映射由包含頁目錄表起始物理地址的控制寄存器CR3確定。所以,與特定任務(wù)相關(guān)的虛擬地址空間到物理地址空間的映射由LDTR和CR3確定。顯然,隨著任務(wù)的切換,地址映射關(guān)系也要切換。 [Page] TSS的地址映射寄存器區(qū)域由位于偏移1CH處的雙字字段(CR3)和位于偏移60H處的字字段(LDTR)組成。在任務(wù)切換時,處理器自動從要執(zhí)行任務(wù)的TSS中取出這兩個字段,分別裝入到寄存器CR3和LDTR。這樣就改變了虛擬地址空間到物理地址空間的映射。 但是,在任務(wù)切換時,處理器并不把換出任務(wù)但是的寄存器CR3和LDTR的內(nèi)容保存到TSS中的地址映射寄存器區(qū)域。事實上,處理器也從來不向該區(qū)域自動寫入。因此,如果程序改變了LDTR或CR3,那么必須把新值人為地保存到TSS中的地址映射寄存器區(qū)域相應(yīng)字段中。可以通過別名技術(shù)實現(xiàn)此功能。
(4). 鏈接字段 鏈接字段安排在TSS內(nèi)偏移0開始的雙字中,其高16位未用。在起鏈接作用時,地16位保存前一任務(wù)的TSS描述符的選擇子。 如果當(dāng)前的任務(wù)由段間調(diào)用指令CALL或中斷/異常而激活,那么鏈接字段保存被掛起任務(wù)的 TSS的選擇子,并且標(biāo)志寄存器EFLAGS中的NT位被置1,使鏈接字段有效。在返回時,由于NT標(biāo)志位為1,返回指令RET或中斷返回指令I(lǐng)RET將使得控制沿鏈接字段所指恢復(fù)到鏈上的前一個任務(wù)。
(5). 其它字段 為了實現(xiàn)輸入/輸出保護,要使用I/O許可位圖。任務(wù)使用的I/O許可位圖也存放在TSS中,作為TSS的擴展部分。在TSS內(nèi)偏移66H處的字用于存放I/O許可位圖在TSS內(nèi)的偏移(從TSS開頭開始計算)。關(guān)于I/O許可位圖的作用,以后的文章中將會詳細介紹。 在TSS內(nèi)偏移64H處的字是為任務(wù)提供的特別屬性。在80386中,只定義了一種屬性,即調(diào)試陷阱。該屬性是字的最低位,用T表示。該字的其它位置被保留,必須被置為0。在發(fā)生任務(wù)切換時,如果進入任務(wù)的T位為1,那么在任務(wù)切換完成之后,新任務(wù)的第一條指令執(zhí)行之前產(chǎn)生調(diào)試陷阱。
-----------------------------------------------------------------------------------------------------------
我看了你說的兩段了,是P393的吧
第一段是這樣理解:
當(dāng)從外層轉(zhuǎn)移到內(nèi)層時系統(tǒng)會把返回地址和外層堆棧的指針保留到內(nèi)層堆棧中,比如:從R3調(diào)用R0的服務(wù),CPU會把R3的堆棧、返回地址都壓入R0的堆棧中,以備返回時使用。
第二段:
所謂“一旦發(fā)生向某級內(nèi)層轉(zhuǎn)移,那么返回到外層的正常途徑是相匹配的向外層返回”。意思是說,從外層到內(nèi)層,可以通過CALL/JMP來直接轉(zhuǎn)移,但從內(nèi)層到外層,不能直接通過CALL/JMP,只能通過遠程RET,這樣做的原因是為了確保內(nèi)層的堆棧不被外層代碼得知,而不是“這表明向內(nèi)層轉(zhuǎn)移時,總是把內(nèi)層堆棧認為是一個空棧”。
至于遞歸調(diào)用那個說法,我也不是很明白
?
http://bbs.csdn.net/topics/90016769
?
轉(zhuǎn)載于:https://www.cnblogs.com/wanghj-dz/p/3979729.html
總結(jié)
- 上一篇: 正则表达式30分钟入门教程(转)
- 下一篇: Android 弹出有确认按键的对话