內核態(Kernel Mode)與用戶態(User Mode)
知識
11-27
內核態: CPU可以訪問內存所有數據, 包括外圍設備, 例如硬碟, 網卡. CPU也可以將自己從一個程序切換到另一個程序
用戶態:只能受限的訪問內存, 且不允許訪問外圍設備. 佔用CPU的能力被剝奪, CPU資源可以被其他程序獲取
為什麼要有用戶態和內核態
由於需要限制不同的程序之間的訪問能力, 防止他們獲取別的程序的內存數據, 或者獲取外圍設備的數據, 並發送到網路, CPU劃分出兩個許可權等級 -- 用戶態 和 內核態
用戶態與內核態的切換
所有用戶程序都是運行在用戶態的, 但是有時候程序確實需要做一些內核態的事情, 例如從硬碟讀取數據, 或者從鍵盤獲取輸入等. 而唯一可以做這些事情的就是操作系統, 所以此時程序就需要向操作系統請求以程序的名義來執行這些操作.
這時需要一個這樣的機制: 用戶態程序切換到內核態, 但是不能控制在內核態中執行的指令
這種機制叫系統調用, 在CPU中的實現稱之為陷阱指令(Trap Instruction)
他們的工作流程如下:
- 用戶態程序將一些數據值放在寄存器中, 或者使用參數創建一個堆棧(stack frame), 以此表明需要操作系統提供的服務.
- 用戶態程序執行陷阱指令
- CPU切換到內核態, 並跳到位於內存指定位置的指令, 這些指令是操作系統的一部分, 他們具有內存保護, 不可被用戶態程序訪問
- 這些指令稱之為陷阱(trap)或者系統調用處理器(system call handler). 他們會讀取程序放入內存的數據參數, 並執行程序請求的服務
- 系統調用完成後, 操作系統會重置CPU為用戶態並返回系統調用的結果
![](https://pic.pimg.tw/zzuyanan/1488615166-1259157397.png)
![](https://pic.pimg.tw/zzuyanan/1482887990-2595557020.jpg)
TAG:程序員小新人學習 |