核心態與使用者態

2021-08-20 16:23:00 字數 2487 閱讀 2752

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

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

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

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

使用者態和

核心態。

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

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

這種機制叫系統呼叫, 在cpu中的實現稱之為陷阱指令(trap instruction)

他們的工作流程如下:

使用者態程式將一些資料值放在暫存器中, 或者使用引數建立乙個堆疊(stack frame), 以此表明需要作業系統提供的服務.

使用者態程式執行陷阱指令

cpu切換到核心態, 並跳到位於記憶體指定位置的指令, 這些指令是作業系統的一部分, 他們具有記憶體保護, 不可被使用者態程式訪問

這些指令稱之為陷阱(trap)或者系統呼叫處理器(system call handler). 他們會讀取程式放入記憶體的資料引數, 並執行程式請求的服務

系統呼叫完成後, 作業系統會重置cpu為使用者態並返回系統呼叫的結果

1.使用者態和核心態的區別

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

特權級顯然是非常有效的管理和控制程式執行的手段,因此在硬體上對特權級做了很多支援,就intel x86架構的cpu來說一共有0~3四個特權級,0級最高,3級最低,硬體上在執行每條指令時都會對指令所具有的特權級做相應的檢查。雖然使用者態下和核心態下工作的程式有很多差別,但最重要的差別就在於特權級的不同,即權力的不同。執行在使用者態下的程式不能直接訪問作業系統核心資料結構和程式。

當我們在系統中執行乙個程式時,大部分時間是執行在使用者態下的,在其需要作業系統幫助完成某些它沒有權力和能力完成的工作時就會切換到核心態。

2.使用者態切換到核心態的三種方式

a. 系統呼叫

這是使用者態程序主動要求切換到核心態的一種方式,使用者態程序通過系統呼叫申請使用作業系統提供的服務程式完成工作,而系統呼叫的機制其核心還是使用了作業系統為使用者特別開放的乙個中斷來實現,例如linux的int 80h中斷。

b. 異常

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

c. 外圍裝置的中斷

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

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

3.使用者棧和核心棧的區別

a. 當程序執行在核心態時,

cpu堆疊指標暫存器指向的是核心堆疊位址,使用的是核心堆疊。

當程序執行在使用者態時。

cpu堆疊指標暫存器指向的是使用者堆疊位址,使用的是使用者堆疊。

當程序由於中斷進入核心態時,系統會把一些使用者態的資料資訊儲存到核心棧中,當返回到使用者態時,取出核心棧中得資訊恢復出來,返回到程式原來執行的地方。

使用者棧就是程序在使用者空間時建立的棧,比如一般的函式呼叫,將會用到使用者棧。

b. 核心棧是屬於作業系統空間的一塊固定區域,可以用於儲存中斷現場、儲存作業系統子程式間相互呼叫的引數、返回值等。

使用者棧是屬於使用者程序空間的一塊區域,使用者儲存使用者程序子程式間的相互呼叫的引數、返回值等。

c. 每個windows 都有4g的程序空間,系統棧使用程序空間的低端部分,使用者棧是高階部分。如果使用者要直接訪問系統棧部分,需要有特殊的方式。

4.程序使用者棧和核心棧之間的切換

當程序由於中斷或系統呼叫從使用者態轉換到核心態時,程序所使用的棧也要從使用者棧切換到核心棧。系統呼叫實質就是通過指令產生中斷,稱為軟中斷。程序因為中斷(軟中斷或硬體產生中斷),使得cpu切換到特權工作模式,此時程序陷入核心態,程序進入核心態後,首先把使用者態的堆疊位址儲存在核心堆疊中,然後設定堆疊指標暫存器的位址為核心棧位址,這樣就完成了使用者棧向核心棧的切換。

當程序從核心態切換到使用者態時,最後把儲存在核心棧中的使用者棧位址恢復到cpu棧指標暫存器即可,這樣就完成了核心棧向使用者棧的切換。

核心態與使用者態

核心態與使用者態是作業系統的兩種執行級別,intel cpu提供ring0 ring3三種級別的執行模式。ring0級別最高,ring3最低。其中特權級0 ring0 是留給作業系統 裝置驅動程式 使用的,它們工作於系統核心態 而特權極3 ring3 則給普通的使用者程式使用,它們工作在使用者態。執...

核心態與使用者態

一 unix linux的體系架構 如上圖所示,從巨集觀上來看,linux作業系統的體系架構分為使用者態和核心態 或者使用者空間和核心 核心從本質上看是一種軟體 控制計算機的硬體資源,並提供上層應用程式執行的環境。使用者態即上層應用程式的活動空間,應用程式的執行必須依託於核心提供的資源,包括cpu資...

核心態與使用者態

linux的設計哲學之一就是 對不同的操作賦予不同的執行等級,就是所謂特權的概念,即與系統相關的一些特別關鍵的操作必須由最高特權的程式來完成。intel的x86架構的cpu提供了0到3四個特權級,數字越小,特權越高,linux作業系統中主要採用了0和3兩個特權級,分別對應的就是核心態 kernel ...