1. 程式人生 > >核心態(核心空間)和使用者態(使用者空間)的區別和聯絡

核心態(核心空間)和使用者態(使用者空間)的區別和聯絡

使用者空間就是使用者程序所在的記憶體區域,相對的,系統空間就是作業系統佔據的記憶體區域。使用者程序和系統程序的所有資料都在記憶體中。   是誰來劃分記憶體空間的呢?在電腦開機之前,記憶體就是一塊原始的實體記憶體。什麼也沒有。開機加電,系統啟動後,就對實體記憶體進行了劃分。當然,這是系統的規定,實體記憶體條上並沒有劃分好的地址和空間範圍。這些劃分都是作業系統在邏輯上的劃分。不同版本的作業系統劃分的結果都是不一樣的。   為什麼要劃分使用者空間和系統空間呢?當然是有必要的。作業系統的資料都是存放於系統空間的,使用者程序的資料是存放於使用者空間的。這是第一點,不同的身份,資料放置的位置必然不一樣,否則大混戰就會導致系統的資料和使用者的資料混在一起,系統就不能很好的運行了。分開來存放,就讓系統的資料和使用者的資料互不干擾,保證系統的穩定性。分開存放,管理上很方便,而更重要的是,將使用者的資料和系統的資料隔離開,就可以對兩部分的資料的訪問進行控制。這樣就可以確保使用者程式不能隨便作業系統的資料,這樣防止使用者程式誤操作或者是惡意破壞系統。

處於使用者態的程式只能訪問使用者空間,而處於核心態的程式可以訪問使用者空間和核心空間。那麼使用者態和核心態有什麼區別呢?

當一個任務(程序)執行系統呼叫而陷入核心程式碼中執行時,我們就稱程序處於核心執行態(或簡稱為核心態)。此時處理器處於特權級最高的(0級)核心程式碼中執行。當程序處於核心態時,執行的核心程式碼會使用當前程序的核心棧。每個程序都有自己的核心棧。當程序在執行使用者自己的程式碼時,則稱其處於使用者執行態(使用者態)。即此時處理器在特權級最低的(3級)使用者程式碼中執行。

核心態與使用者態是作業系統的兩種執行級別,Intel x86架構提供Ring0-Ring3四種級別的執行模式,Ring0級別最高,Ring3最低。Linux使用了Ring3級別執行使用者態,Ring0作為 核心態,沒有使用Ring1和Ring2。Ring3狀態不能訪問Ring0的地址空間,包括程式碼和資料。程式特權級別的不同,其所擁有的權力也不同。如下圖所示

使用者態切換到核心態的3種方式

a. 系統呼叫

這是使用者態程序主動要求切換到核心態的一種方式,使用者態程序通過系統呼叫申請使用作業系統提供的服務程式完成工作,比如fork()實際上就是執行了一個建立新程序的系統呼叫。而系統呼叫的機制其核心還是使用了作業系統為使用者特別開放的一箇中斷來實現,例如Linux的int 80h中斷。

b. 異常

當CPU在執行執行在使用者態下的程式時,發生了某些事先不可知的異常,這時會觸發由當前執行程序切換到處理此異常的核心相關程式中,也就轉到了核心態,比如缺頁異常。

c. 外圍裝置的中斷

當外圍裝置完成使用者請求的操作後,會向CPU發出相應的中斷訊號,這時CPU會暫停執行下一條即將要執行的指令轉而去執行與中斷訊號對應的處理程式,如果先前執行的指令是使用者態下的程式,那麼這個轉換的過程自然也就發生了由使用者態到核心態的切換。比如硬碟讀寫操作完成,系統會切換到硬碟讀寫的中斷處理程式中執行後續操作等。

這3種方式是系統在執行時由使用者態轉到核心態的最主要方式,其中系統呼叫可以認為是使用者程序主動發起的,異常和外圍裝置中斷則是被動的。