1. 程式人生 > >使用者態與核心態的切換與區別

使用者態與核心態的切換與區別

核心態和使用者態的區別
當一個任務(程序)執行系統呼叫而陷入核心程式碼中執行時,我們就稱程序處於核心狀態。此時處理器處於特權級
最高的(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資訊裝入相應的暫存器,開始執行中斷處理程式,這
時就轉到了核心態的程式執行了。