Linux 核心態和使用者態

2021-08-31 09:57:47 字數 3324 閱讀 4866

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

2.使用者態:當程序在執行使用者自己的**時,則稱其處於使用者執行態(使用者態)。即此時處理器在特權級最低的(3級)使用者**中執行。當正在執行使用者程式而突然被中斷程式中斷時,此時使用者程式也可以象徵性地稱為處於程序的核心態。因為中斷處理程式將使用當前程序的核心棧。這與處於核心態的程序的狀態有些類似。

簡單來講乙個程序由於執行系統呼叫而開始執行核心**,我們稱該程序處於核心態中.例如:呼叫read( ),write( ),open( )等系統函式就是系統呼叫。

乙個程序執行應用程式自身**則稱該程序處於使用者態.

1. intel x86 架構的 cpu 分為好幾個執行級別,從 0--3 , 0 為最高端別, 3 為最低級別

2. 針對不同的級別,有很多的限制,比如說傳統的 in ,out 指令,就是埠的輸入輸出指令,在 0 級下是可以用的,但在 3 級下就不能用,你用就產生陷阱,告訴你出錯了,當然限制還有很多了,不只是這一點。

3. 作業系統下是利用這個特點,當作業系統自己的**執行時, cpu 就切成 0 級,當使用者的程式執行是就只讓它在 3 級執行,這樣如果使用者的程式想做什麼破壞系統的事情的話,也沒辦法做到

4. 當然,低階別的程式是沒法把自己公升到高階別的,也就是說 使用者程式執行在 3 級,他想把自己變成 0 級自己是做不到的,除非是作業系統幫忙,利用這個特性,作業系統就可以控制所有的程式的執行,確保系統的安全了. 平時把作業系統執行時的級別就叫核心態(因為是作業系統核心執行時的狀態),而且普通使用者程式執行時的那個級別叫使用者態...

5. 當作業系統剛引導時, cpu 處於實模式,這時就相當於是 0 級,於是作業系統就自動得到最高許可權,然後切到保護模式時就是0級,這時作業系統就佔了先機,成為了最高端別的執行者,由於你的程式都是由作業系統來載入的,所以當它把你載入上來後,就把你的執行狀態設為 3 級,即最低階,然後才讓你執行,所以沒辦法,你只能在最低階執行了,因為沒辦法把自己從低階上公升到高階, 這就是作業系統在核心態可以管理使用者程式,殺死使用者程式的原因。

6.執行級別:

熟悉unix/linux系統的人都知道,fork的工作實際上是以系統呼叫的方式完成相應功能的,具體的工作是由sys_fork負責實施。其實無論是不是unix或者linux,對於任何作業系統來說,建立乙個新的程序都是屬於核心功能,因為它要做很多底層細緻地工作,消耗系統的物理資源,比如分配物理記憶體,從父程序拷貝相關資訊,拷貝設定頁目錄頁表等等,這些顯然不能隨便讓哪個程式就能去做,於是就自然引出特權級別的概念,顯然,最關鍵性的權力必須由高特權級的程式來執行,這樣才可以做到集中管理,減少有限資源的訪問和使用衝突。

核心態與使用者態是作業系統的兩種執行級別,intel x86架構提供ring0-ring3四種級別的執行模式,ring0級別最高,ring3最低。linux使用了ring3級別執行使用者態,ring0作為 核心態,沒有使用ring1和ring2。ring3狀態不能訪問ring0的位址空間,包括**和資料。程式特權級別的不同,其所擁有的權力也不同。

1.現在我們也可以這樣理解核心態和使用者態的:

2.使用者態和核心態的區別:

雖然使用者態下和核心態下工作的程式有很多差別,但最重要的差別就在於特權級的不同,即權力的不同。執行在使用者態下的程式不能直接訪問作業系統核心資料結構和程式,比如上面例子中的testfork()就不能直接呼叫sys_fork(),因為前者是工作在使用者態,屬於使用者態程式,而sys_fork()是工作在核心態,屬於核心態程式。

當我們在系統中執行乙個程式時,大部分時間是執行在使用者態下的,在其需要作業系統幫助完成某些它沒有權力和能力完成的工作時就會切換到核心態,比如testfork()最初執行在使用者態程序下,當它呼叫fork()最終觸發sys_fork()的執行時,就切換到了核心態。

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

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

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

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

使用者空間就是使用者程序所在的記憶體區域,相對的,系統空間就是作業系統佔據的記憶體區域。使用者程序和系統程序的所有資料都在記憶體中。

1.  是誰來劃分記憶體空間的呢?

在電腦開機之前,記憶體就是一塊原始的物理記憶體。什麼也沒有。開機加電,系統啟動後,就對物理記憶體進行了劃分。當然,這是系統的規定,物理記憶體條上並沒有劃分好的位址和空間範圍。這些劃分都是作業系統在邏輯上的劃分。不同版本的作業系統劃分的結果都是不一樣的。

2.為什麼要劃分使用者空間和系統空間呢?

當然是有必要的。作業系統的資料都是存放於系統空間的,使用者程序的資料是存放於使用者空間的。這是第一點,不同的身份,資料放置的位置必然不一樣,否則大混戰就會導致系統的資料和使用者的資料混在一起,系統就不能很好的執行了。分開來存放,就讓系統的資料和使用者的資料互不干擾,保證系統的穩定性。分開存放,管理上很方便,而更重要的是,將使用者的資料和系統的資料隔離開,就可以對兩部分的資料的訪問進行控制。這樣就可以確保使用者程式不能隨便作業系統的資料,這樣防止使用者程式誤操作或者是惡意破壞系統。

Linux使用者態和核心態

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

Linux 使用者態和核心態

系統呼叫是通向作業系統本身的介面,是面向底層硬體的。通過系統呼叫,可以使得使用者態執行的程序與硬體裝置 如cpu 磁碟 印表機等 進行互動,是作業系統留給應用程式的乙個介面。由作業系統實現 執行時,需要從使用者態切換到核心態 使用者態 當乙個程序在執行使用者自己的 時處於使用者執行態 使用者態 此時...

linux核心態使用者態

概述 linux系統使用者態和核心態相關知識,linux核心版本為3.10.79。使用者態和核心態定義 核心態 cpu可以訪問記憶體所有資源,包括外圍裝置.可以進行處理器工作模式切換,程式的切換。使用者態 只能受限的訪問記憶體,且不允許訪問外圍裝置,不可以進行處理器模式切換。為什麼分使用者態和核心態...