操作系统:用户态和核心态的区别
1.操作系統需要兩種CPU狀態:
內核態(Kernel Mode):運行操作系統程序
用戶態(User Mode):運行用戶程序
2.指令劃分:
特權指令:只能由操作系統使用、用戶程序不能使用的指令。??舉例:啟動I/O???內存清零??修改程序狀態字??設置時鐘???允許/禁止終端???停機
非特權指令:用戶程序可以使用的指令。??舉例:控制轉移??算數運算??取數指令???訪管指令(使用戶程序從用戶態陷入內核態)
3.特權級別:
特權環:R0、R1、R2和R3
R0相當于內核態,R3相當于用戶態;
不同級別能夠運行不同的指令集合;
?
4.CPU狀態之間的轉換:
用戶態--->內核態:唯一途徑是通過中斷、異常、陷入機制(訪管指令)
內核態--->用戶態:設置程序狀態字PSW
?
?
5.內核態與用戶態的區別:
首先要有特權級別的概念;特權級別用特權環形象表示,R0是內核態,R3是用戶態。
1)內核態與用戶態是操作系統的兩種運行級別,當程序運行在3級特權級上時,就可以稱之為運行在用戶態。因為這是最低特權級,是普通的用戶進程運行的特權級,大部分用戶直接面對的程序都是運行在用戶態;
2)當程序運行在0級特權級上時,就可以稱之為運行在內核態。
3)運行在用戶態下的程序不能直接訪問操作系統內核數據結構和程序。當我們在系統中執行一個程序時,大部分時間是運行在用戶態下的,在其需要操作系統幫助完成某些它沒有權力和能力完成的工作時,就進行系統調用從而陷入內核,由操作系統代為完成。
4)這兩種狀態的主要差別是:
處于用戶態執行時,進程所能訪問的內存空間和對象受到限制,其所處于占有的處理機是可被搶占的;
而處于核心態執行中的進程,則能訪問所有的內存空間和對象,且所占有的處理機是不允許被搶占的。
?
6. 通常來說,以下三種情況會導致用戶態到內核態的切換:
中斷
1)系統調用
這是用戶態進程主動要求切換到內核態的一種方式,用戶態進程通過系統調用申請使用操作系統提供的服務程序完成工作。比如前例中fork()實際上就是執行了一個創建新進程的系統調用。
而系統調用的機制其核心還是使用了操作系統為用戶特別開放的一個中斷來實現,例如Linux的int 80h中斷。
大概是??? 當用戶程序調用系統的API時,就產生中斷,進入內核態的API,處理完成后,用中斷再退出,返回用戶態的調用函數。???
?? user??? api??? -->??? interrupt??? -->??? kernel??? api??? -->??? interrupt
2)異常
當CPU在執行運行在用戶態下的程序時,發生了某些事先不可知的異常,這時會觸發由當前運行進程切換到處理此異常的內核相關程序中,也就轉到了內核態,比如缺頁異常。
3)外圍設備的中斷
當外圍設備完成用戶請求的操作后,會向CPU發出相應的中斷信號,這時CPU會暫停執行下一條即將要執行的指令轉而去執行與中斷信號對應的處理程序,
如果先前執行的指令是用戶態下的程序,那么這個轉換的過程自然也就發生了由用戶態到內核態的切換。比如硬盤讀寫操作完成,系統會切換到硬盤讀寫的中斷處理程序中執行后續操作等。
這3種方式是系統在運行時由用戶態轉到內核態的最主要方式,其中系統調用可以認為是用戶進程主動發起的,異常和外圍設備中斷則是被動的。
2)具體的切換操作
從觸發方式上看,可以認為存在前述3種不同的類型,但是從最終實際完成由用戶態到內核態的切換操作上來說,涉及的關鍵步驟是完全一致的,沒有任何區別,都相當于執行了一個中斷響應的過程,因為系統調用實際上最終是中斷機制實現的,而異常和中斷的處理機制基本上也是一致的,關于它們的具體區別這里不再贅述。關于中斷處理機制的細節和步驟這里也不做過多分析,涉及到由用戶態切換到內核態的步驟主要包括:
[1] 從當前進程的描述符中提取其內核棧的ss0及esp0信息。
[2] 使用ss0和esp0指向的內核棧將當前進程的cs,eip,eflags,ss,esp信息保存起來,這個
過程也完成了由用戶棧到內核棧的切換過程,同時保存了被暫停執行的程序的下一
條指令。
[3] 將先前由中斷向量檢索得到的中斷處理程序的cs,eip信息裝入相應的寄存器,開始
執行中斷處理程序,這時就轉到了內核態的程序執行了。
?
總結
以上是生活随笔為你收集整理的操作系统:用户态和核心态的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 操作系统:进程间通信与线程间同步
- 下一篇: 图:BFS/DFS java实现