棧切換及控制返回過程

2021-10-03 01:55:11 字數 1250 閱讀 7366

1.棧切換過程

使用呼叫門改變了cpl,必須切換棧,即從當前棧切換到與目標**段特權級相同棧上。棧切換由處理器韌體自動完成。棧切換過程如下:

從tss中選取目標**段dpl的棧,讀出段選擇子和esp;

使用選擇子讀取棧描述符,檢查特權級,型別等;

臨時儲存舊棧(當前棧)ss,esp;

將(1)中獨處的新棧選擇子、段指標代入ss和esp,切換到新棧;

將(3)儲存的舊棧ss,esp壓入新棧(儲存現場);

根據呼叫門描述符"引數個數",從舊棧中讀出並壓入新棧;

壓入cs,eip(儲存現場,通過呼叫門一定是far遠轉移,壓cs);

從呼叫門描述符中讀出段選擇子,段內偏移==>cs:eip,開始執行被呼叫過程;

新棧切換完情況:

2.控制返回過程

返回對比

同一特權級

棧不變,棧中彈出呼叫者**段選擇子和指令指標

特權級變化的(遠)返回

只能返回到低特權級

返回全部過程:

檢查棧中cs內容,根據其rpl(cs的rpl即cpl)決定返回時是否需要改變特權級;

針對**段描述符和選擇子rpl進行特權級檢查;

若遠返回指令帶引數,esp+引數==>跳過引數==>esp指向呼叫者ss,esp(被呼叫者棧段中)

ret(f) imm16:運算元為16位立即數,指示返回之前,應從棧中彈出多少位元組資料;

若返回改變特權級,將呼叫者ss,esp值代入ss,esp暫存器中,切換到呼叫者棧

若遠返回帶引數,esp+引數==>跳過引數以平衡棧段(呼叫者棧段中);(示例部分有平衡棧段講解)

若返回改變特權級,檢查ds,es,fs,gs找到對應描述符:

若有任一dpl《呼叫者cpl(即當前cpl),cpu將0傳到該暫存器;

注意點:

tss中ss,esp,cpu不會主動更新;

(8)中cpu傳0的原因:

特權級檢查只發生在將選擇子代入段暫存器的時候,之後在訪問該段是不會再檢查的;

若cpl=3應用通過呼叫門呼叫系統例程,cpl==>0,在該例程中,os訪問dpl=0的棧,進行了特權級檢查,若之後選擇子不改則訪問該段不再進行檢查;若控制權返回時,系統例程沒有恢復暫存器原本的選擇子,則cpl=3呼叫者可以直接訪問dpl=0的棧==>(8);

引導過程與服務控制 服務控制及切換執行級別(五)

systemctl 控制型別 服務名稱 start 啟動 stop 停止 retart 重新啟動 status 檢視服務狀態 systemctl is enabled 服務名稱 systenctl enable disable 服務名稱 0 關機。不能將系統預設執行級別設定為0,否則無法啟動。1 單...

虛擬控制台的切換過程

1.虛擬終端的切換在控制台軟中斷中執行,當按 alt f1 時,鍵盤中斷設定變數want console為0,然後激發控制台軟中斷 console softint 如果請求的控制台存在並且不等於當前控制台,這時呼叫change console want console 切換控制台。2.當前控制台就是...

儲存過程返回記錄集總數,及輸出。

在查詢分析器中執行建立儲存過程 create procedure recordcount strwhere nvarchar 500 count int output as declare sqlstr nvarchar 1000 if strwhere set sqlstr n select co...