核心态和使用者态的差別
當一個任務(程序)執行系統調用而陷入核心代碼中執行時,我們就稱程序處于核心狀态。此時處理器處于特權級
最高的(0級)核心代碼。當程序處于核心态時,執行的核心代碼會使用目前的核心棧。每個程序都有自己的核心
棧。當程序在執行使用者自己的代碼時,則稱其處于使用者态。即此時處理器在特權級最低的使用者代碼中運作。當正
在執行使用者程式而突然中斷時,此時使用者程式也可以象征性地處于程序的核心态。因為中斷處理程式将使用目前
程序的核心态。
核心态與使用者态是作業系統的兩種運作級别,跟intel cpu沒有必然聯系,intel cpu提供Ring0-Ring3三種級别
運作模式,Ring0級别最高,Ring3級别最低。Linux使用了Ring3級别運作使用者态。Ring0作為核心态,沒有使用
Ring1和Ring2.Ring3不能通路Ring0的位址空間,包括代碼和數量。Linux程序的4GB空間,3G-4G部分大家是共享
的,是核心态的位址空間,這裡存放在整個核心代碼和所有的核心子產品,以及核心所維護的資料。使用者運作一程
序,該程式所建立的程序開始是運作在使用者态的,如果要執行檔案操作,網絡資料發送等操作,必須通過write,
send等系統調用,這些系統會調用核心中的代碼來完成操作,這時,必須切換到Ring0,然後進入3GB-4GB中的
核心位址空間去執行這些代碼完成操作,完成後,切換Ring3,回到使用者态。這樣,使用者态的程式就不能随意操
作1核心位址空間,具有一定的安全保護作用。
使用者态和核心态的轉換
(1)使用者态切換到核心态的3種方式
a.系統調用
這是使用者程序主動要求切換到核心态的一種方式,使用者程序通過系統調用申請作業系統提供的服務程式完成工作。
而系統調用的機制其核心還是使用了作業系統為使用者特别開放的一個中斷來實作,例如Linux的ine 80h中斷。
b.異常
當CPU在執行運作在使用者态的程式時,發現了某些事件不可知的異常,這是會觸發由目前運作程序切換到處理此
異常的核心相關程式中,也就到了核心态,比如缺頁異常。
c.外圍裝置的中斷
當外圍裝置完成使用者請求的操作之後,會向CPU發出相應的中斷信号,這時CPU會暫停執行下一條将要執行的指令
轉而去執行中斷信号的處理程式,如果先執行的指令是使用者态下的程式,那麼這個轉換的過程自然也就發生了有
使用者态到核心态的切換。比如硬碟讀寫操作完成,系統會切換到硬碟讀寫的中斷處理程式中執行後續操作等。
具體的切換操作
從出發方式看,可以在認為存在前述3種不同的類型,但是從最終實際完成由使用者态到核心态的切換操作上來說,
涉及的關鍵步驟是完全一樣的,沒有任何差別,都相當于執行了一個中斷響應的過程,因為系統調用實際上最
終是中斷機制實作的,而異常和中斷處理機制基本上是一樣的,使用者态切換到核心态的步驟主要包括:
(1)從目前程序的描述符中提取其核心棧的ss0及esp0資訊。
(2)使用ss0和esp0指向的核心棧将目前程序的cs,eip,eflags,ss,esp資訊儲存起來,這個過程也完成了由用
戶棧找到核心棧的切換過程,同時儲存了被暫停執行的程式的下一條指令。
(3)将先前由中斷向量檢索得到的中斷處理程式的cs,eip資訊裝入相應的寄存器,開始執行中斷處理程式,這
時就轉到了核心态的程式執行了。