基本概念
- 用戶態和內核態是操作系統的兩種運行級別,兩者最大的區別就是特權級不同
- 用戶態擁有最低的特權級,內核態具有較高的特權級
- 運行在用戶態的程序不能直接訪問操作系統內核結構和數據
- 操作系統數據都是存放於系統空間的,用戶態進程的數據是存放在用戶空間的,分開來存放就是為了讓系統的數據和用戶的數據互不干擾,保證系統的穩定性,分開存放,管理上比較方便,並且對於兩部分數據的訪問就可以進行控制,避免用戶態程序惡意修改操作系統的數據和結構
為什么需要有用戶態和內核態
由於需要限制不同程序之間的訪問能力,防止它們獲取別的程序的內存數據,或者獲取外圍設備的數據並發送到網絡。某些程序和安全性不高,如果執行了這些CPU的某些指令,會導致系統崩潰,如:設置時鍾、清理內存、調整網絡等
當我們在系統中運行一個程序時,大部分時間是運行在用戶態下的,在其需要操作系統幫助完成某些它沒有權力完成的工作時就會切換到內核態
特權級
在Unix/Linux系統中,fork的工作實際上是以系統調用的方式完成相應功能的,具體的工作是由sys_fork負責實施,其實對任何操作系統來說,創建一個新的進程都是屬於核心功能,因為它要做很多底層細致地工作,消耗系統的物理資源,比如分配物理內存,從父進程拷貝相關信息,拷貝設置頁目錄頁表等等,這些顯然不能隨便讓哪個程序就能去做,於是引出特權級的概念。對於最關鍵性的權力必須由搞特權的程序來執行,這樣才能做到集中管理,減少有限資源的訪問和使用沖突。
兩種狀態的轉換方式
- 系統調用
- 用戶進程主動要求切換到內核態的一種方式,用戶進程通過系統調用申請操作系統提供的服務程序完成工作
- 異常
- 當CPU在執行運行在用戶態的程序時,發現了某些事情不可知的異常,這是會觸發由當前運行進程切換到處理此異常的內核相關程序中,也就到了內核態,比如缺頁異常
- 外圍設備中斷
- 當外圍設備完成用戶請求的操作之后,會像CPU發出相應的中斷信號,這時CPU會暫停執行下一條將要執行的指令,轉而去執行中斷信號的處理程序
- 比如硬盤讀寫操作完成,系統會切換到硬盤讀寫的中斷處理程序中執行后續操作等
這三種方式是系統運行時由用戶態轉到內核態的最主要方式,其中系統調用可以認為是用戶進程主動發起的,異常和外圍設備中斷則是被動的
用戶態和內核態之間可以通過指針傳遞數據嗎
-
用戶態不能訪問內核態的指針
- 為了實現內存的保護,防止越界訪問而造成受保護內存被非法修改,甚至造成系統的崩潰,這種直接傳遞數據指針來傳遞數據的方式,被禁止
-
內核態可以訪問用戶態的指針(有前提)
- 必須保證用戶態虛擬空間的指針(虛擬內存地址)已經分配給物理地址,否則指針傳入內核態中將會引發缺頁異常而報錯
-
內核中訪問用戶進程的地址使用copy_from_user,而不是memcopy直接拷貝(使用用戶態指針)
- copy_from_user函數主要提供了以下功能
- 對用戶進程傳過來的地址范圍進行合法性檢查
- 對用戶傳來的地址沒有分配物理地址時,定義了缺頁處理后的異常發生地址,保證程序順序執行
- 對於用戶進程訪問虛擬地址,如果還未分配物理地址,就會觸發內核缺頁異常,接着內核會負責分配物理地址,並修改映射頁表,這個過程對於用戶進程時是完全透明的,但是在內核空間發生缺頁時,必須進行顯示進行處理,否則會導致內核出現錯誤
- 但是直接使用memcopy時並沒有報錯
只有用戶傳來的空間地址沒有分配對應的物理地址時才會進行修復,如果用戶進程之前已經 使用過這段空間,代表已經分配了物理地址,自然不會引發缺頁異常
- copy_from_user函數主要提供了以下功能
參考鏈接
https://blog.csdn.net/ddna/article/details/4941373
https://github.com/twomonkeyclub/BackEnd/tree/master/計算機基礎知識/操作系統#用戶態和內核態
