什么是用戶態和內核態
Kernel 運行在超級權限模式(Supervisor Mode)下,所以擁有很高的權限。按照權限管理的原則,多數應用程序應該運行在最小權限下。因此,很多操作系統,將內存分成了兩個區域:
內核空間(Kernal Space),這個空間只有內核程序可以訪問;
用戶空間(User Space),這部分內存專門給應用程序使用。
用戶態和內核態
用戶空間中的代碼被限制了只能使用一個局部的內存空間,我們說這些程序在用戶態(User Mode) 執行。內核空間中的代碼可以訪問所有內存,我們稱這些程序在內核態(Kernal Mode) 執行。
系統調用過程
如果用戶態程序需要執行系統調用,就需要切換到內核態執行。下面我們來講講這個過程的原理。
如上圖所示:內核程序執行在內核態(Kernal Mode),用戶程序執行在用戶態(User Mode)。當發生系統調用時,用戶態的程序發起系統調用。因為系統調用中牽扯特權指令,用戶態程序權限不足,因此會中斷執行,也就是 Trap(Trap 是一種中斷)。
發生中斷后,當前 CPU 執行的程序會中斷,跳轉到中斷處理程序。內核程序開始執行,也就是開始處理系統調用。內核處理完成后,主動觸發 Trap,這樣會再次發生中斷,切換回用戶態工作。
CPU在執行指令的時候又沒辦法區分這條指令是應用程序的還是操作系統的,它只是一個沒有感情的執行機器,只會悶頭執行···
為了解決這個問題,x86 CPU搞了個特權級出來,或者說是CPU提供了四個工作模式,從Ring0-Ring3,每一個模式又稱為一個環,一共四個環。0環是最高權限模式,可以執行所有指令。Ring3是最低權限模式,只能執行指令集中的一部分指令。
也就是說,CPU搞了四個工作模式出來,只有工作在Ring0模式下,才能執行上面的那些特權指令,在其他模式下如果要去執行那些指令,CPU就會拋出異常!
有了CPU的這一硬件技術支持,問題就好辦了,我們可以讓CPU在執行操作系統代碼的時候運行在Ring0模式,在執行普通應用程序代碼的時候運行在Ring3模式,這樣就解決了特權指令的問題。
內核地址空間
那個問題來了:CPU如何知道現在執行的代碼是不是操作系統的呢?
把操作系統的代碼放在內存中一個特殊的區域,當CPU執行的指令地址來自這個區域時,就切換工作模式到Ring0【工作模式保存在CPU的狀態寄存器】,離開這個區域后,就切換到其他模式。
光這樣還不夠,還得加一個措施:這個區域不能讓應用程序來訪問,否則誰都能來讀寫,那還了得?
所以,除了指令增加特權級以外,在內存的訪問上,也得加上特權級。
這個特殊的區域就是內核地址空間!一般位於進程地址空間中較高的區域,以32位下Windows為例,它是在0x80000000~0xFFFFFFFF這個區域。我們把位於這個空間中的代碼叫做操作系統的內核代碼,有時候也簡稱內核。而把應用程序代碼所活動的區域叫做用戶地址空間。
進一步,我們常把CPU執行內核代碼的模式稱為內核態,把執行用戶程序時的模式稱為用戶態。
https://mp.weixin.qq.com/s/0epXchOU0Q-2jzETY_aMJQ
https://kaiwu.lagou.com/course/courseInfo.htm?courseId=478#/detail/pc?id=4621