內核態和用戶態

核心態和用戶態是操做系統兩種運行級別。安全

核心態就是擁有資源較多的狀態,或者說訪問資源多的狀態,也稱之爲特權態;相對來講,用戶態就是非特權態,訪問資源將受到限制。spa

核心態下CPU可執行任何指令,而用戶態下CPU只能執行非特權指令。當CPU處於核心態時可隨意進入用戶態;而處於用戶態時,切換到核心態只有在系統調用和中斷時才能發生。通常程序一開始都是運行與用戶態,當程序須要系統資源時,就必須經過中斷進入核心態。操作系統

1)用戶態切換到內核態的3種方式指針

a. 系統調用進程

這是用戶態進程主動要求切換到內核態的一種方式,用戶態進程經過系統調用申請使用操做系統提供的服務程序完成工做,好比fork()實際上就是執行了一個建立新進程的系統調用。而系統調用的機制其核心仍是使用了操做系統爲用戶特別開放的一箇中斷來實現,例如Linux的int 80h中斷。資源

b. 異常效率

當CPU在執行運行在用戶態下的程序時,發生了某些事先不可知的異常,這時會觸發由當前運行進程切換處處理此異常的內核相關程序中,也就轉到了內核態,好比缺頁異常。請求

c. 外圍設備的中斷程序

當外圍設備完成用戶請求的操做後,會向CPU發出相應的中斷信號,這時CPU會暫停執行下一條即將要執行的指令轉而去執行與中斷信號對應的處理程序,若是先前執行的指令是用戶態下的程序,那麼這個轉換的過程天然也就發生了由用戶態到內核態的切換。好比硬盤讀寫操做完成,系統會切換到硬盤讀寫的中斷處理程序中執行後續操做等。異常

這3種方式是系統在運行時由用戶態轉到內核態的最主要方式,其中系統調用能夠認爲是用戶進程主動發起的,異常和外圍設備中斷則是被動的。

 

核心態和用戶態各有優點:運行在覈心態的程序可訪問的資源多,但可靠性、安全性要求高,維護管理比較複雜。一個程序運行在哪取決於其對資源和效率的需求。

 

用戶棧和內核棧

內核在建立進程的時候,會爲進程建立相對於的堆棧。每一個進程有兩個棧,一個用戶棧,存在於用戶空間;一個內核棧,存在於內核空間。當進程運行在用戶態時,CPU堆棧指針寄存器裏的內容是用戶堆棧地址,使用用戶棧;在覈心態時,同理。

當進程由於中斷或系統調用而進入內核態時,進程所使用的堆棧也要有用戶棧轉到內核棧。進程陷入內核態後,先把用戶堆棧的地址保存到內核棧之中,而後設置堆棧指針寄存器的內容爲內核棧的地址;當恢復到用戶態時,把內核棧中保存的用戶棧的地址恢復到堆棧指針寄存器便可。

進程從用戶態轉到內核態時,進程的內核棧老是空的,因此進程陷入內核的時候,直接把棧頂地址給堆棧指針寄存器便可。

相關文章
相關標籤/搜索