我們知道,中斷在發生時,處理器根據收到的中斷向量號在中斷描述符表中找到相應的中斷門描述符。
處理器從該描述符中載入目標**段選擇子到**段暫存器 cs 及偏移量到指令指標暫存器 eip。
注意,由於 cs 載入了新的目標**段選擇子,處理器只要發現段暫存器被載入,段描述符緩衝暫存器就會被重新整理,因為處理器認為是換了乙個段,屬於段間轉移,也就是遠轉移。
所以,當前程序被中斷打斷後,為了從中斷返回後能繼續執行該程序,處理器自動把 cs 和 eip 的當前值儲存到中斷處理程式使用的棧中。
除了要儲存 cs、 eip 外,還需要儲存標誌暫存器 eflags,
因為中斷是可以在任何特權級別下發生的,不同特權級別下處理器使用不同的棧,如果涉及到特權級變化,還要壓入 ss 和 esp 暫存器。
那麼我們就來看看到底中斷的時候是如何來壓棧的吧~
1。當中斷發生時,低特權級向高特權級轉化時的壓棧現象
當處理器根據中斷向量號找到中斷描述符後,根據中斷描述符中的段描述符選擇子+gdtr的值,我們可以找到目標段描述符。
我們是否能訪問這個目標段描述符,要做的就是將找到中斷描述符時當前的cpl與目標段描述符的dpl進行對比。
這裡我們討論的是cpl特權級比dpl低的情況,即數值上cpl > dpl.
這表示我們要往高特權級棧上轉移,也意味著我們最後需要恢復舊棧,所以
(1) 處理器先臨時儲存一下舊棧的ss和esp(ss是堆疊段暫存器,因為換了乙個棧,所以其也要變,esp相當於在棧上的索引),然後載入新的特權級和dpl相同的段,將其載入到ss和esp中,然後將之前儲存的舊棧的ss和esp壓到新棧中
由於ss堆段暫存器是16位暫存器,所以為了對齊,將其0拓展後壓棧。
然後在新棧中壓入eflags標誌暫存器,得到圖如下:
2.因為是要切換棧,屬於段間轉移,所以我們還要將舊棧ss和eip備份,以便中斷程式執行後還可以恢復到被中斷的程序。因為cs**段暫存器也是16位暫存器,所以也要在壓入棧前進行0擴充套件,此時如下圖
3.某些異常會有錯誤碼,此錯誤碼用於報告異常是在哪個段上發生的,也就是異常發生的位置,所以錯誤碼中包含選擇子等資訊。錯誤碼會緊跟在 eip 之**棧,記作 error code
2。當中斷發生時,無特權級轉化時的壓棧現象
此時由於不會切換棧,就不用儲存ss和esp,但是由於在處理完中斷程式後還是要返回源程式中繼續執行的,所以,我們的cs eip暫存器還是要儲存的。
這種中斷返 回是用 iret 指令實現的。 iret,即 interrupt ret。注意在返回的時候,其錯誤碼不會自動跳過,所以需要我們手動跳過。
好了,我們的壓棧過程就到此講完了,下面我們來了解一下,中斷程式返回即出棧的過程,假設此時esp已經跳過錯誤碼指向eip_old
當處理器執行到 iret指令時,它首先需要從棧中返回cs_old 及eip_old,由於處理器在中斷返回的時候,並不記得自己來的時候也曾經做過特權級檢查,所以這時候它還要再進行特權級檢查。
特權級檢查如下:
(1)將cs_old對應的**段的dpl及cs_old中的rpl做特權級檢查, 如果檢查通過,隨即需要更新暫存器cs和eip
由於cs_old在入棧時已經將高16位擴充為 0,現在是 32 位資料,段暫存器 cs 是 16 位,故處理器丟棄 cs_old 高 16 位,將低16 位載入到 cs.
將 eip_old載入到 eip 暫存器,之後棧指標指向 eflags。
如果進入中斷時未涉及特權級轉移,此時棧指標是 esp_old (說明在之前進入中斷後,是繼續使用舊棧)。否則棧指標是 esp_new (說明在之前進入中斷後用的是 tss 中記錄的新棧)。
(2)將棧中儲存的eflags 彈出到標誌暫存器 eflags。如果在第 1 步中判斷返回後要改變特權級, 此時棧指標是 esp_new,它指向棧中的 esp_old。否則進入中斷時屬於平級轉移,用的是舊棧,此時棧指標是 esp_old,棧中已無因此次中斷發生而入棧的資料,棧指標指向中斷發生前的棧頂。
(3)如果在第 1 步中判斷出返回時需要改變特權級,也就是說需要恢復舊棧,此時便需要將 esp_old 和 ss_old 分別載入到暫存器 esp 及 ss,丟棄暫存器 ss 和 esp 中原有的 ss_new 和 esp_new,同時進行特權級檢查。
至此,處理器回到了被中斷的那個程序。
由實模式進入保護模式來進行32位定址
因為cpu在實模式下位址匯流排為20位,所以能訪問到的內存在1m左右,為了能操作更多的記憶體,cpu生產商設計了保護模式,在此模式下匯流排位址可達32位,訪問記憶體明顯增加。用保護模式來32位定址的操作要用乙個叫gdt的東西,這個gdt global descriptor table 叫全域性描述表...
32位保護模式學習小結 3 任務切換
協同式 從乙個任務切換到另乙個任務,需要當前任務主動地請求暫時放棄執行權,或者在通過呼叫門請求作業系統服務時,由作業系統 趁機 將控制轉移到另乙個任務.這種方式依賴於每個任務的 自律 性,當乙個任務失控時,其他任務可能得不到執行的機會.搶占式 這種方式下,可以安裝乙個定時器中斷,並在中斷服務程式中實...
32位保護模式學習小結 3 任務切換
協同式 從乙個任務切換到另乙個任務,需要當前任務主動地請求暫時放棄執行權,或者在通過呼叫門請求作業系統服務時,由作業系統 趁機 將控制轉移到另乙個任務.這種方式依賴於每個任務的 自律 性,當乙個任務失控時,其他任務可能得不到執行的機會.搶占式 這種方式下,可以安裝乙個定時器中斷,並在中斷服務程式中實...