用戶態與內核態的切換與區別

內核態和用戶態的區別
當一個任務(進程)執行系統調用而陷入內核代碼中執行時,我們就稱進程處於內核狀態。此時處理器處於特權級
最高的(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信息裝入相應的寄存器,開始執行中斷處理程序,這
時就轉到了內核態的程序執行了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章