1. 程式人生 > >核心態(Kernel Mode)與使用者態(User Mode)

核心態(Kernel Mode)與使用者態(User Mode)

核心態: CPU可以訪問記憶體所有資料, 包括外圍裝置, 例如硬碟, 網絡卡. CPU也可以將自己從一個程式切換到另一個程式

使用者態: 只能受限的訪問記憶體, 且不允許訪問外圍裝置. 佔用CPU的能力被剝奪, CPU資源可以被其他程式獲取

為什麼要有使用者態和核心態

由於需要限制不同的程式之間的訪問能力, 防止他們獲取別的程式的記憶體資料, 或者獲取外圍裝置的資料, 併發送到網路, CPU劃分出兩個許可權等級 -- 使用者態 和 核心態

使用者態與核心態的切換

所有使用者程式都是執行在使用者態的, 但是有時候程式確實需要做一些核心態的事情, 例如從硬碟讀取資料, 或者從鍵盤獲取輸入等. 而唯一可以做這些事情的就是作業系統, 所以此時程式就需要向作業系統請求以程式的名義來執行這些操作.

這時需要一個這樣的機制: 使用者態程式切換到核心態, 但是不能控制在核心態中執行的指令

這種機制叫系統呼叫, 在CPU中的實現稱之為陷阱指令(Trap Instruction)

他們的工作流程如下:

  1. 使用者態程式將一些資料值放在暫存器中, 或者使用引數建立一個堆疊(stack frame), 以此表明需要作業系統提供的服務.
  2. 使用者態程式執行陷阱指令
  3. CPU切換到核心態, 並跳到位於記憶體指定位置的指令, 這些指令是作業系統的一部分, 他們具有記憶體保護, 不可被使用者態程式訪問
  4. 這些指令稱之為陷阱(trap)或者系統呼叫處理器(system call handler). 他們會讀取程式放入記憶體的資料引數, 並執行程式請求的服務
  5. 系統呼叫完成後, 作業系統會重置CPU為使用者態並返回系統呼叫的結果