此圖選自《linux核心完全注釋》
由上圖可以看出,當特權級沒有轉換時,中斷處理程式和被中斷程序是同用乙個堆疊,但是當發生了堆疊切換,例如一般中斷程序都處於0特權級下,當3的特權級程序執行時,中斷發生,那麼處理器就要到tss處找到0級的ss和esp,然後切換堆疊,然後處理器把被中斷程序的ss,esp,eflags,cs,eip,壓棧,如果有錯誤碼的話,錯誤碼將最後被壓棧(iretd指令並不會自動彈出錯誤碼。。。)
這裡要特別注意的是,由指令產生的中斷(int)是要進行特權級檢查的,這意味著只有程序的cpl<=門的dpl才能訪問中斷門,所以上述的從3特權級跳到0級的中斷門只能是在硬體引發中斷的情況下才會發生,因為處理器是不會對硬體引發的中斷進行特權級檢查(此處可以參考《linux核心完全注釋》)
特權級之間的轉換
特權級之間的轉換包括 段之間的轉換和資料段之間的轉換。對於資料段之間的轉換,只檢查選擇子中rpl和段中dpl的值,如果rpl dpl則可以轉換,而對於 段之間的轉換,情況會稍微複雜。段之間特權級的轉換主要通過jmp和call指令實現,jmp和call的運算元可以直接是選擇子,但注意在用call時,要...
作業系統中的特權級檢查
這裡涉及到的幾個概念 dpl rpl cpl dpl 存在於段描述符中,描述訪問此段的最低特權級,即訪問此段的程序cpl和rpl必須大於等於此段的dpl rpl 存在於段選擇符中的最低兩位,成為請求特權級即程序的請求許可權,這個可以由程式設計師自己設定但是其功能受到cpl的制約 cpl 存在於cs和...
關於中斷的buttom half 二
tasklets tasklets建立在軟中斷上的一種機制,它是一種軟中斷,但又與軟中斷不同,它有自己的特點 可以動態建立和銷毀。在執行時,多次進行排程,此時也只能執行一次,並且排程時總是會讓其在同一處理器上執行,如此可以很好的利用cache。像程序一樣,tasklet也由乙個結構體來表示 stru...