中斷發生時使用者堆疊和核心堆疊的切換

2021-05-22 01:00:21 字數 561 閱讀 5709

如果乙個中斷產生時任務正在使用者**中執行,那麼該中斷會引起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壓入當前核心態堆疊,然後執行中斷服務過程。

任務核心態堆疊與使用者態堆疊之間的切換

在linux 0.12系統中,所有中斷服務程式都屬於核心 如果乙個中斷產生時任務正在使用者 中執行,那麼該中斷就會引起cpu特權級從3級到0級的變化,此時cpu就會進行使用者態堆疊到核心態堆疊的切換操作。cpu會從當前任務的任務狀態段tss中取得新堆疊的段選擇 在linux 0.12系統中,所有中斷...

堆 棧和堆疊的區別

堆 heap 堆是一種經過排序的樹形資料結構,每個結點都有乙個值。棧 stack 它是一種具有後進先出性質的資料結構,也就是說後存放的先取,先存放的後取。ps 頗有砌牆的磚 後來者居上的趕腳。1,申請方式 heap 程式設計師自己申請,並指明大小。stack 由系統分配。2,申請效率 原為 heap...

Cotex M核心雙堆疊指標MSP和PSP

msp和psp 的含義是main stack pointer 和process stack pointer,在邏輯位址上他們都是r13 這意味著同乙個邏輯位址,實際上有兩個物理暫存器,乙個為msp,乙個為psp,在不同的工作模式呼叫不同的物理暫存器。cortex m3核心有兩個堆疊指標 msp 主堆...