天天看點

任務核心态與使用者态堆棧之間的切換

        如果一個中斷産生時任務正在使用者代碼中執行,那麼該中斷會引起CPU特權級從3到0的變化,此時CPU就會運作使用者态堆棧到核心态堆棧的切換操作。CPU會從目前任務的任務狀态段TSS中取得新堆棧的段選擇符和偏移量。因為中斷服務程式在核心中,屬于0級特權級代碼,是以48位的核心态堆棧指針會從TSS的ss0和esp0字段中獲得。在定位了新堆棧(核心态堆棧)之後,CPU就會首先把原使用者态堆棧指針ss和esp壓入核心态堆棧,随後把标志積存器eflags的内容和傳回位置cs,eip壓入核心态堆棧。

        核心的系統調用是一個軟體中斷,是以任務調用系統調用時就會進入核心并執行核心中的中斷服務代碼。此時核心代碼就會使用該任務的核心态堆棧進行操作。同樣,當進入核心程式時,由于特權級别發生了改變,使用者态堆棧的堆棧段和堆棧指針以及eflags會被儲存在任務的核心态堆棧中。而在執行iret退出核心程式傳回到使用者程式時,将恢複使用者态的堆棧和eflags。

        如果一個任務正在核心态中運作,那麼若CPU響應中斷就不再需要進行堆棧切換操作。因為此時該任務運作的核心代碼已經在使用核心态堆棧,并且不涉及到優先級别的變化,是以CPU僅把eflags和中斷傳回指針cs,eip壓入目前核心态堆棧,然後執行中斷服務過程。

繼續閱讀