使用者態和核心態

路途中的人2012發表於2017-08-01

核心態和使用者態

我們開發的服務程式碼,都是基於作業系統抽象提供的功能介面,進而操作相應的硬體資源。而硬體資源對於安全性要求非常高,所以對於安全性和系統穩定性而言,需要劃定不同的應用程式執行級別。

Intel對於CPU的許可權劃分了四個等級0 ~ 3,linux採用了其中的0和2這兩個等級。執行在0級別的程式時作業系統的核心程式,執行在2級別的程式是使用者程式。我們平時寫的程式都是使用者程式。

以32位作業系統而言,他可以對映的記憶體大小為4G,作業系統啟動時,會佔用前1G的記憶體作為核心態的記憶體,在做CPU、硬碟的讀寫時,不能給使用者態的應用程式直接操作的許可權,在正常的使用者態操作時,不需要切換。

我們實際執行的程式碼(java、go寫成的web服務、純後端服務),依託於jvm,實際都執行在作業系統之上,整個呼叫鏈為:java服務(編譯後是二進位制檔案) -> (jvm)-> (linux作業系統)-> (硬體介面)。

面試題:講解一下核心態和使用者態

總體概述:

作業系統為了保護安全硬體資源而定義的兩種執行級別,兩種級別擁有的許可權不同。
不同程式需要有劃分行的訪問能力,防止他們可以獲取別的程式的記憶體資料,呼叫網路介面,執行CPU指令導致系統崩潰。
我們的執行一個程式時,大部門時間都是執行在使用者態下的,在需要作業系統幫忙某些沒有權利完成的工作(c語言的malloc()、net.read())時就需要切換到核心態。

兩種狀態的轉換

  • 系統呼叫:使用者程式主動要求切換到核心態的一種方式,使用者程式透過systmem call申請作業系統提供的服務程式完成工作
  • 異常:當CPU仔執行執行的使用者態的程式時,發生了一些不可知的異常,切換到對應處理異常的核心程式
  • 外圍裝置中斷:
    • 硬碟讀寫操作完成,系統會切換到硬碟讀寫的中斷處理陳谷種執行後續操作。

總結

級別 執行地址 級別 執行內容
使用者態 較低的 3G 位元組(從虛擬地址 0x00000000 到 0xBFFFFFFF),供各個程式使用,稱為使用者空間 3級 可以執行的操作和可以訪問的資源都會受到很多限制
核心態 最高的 1G 位元組(從虛擬地址 0xC0000000 到 0xFFFFFFFF),供核心使用,稱為核心空間 0級 執行在核心態的程式可以執行任何操作並且在資源的使用上沒有限制

連結

相關文章