为什么引入TSS
【0】README
text description from orange’s implemention of a os and for complete code ,please visit https://github.com/pacosonTang/Orange-s-OS/blob/master/p62.asm.
【1】 回憶——關(guān)于堆棧
通過調(diào)用門進(jìn)行有特權(quán)級變換的轉(zhuǎn)移——理論篇
- (1)出現(xiàn)的問題: call 指令 執(zhí)行前后的堆棧已經(jīng)不再是同一個堆棧 了,那么我們在堆棧A中壓入?yún)?shù)和返回地址, 需要出棧(ret or retf)時,堆棧卻變成了堆棧B, 這該怎么辦呢?
(2)解決方法: Intel提供一種機(jī)制, 將堆棧A的內(nèi)容復(fù)制到 堆棧B中, 如下圖;
(3)TSS閃亮登場(task-state segment -任務(wù)狀態(tài)段)
(不同特權(quán)級的代碼段間的轉(zhuǎn)移,會發(fā)生堆棧切換,使得調(diào)用者的入棧的堆棧是針對調(diào)用者本身的堆棧, 而出棧操作是針對被調(diào)用者的堆棧,即入棧和出棧的堆棧不一致,使得特權(quán)級間跳轉(zhuǎn)出錯,故引入了 TSS)出現(xiàn)的問題: 由于每個任務(wù)可能在4個特權(quán)級間轉(zhuǎn)移,故每個任務(wù)實際上需要4個堆棧;問題是:我們只有一個ss 和 esp, 那么當(dāng)發(fā)生堆棧切換,我們該從哪里獲取其他堆棧的ss 和 esp 呢?
- 解決方法: 我們引入TSS, 它可以解決這個問題, TSS 數(shù)據(jù)結(jié)構(gòu) 和 TSS段描述符的數(shù)據(jù)結(jié)構(gòu) 如下;
【2】舉個荔枝:
如,我們當(dāng)前在ring3 , 當(dāng)轉(zhuǎn)移只ring1 時, 堆棧將被自動切換到由 ss1 和 esp1 指定的位置。由于只是在外層到內(nèi)層(低特權(quán)級到高特權(quán)級)切換時,新堆棧才會從TSS中取得,所以TSS 并沒有位于最外層 ring3 的堆棧信息;
(2.1)轉(zhuǎn)移的過程中,CPU所做的工作:
- 1) 根據(jù)目標(biāo)代碼段的DPL,從TSS中選擇應(yīng)該切換到哪個ss 和 esp;
- 2) 從TSS 中讀取新的ss 和 esp。在這個過程中,若發(fā)現(xiàn)ss、esp 或者 TSS 界限錯誤都會導(dǎo)致無效 TSS異常;
- 3) 對ss 描述符進(jìn)行檢驗,若發(fā)生錯誤,同樣產(chǎn)生#TS異常;
- 4) 暫時性保存當(dāng)前ss 和 esp 的值;
- 5) 加載新的 ss 和 esp;
- 6) 將剛剛保存起來的ss 和 esp 的值壓棧;
- 7) 從調(diào)用者堆棧中將參數(shù) 復(fù)制到被調(diào)用者堆棧中(新堆棧中), 復(fù)制參數(shù)的數(shù)目由調(diào)用門中 Param Count一項來決定;
- 8) 將當(dāng)前的 cs 和 eip 壓棧;
- 9) 加載調(diào)用門中指定的新的cs 和 eip, 開始執(zhí)行被調(diào)用者過程;
(2.2)從被調(diào)用者到調(diào)用者的返回過程中, 處理器的工作:
(實際上,ret這個指令不僅可以實現(xiàn)短返回和長返回, 而且可以實現(xiàn)帶有特權(quán)級變換的長返回)
- 1)檢查保存的cs 中的RPL 以判斷返回時是否要變換特權(quán)級;
- 2)加載被調(diào)用者堆棧上的cs 和eip;
- 3)如果ret 指令含有參數(shù),則增加esp 跳過參數(shù),然后esp 將指向被保存過的調(diào)用者ss 和 esp ;ret的參數(shù)個數(shù)對應(yīng) 調(diào)用門中的 Param Count的值;
- 4)加載ss 和 esp , 切換到調(diào)用者堆棧,被調(diào)用者的ss 和 esp 被丟棄;
- 5)如果ret 指令含有參數(shù), 增加esp 的值以跳過參數(shù);
- 6)檢查ds、es、fs、gs的值,如果其中哪一個寄存器指向的段的DPL 小于CPL(此規(guī)則不適用于一致代碼段),那么一個空描述符會被加載到該寄存器;
【3】總結(jié):(使用調(diào)用門的過程實際上分為兩部分)
- (1)從低特權(quán)級到高特權(quán)級,通過調(diào)用門和call 指令來實現(xiàn);
- (2)從高特權(quán)級到低特權(quán)級, 通過ret 指令來實現(xiàn);(即,ret 指令可以實現(xiàn)從高特權(quán)級到低特權(quán)級的轉(zhuǎn)移)
(Attention):
- A1)從調(diào)用者堆棧中將參數(shù)復(fù)制到被調(diào)用者堆棧(新堆棧)中, 復(fù)制參數(shù)的數(shù)目由 調(diào)用門中 Param Count 一項來決定,(調(diào)用門中 Param Count的作用);
- A2) ret(retf)是call 的反過程, 只是帶參數(shù)的ret 指令會同時釋放事先被壓棧的參數(shù);
總結(jié)
- 上一篇: 域名怎么填写(邮箱域名怎么填写)
- 下一篇: 古巴比伦是现在的哪个国家(位于现今的伊拉