內核態(Kernel Mode):運行操做系統程序,操做硬件數據結構
用戶態(User Mode):運行用戶程序函數
特權指令:只能由操做系統使用、用戶程序不能使用的指令。 舉例:啓動I/O 內存清零 修改程序狀態字 設置時鐘 容許/禁止終端 停機spa
非特權指令:用戶程序可使用的指令。 舉例:控制轉移 算數運算 取數指令 訪管指令(使用戶程序從用戶態陷入內核態)操作系統
特權環:R0、R一、R2和R3對象
R0至關於內核態,R3至關於用戶態;進程
不一樣級別可以運行不一樣的指令集合;內存
**用戶態--->內核態:**惟一途徑是經過中斷、異常、陷入機制(訪管指令)終端
**內核態--->用戶態:**設置程序狀態字PSW硬件
內核態與用戶態是操做系統的兩種運行級別,當程序運行在3級特權級上時,就能夠稱之爲運行在用戶態。由於這是最低特權級,是普通的用戶進程運行的特權級,大部分用戶直接面對的程序都是運行在用戶態;請求
當程序運行在0級特權級上時,就能夠稱之爲運行在內核態。
運行在用戶態下的程序不能直接訪問操做系統內核數據結構和程序。當咱們在系統中執行一個程序時,大部分時間是運行在用戶態下的,在其須要操做系統幫助完成某些它沒有權力和能力完成的工做時就會切換到內核態(好比操做硬件)。
這兩種狀態的主要差異是
- 處於用戶態執行時,進程所能訪問的內存空間和對象受到限制,其所處於佔有的處理器是可被搶佔的
- 處於內核態執行時,則能訪問全部的內存空間和對象,且所佔有的處理器是不容許被搶佔的。
這是用戶態進程主動要求切換到內核態的一種方式,**用戶態進程經過系統調用申請使用操做系統提供的服務程序完成工做。**好比前例中fork()實際上就是執行了一個建立新進程的系統調用。
而系統調用的機制其核心仍是使用了操做系統爲用戶特別開放的一箇中斷來實現,例如Linux的int 80h中斷。
用戶程序一般調用庫函數,由庫函數再調用系統調用,所以有的庫函數會使用戶程序進入內核態(只要庫函數中某處調用了系統調用),有的則不會。
當CPU在執行運行在用戶態下的程序時,發生了某些事先不可知的異常,這時會觸發由當前運行進程切換處處理此異常的內核相關程序中,也就轉到了內核態,好比缺頁異常。
當外圍設備完成用戶請求的操做後,會向CPU發出相應的中斷信號,這時CPU會暫停執行下一條即將要執行的指令轉而去執行與中斷信號對應的處理程序,
若是先前執行的指令是用戶態下的程序,那麼這個轉換的過程天然也就發生了由用戶態到內核態的切換。好比硬盤讀寫操做完成,系統會切換到硬盤讀寫的中斷處理程序中執行後續操做等。
這3種方式是系統在運行時由用戶態轉到內核態的最主要方式,其中系統調用能夠認爲是用戶進程主動發起的,異常和外圍設備中斷則是被動的。