中斷髮生時使用者堆疊和核心堆疊的切換
阿新 • • 發佈:2018-12-27
如果一箇中斷產生時任務正在使用者程式碼中執行,那麼該中斷會引起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壓入當前核心態堆疊,然後執行中斷服務過程。
核心的系統呼叫是一個軟體中斷,因此任務呼叫系統呼叫時就會進入核心並執行核心中的中斷服務程式碼。此時核心程式碼就會使用該任務的核心態堆疊進行操作。同樣,當進入核心程式時,由於特權級別發生了改變,使用者態堆疊的堆疊段和堆疊指標以及eflags會被儲存在任務的核心態堆疊中。而在執行iret退出核心程式返回到使用者程式時,將恢復使用者態的堆疊和eflags。
如果一個任務正在核心態中執行,那麼若CPU響應中斷就不再需要進行堆疊切換操作。因為此時該任務執行的核心程式碼已經在使用核心態堆疊,並且不涉及到優先級別的變化,所以CPU僅把eflags和中斷返回指標cs,eip壓入當前核心態堆疊,然後執行中斷服務過程。