01 請你說一說用戶態和內核態區別
- 爲了區分不同的程序的不同權限,人們發明了
內核態
和用戶態
的概念。 - 用戶態和內核態是操作系統的兩種運行級別,兩者最大的區別就是特權級不同。用戶態擁有最低的特權級,內核態擁有較高的特權級。 運行在用戶態的程序不能直接訪問操作系統內核數據結構和程序。
- 內核態和用戶態之間的轉換方式主要包括:系統調用,異常和中斷。
02 操作系統爲什麼要分內核態和用戶態
- 爲了安全性。在cpu的一些指令中,有的指令如果用錯,將會導致整個系統崩潰。分了內核態和用戶態後,當用戶需要操作這些指令時候,內核爲其提供了API,可以通過系統調用陷入內核,讓內核去執行這些操作。
03 內核態和用戶態
內核態
就是擁有資源多的狀態,或者說訪問資源多的狀態,稱爲特權態
。用戶態
就是非特權態
,在此種狀態下訪問的資源將受到限制。- 如果一個程序運行在特權態,則該程序就可以訪問計算機的任何資源,即它的資源訪問不受限制。如果一個程序運行在用戶態,則其資源需求將受到各種限制。由於內核態的程序可以訪問計算機的所有資源,因此這種程序的可靠性和安全性就顯得十分重要。
內核態
和用戶態
各有優勢:
運行在內核態的程序可以訪問的資源多,但可靠性、安全性要求高,維護管理都較複雜;用戶態程序程序訪問的資源有限,但可靠性、安全性要求低,自然編寫維護起來比較簡單。一個程序到底應該運行在內核態還是用戶態則取決於其對資源和效率的需求。- 一般來說,如果一個程序能夠運行於用戶態,就應該讓它運行在用戶態。只在迫不得已的情況下,才讓程序運行於內核態。凡是牽扯到計算機本體根本運行的事情都應該在內核態下執行,只與用戶數據和應用相關的東西則放在用戶態執行。另外,對時序要求特別高的操作,也應該在內核態完成。
- 那麼什麼樣的功能應該在內核態下實現呢?
首先,CPU的管理和內存管理都應該在內核態實現。這些功能可不可以在用戶態下實現呢?當然能,但是不太安全。從保障計算機安全的角度來說,CPU和內存的管理必須在內核態實現。 - 診斷與測試程序也需要在內核態下實現。因爲診斷和測試需要訪問計算機的所有資源,否則怎麼判斷計算機是否正常呢?
輸入輸出管理也一樣,因爲要訪問各種設備和底層數據結構,所以也必須在內核態實現。 - 對於文件系統來說,則可以一部分放在用戶態,一部分放在內核態。文件系統本身的管理,即文件系統的宏數據部分的管理必須放在內核態,否則任何人都可能破壞文件系統的結構;用戶數據的管理則可以放在用戶態。編譯器、網絡管理的部分功能、編輯器、用戶程序等,自然都可以放在用戶態下執行。
- 輸入輸出管理也一樣,因爲要訪問各種設備和底層數據結構,所以也必須在內核態實現。對於文件系統來說,則可以一部分放在用戶態,一部分放在內核態。文件系統本身的管理,即文件系統的宏數據部分的管理必須放在內核態,否則任何人都可能破壞文件系統的結構;用戶數據的管理則可以放在用戶態。編譯器、網絡管理的部分功能、編輯器、用戶程序等,自然都可以放在用戶態下執行。
態勢的識別
那麼計算機是如何知道現在正在運轉的程序是內核態程序呢?
- 顯然做出這種判斷需要某種標誌。這個標誌就是處理器的一個狀態位。這個狀態位是CPU狀態字裏面的一個字位。也就是說,所謂的用戶態、內核態實際上是處理器的一種狀態,而不是程序的狀態。我們通過設置該狀態字,可以將CPU設置爲內核態、用戶態或者其他的子態(有的CPU有更多種子態)。一個程序運行時,CPU是什麼態,這個程序就運行在什麼態。
內核態與用戶態的實現: 內核態是
特權態,而用戶態是普通態。
- 特權態下運行的程序可以訪問任何資源,而用戶態下的訪問則受到限制。
- 要限制一個程序對資源的訪問,需要對程序執行的每一條指令進行檢查才能完成。而這種檢查就是
地址翻譯
。程序發出的每一條指令都要經過這個地址翻譯過程。而通過對翻譯的控制,就可以限制程序對資源的訪問。 - 爲了賦予內核態程序訪問所有資源的權限,當系統處於內核態時,內核程序可以繞過內存地址翻譯而直接執行特權指令。
04 用戶態到內核態的轉化原理
1)用戶態切換到內核態的3種方式
1、系統調用
- 這是用戶進程主動要求切換到內核態的一種方式,用戶進程通過系統調用申請操作系統提供的服務程序完成工作。而系統調用的機制其核心還是使用了操作系統爲用戶特別開放的一箇中斷來實現,例如Linux的ine 80h中斷。
2、異常
- 當CPU在執行運行在用戶態的程序時,發現了某些事件不可知的異常,這是會觸發由當前運行進程切換到處理此。異常的內核相關程序中,也就到了內核態,比如缺頁異常。
3、外圍設備的中斷
- 當外圍設備完成用戶請求的操作之後,會向CPU發出相應的中斷信號,這時CPU會暫停執行下一條將要執行的指令,轉而去執行中斷信號的處理程序,如果先執行的指令是用戶態下的程序,那麼這個轉換的過程自然也就發生了有用戶態到內核態的切換。比如硬盤讀寫操作完成,系統會切換到硬盤讀寫的中斷處理程序中執行後續操作等。
2)切換操作
- 從出發方式看,可以在認爲存在前述3種不同的類型,但是從最終實際完成由用戶態到內核態的切換操作上來說,涉及的關鍵步驟是完全一樣的,沒有任何區別,都相當於執行了一箇中斷響應的過程,因爲系統調用實際上最終是中斷機制實現的,而異常和中斷處理機制基本上是一樣的,用戶態切換到內核態的步驟主要包括:
1、從當前進程的描述符中提取其內核棧的ss0及esp0信息。
2、使用ss0和esp0指向的內核棧將當前進程的cs,eip,eflags,ss,esp信息保存起來,這個過程也完成了由用戶棧找到內核棧的切換過程,同時保存了被暫停執行的程序的下一條指令。
3、將先前由中斷向量檢索得到的中斷處理程序的cs,eip信息裝入相應的寄存器,開始執行中斷處理程序,這時就轉到了內核態的程序執行了。