這篇文章主要講解了“什么是用戶態與內核態”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“什么是用戶態與內核態”吧!
站在用戶的角度思考問題,與客戶深入溝通,找到邗江網站設計與邗江網站推廣的解決方案,憑借多年的經驗,讓設計與互聯網技術結合,創造個性化、用戶體驗好的作品,建站類型包括:做網站、成都做網站、企業官網、英文網站、手機端網站、網站推廣、域名申請、雅安服務器托管、企業郵箱。業務覆蓋邗江地區。
張三是某科技公司的初級Java開發工程師(低權限),目前在15樓辦公碼代碼,公司提供的資源僅有一套電腦(用戶態),張三想著這一線的房價,倍感壓力山大,于是給自己定下一個目標,一定要做技術總監,在一線扎根, 奮斗B張三,奮斗5年終于當上了技術總監(高權限),之后張三搬到30樓,可以隨時向資源部(系統調用)申請公司各種資源與獲取公司的機密信息(內核態),所謂是走上人生巔峰。
通過這個故事,我們發現,低權限的資源范圍較小,高權限的資源范圍更大,所謂的「用戶態與內核態只是不同權限的資源范圍」。
在說用戶態與內核態之前,有必要說一下 C P U 指令集
,指令集是 C P U 實現軟件指揮硬件執行的媒介,具體來說每一條匯編語句都對應了一條 C P U 指令
,而非常非常多的 C P U 指令
在一起,可以組成一個、甚至多個集合,指令的集合叫 C P U 指令集
。
同時 C P U 指令集
有權限分級,大家試想,C P U 指令集
可以直接操作硬件的,要是因為指令操作的不規范`,造成的錯誤會影響整個計算機系統的。好比你寫程序,因為對硬件操作不熟悉,導致操作系統內核、及其他所有正在運行的程序,都可能會因為操作失誤而受到不可挽回的錯誤,最后只能重啟計算機才行。
而對于硬件的操作是非常復雜的,參數眾多,出問題的幾率相當大,必須謹慎的進行操作,對開發人員來說是個艱巨的任務,還會增加負擔,同時開發人員在這方面也不被信任,所以操作系統內核直接屏蔽開發人員對硬件操作的可能,都不讓你碰到這些 C P U 指令集
。
高情商
ring 0被叫做內核態,完全在操作系統內核中運行
ring 3被叫做用戶態,在應用程序中運行
低情商
執行內核空間的代碼,具有ring 0保護級別,有對硬件的所有操作權限,可以執行所有C P U 指令集
,訪問任意地址的內存,在內核模式下的任何異常都是災難性的,將會導致整臺機器停機
在用戶模式下,具有ring 3保護級別,代碼沒有對硬件的直接控制權限,也不能直接訪問地址的內存,程序是通過調用系統接口(System Call APIs)來達到訪問硬件和內存,在這種保護模式下,即時程序發生崩潰也是可以恢復的,在電腦上大部分程序都是在,用戶模式下運行的
通關了C P U 指令集權限,現在再說用戶態與內核態就十分簡單了,用戶態與內核態的概念就是C P U 指令集權限的區別,進程中要讀寫 I O
,必然會用到 ring 0 級別的 C P U 指令集
,而此時 C P U 的指令集操作權限只有 ring 3,為了可以操作ring 0 級別的 C P U 指令集
, C P U 切換指令集操作權限級別為 ring 0,C P U再執行相應的ring 0 級別的 C P U 指令集
(內核代碼),執行的內核代碼會使用當前進程的內核棧。
PS:每個進程都有兩個棧,分別是用戶棧與內核棧,對應用戶態與內核態的使用
在內存資源上的使用,操作系統對用戶態與內核態也做了限制,每個進程創建都會分配「虛擬空間地址」(不懂可以參考我的另一篇文章“15分鐘!一文幫小白搞懂操作系統之內存”),以Linux32位操作系統為例,它的尋址空間范圍是 4G
(2的32次方),而操作系統會把虛擬控制地址劃分為兩部分,一部分為內核空間,另一部分為用戶空間,高位的 1G
(從虛擬地址 0xC0000000 到 0xFFFFFFFF)由內核使用,而低位的 3G
(從虛擬地址 0x00000000 到 0xBFFFFFFF)由各個進程使用。
從上圖我們可以看出來通過系統調用將Linux整個體系分為用戶態和內核態,為了使應用程序訪問到內核的資源,如CPU、內存、I/O,內核必須提供一組通用的訪問接口,這些接口就叫系統調用。
庫函數就是屏蔽這些復雜的底層實現細節,減輕程序員的負擔,從而更加關注上層的邏輯實現,它對系統調用進行封裝,提供簡單的基本接口給程序員。
Shell顧名思義,就是外殼的意思,就好像把內核包裹起來的外殼,它是一種特殊的應用程序,俗稱命令行。Shell也是可編程的,它有標準的Shell 語法,符合其語法的文本叫Shell腳本,很多人都會用Shell腳本實現一些常用的功能,可以提高工作效率。
最后來說說,什么情況會導致用戶態到內核態切換
系統調用:用戶態進程主動切換到內核態的方式,用戶態進程通過系統調用向操作系統申請資源完成工作,例如 fork()就是一個創建新進程的系統調用,系統調用的機制核心使用了操作系統為用戶特別開放的一個中斷來實現,如Linux 的 int 80h 中斷,也可以稱為軟中斷
異常:當 C P U 在執行用戶態的進程時,發生了一些沒有預知的異常,這時當前運行進程會切換到處理此異常的內核相關進程中,也就是切換到了內核態,如缺頁異常
中斷:當 C P U 在執行用戶態的進程時,外圍設備完成用戶請求的操作后,會向 C P U 發出相應的中斷信號,這時 C P U 會暫停執行下一條即將要執行的指令,轉到與中斷信號對應的處理程序去執行,也就是切換到了內核態。如硬盤讀寫操作完成,系統會切換到硬盤讀寫的中斷處理程序中執行后邊的操作等。
感謝各位的閱讀,以上就是“什么是用戶態與內核態”的內容了,經過本文的學習后,相信大家對什么是用戶態與內核態這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創新互聯,小編將為大家推送更多相關知識點的文章,歡迎關注!
網頁名稱:什么是用戶態與內核態
文章網址:http://vcdvsql.cn/article0/podpio.html
成都網站建設公司_創新互聯,為您提供虛擬主機、網站設計公司、網站收錄、面包屑導航、網站建設、App設計
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯