日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

为什么引入TSS

發(fā)布時(shí)間:2023/12/3 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 为什么引入TSS 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

【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)級(jí)變換的轉(zhuǎn)移——理論篇

  • (1)出現(xiàn)的問題: call 指令 執(zhí)行前后的堆棧已經(jīng)不再是同一個(gè)堆棧 了,那么我們?cè)诙褩中壓入?yún)?shù)和返回地址, 需要出棧(ret or retf)時(shí),堆棧卻變成了堆棧B, 這該怎么辦呢?
  • (2)解決方法: Intel提供一種機(jī)制, 將堆棧A的內(nèi)容復(fù)制到 堆棧B中, 如下圖;

  • (3)TSS閃亮登場(chǎng)(task-state segment -任務(wù)狀態(tài)段)
    (不同特權(quán)級(jí)的代碼段間的轉(zhuǎn)移,會(huì)發(fā)生堆棧切換,使得調(diào)用者的入棧的堆棧是針對(duì)調(diào)用者本身的堆棧, 而出棧操作是針對(duì)被調(diào)用者的堆棧,即入棧和出棧的堆棧不一致,使得特權(quán)級(jí)間跳轉(zhuǎn)出錯(cuò),故引入了 TSS)

  • 出現(xiàn)的問題: 由于每個(gè)任務(wù)可能在4個(gè)特權(quán)級(jí)間轉(zhuǎn)移,故每個(gè)任務(wù)實(shí)際上需要4個(gè)堆棧;問題是:我們只有一個(gè)ss 和 esp, 那么當(dāng)發(fā)生堆棧切換,我們?cè)搹哪睦铽@取其他堆棧的ss 和 esp 呢?

  • 解決方法: 我們引入TSS, 它可以解決這個(gè)問題, TSS 數(shù)據(jù)結(jié)構(gòu) 和 TSS段描述符的數(shù)據(jù)結(jié)構(gòu) 如下;


【2】舉個(gè)荔枝:

如,我們當(dāng)前在ring3 , 當(dāng)轉(zhuǎn)移只ring1 時(shí), 堆棧將被自動(dòng)切換到由 ss1 和 esp1 指定的位置。由于只是在外層到內(nèi)層(低特權(quán)級(jí)到高特權(quán)級(jí))切換時(shí),新堆棧才會(huì)從TSS中取得,所以TSS 并沒有位于最外層 ring3 的堆棧信息;

(2.1)轉(zhuǎn)移的過程中,CPU所做的工作:

  • 1) 根據(jù)目標(biāo)代碼段的DPL,從TSS中選擇應(yīng)該切換到哪個(gè)ss 和 esp;
  • 2) 從TSS 中讀取新的ss 和 esp。在這個(gè)過程中,若發(fā)現(xiàn)ss、esp 或者 TSS 界限錯(cuò)誤都會(huì)導(dǎo)致無效 TSS異常;
  • 3) 對(duì)ss 描述符進(jìn)行檢驗(yàn),若發(fā)生錯(cuò)誤,同樣產(chǎn)生#TS異常;
  • 4) 暫時(shí)性保存當(dāng)前ss 和 esp 的值;
  • 5) 加載新的 ss 和 esp;
  • 6) 將剛剛保存起來的ss 和 esp 的值壓棧;
  • 7) 從調(diào)用者堆棧中將參數(shù) 復(fù)制到被調(diào)用者堆棧中(新堆棧中), 復(fù)制參數(shù)的數(shù)目由調(diào)用門中 Param Count一項(xiàng)來決定;
  • 8) 將當(dāng)前的 cs 和 eip 壓棧;
  • 9) 加載調(diào)用門中指定的新的cs 和 eip, 開始執(zhí)行被調(diào)用者過程;

(2.2)從被調(diào)用者到調(diào)用者的返回過程中, 處理器的工作:
(實(shí)際上,ret這個(gè)指令不僅可以實(shí)現(xiàn)短返回和長(zhǎng)返回, 而且可以實(shí)現(xiàn)帶有特權(quán)級(jí)變換的長(zhǎng)返回)

  • 1)檢查保存的cs 中的RPL 以判斷返回時(shí)是否要變換特權(quán)級(jí);
  • 2)加載被調(diào)用者堆棧上的cs 和eip;
  • 3)如果ret 指令含有參數(shù),則增加esp 跳過參數(shù),然后esp 將指向被保存過的調(diào)用者ss 和 esp ;ret的參數(shù)個(gè)數(shù)對(duì)應(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的值,如果其中哪一個(gè)寄存器指向的段的DPL 小于CPL(此規(guī)則不適用于一致代碼段),那么一個(gè)空描述符會(huì)被加載到該寄存器;

【3】總結(jié):(使用調(diào)用門的過程實(shí)際上分為兩部分)

  • (1)從低特權(quán)級(jí)到高特權(quán)級(jí),通過調(diào)用門和call 指令來實(shí)現(xiàn);
  • (2)從高特權(quán)級(jí)到低特權(quán)級(jí), 通過ret 指令來實(shí)現(xiàn);(即,ret 指令可以實(shí)現(xiàn)從高特權(quán)級(jí)到低特權(quán)級(jí)的轉(zhuǎn)移)

(Attention):

  • A1)從調(diào)用者堆棧中將參數(shù)復(fù)制到被調(diào)用者堆棧(新堆棧)中, 復(fù)制參數(shù)的數(shù)目由 調(diào)用門中 Param Count 一項(xiàng)來決定,(調(diào)用門中 Param Count的作用);
  • A2) ret(retf)是call 的反過程, 只是帶參數(shù)的ret 指令會(huì)同時(shí)釋放事先被壓棧的參數(shù);
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的为什么引入TSS的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。