核心態與使用者態

2021-05-18 11:22:27 字數 2609 閱讀 3137

核心態與使用者態是作業系統的兩種執行級別,intel cpu提供ring0-ring3三種級別的執行模式。ring0級別最高,ring3最低。其中特權級0(ring0)是留給作業系統**,裝置驅動程式**使用的,它們工作於系統核心態;而特權極3(ring3)則給普通的使用者程式使用,它們工作在使用者態。執行於處理器核心態的**不受任何的限制,可以自由地訪問任何有效位址,進行直接埠訪問。而執行於使用者態的**則要受到處理器的諸多檢查,它們只能訪問對映其位址空間的頁表項中規定的在使用者態下可訪問頁面的虛擬位址,且只能對任務狀態段(tss)中i/o許可位圖(i/o permission bitmap)中規定的可訪問埠進行直接訪問(此時處理器狀態和控制標誌暫存器eflags中的iopl通常為0,指明當前可以進行直接i/o的最低特權級別是ring0)。以上的討論只限於保護模式作業系統,象dos這種模式作業系統則沒有這些概念,其中的所有**都可被看作執行在核心態。

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

在核心態下cpu可執行任何指令,在使用者態下cpu只能執行非特權指令。當cpu處於核心態,可以隨意進入使用者態;而當cpu處於使用者態時,使用者從使用者態切換到核心態只有在系統呼叫和中斷兩種情況下發生,一般程式一開始都是執行於使用者態,當程式需要使用系統資源時,就必須通過呼叫軟中斷進入核心態。

linux使用了ring3級別執行使用者態,ring0作為核心態,沒有使用ring1和ring2。ring3狀態不能訪問ring0的位址空間,包括**和資料。linux程序的4gb位址空間,3g-4g部分大家是共享的,是核心態的位址空間,這裡存放在整個核心的**和所有的核心模組,以及核心所維護的資料。使用者執行乙個程式,該程式所建立的程序開始是執行在使用者態的,如果要執行檔案操作,網路資料傳送等操作,必須通過 write,send等系統呼叫,這些系統呼叫會呼叫核心中的**來完成操作,這時,必須切換到ring0,然後進入3gb-4gb中的核心位址空間去執行這些**完成操作,完成後,切換回ring3,回到使用者態。這樣,使用者態的程式就不能隨意操作核心位址空間,具有一定的安全保護作用。

處理器模式從ring3向ring0的切換發生在控制權轉移時,有以下兩種情況:訪問呼叫門的長轉移指令call,訪問中斷門或陷阱門的int指令。具體的轉移細節由於涉及複雜的保護檢查和堆疊切換,不再贅述,請參閱相關資料。現代的作業系統通常使用中斷門來提供系統服務,通過執行一條陷入指令來完成模式切換,在intel x86上這條指令是int,如在win9x下是int30(保護模式**),在linux下是int80,在winnt/2000下是int2e。使用者模式的服務程式(如系統dll)通過執行乙個intxx來請求系統服務,然後處理器模式將切換到核心態,工作於核心態的相應的系統**將服務於此次請求並將結果傳給使用者程式。

一,中斷處理過程

硬體中斷:來自時鐘,外設

可程式設計中斷:programmed interrupt,執行引起軟體中斷的指令。

例外中斷:如頁面錯。

都由系統負責處理。當發生乙個中斷時,如果cpu正在比該中斷級低的處理機執行級上執行,它就在解碼下條指令之前,接受該中斷,並提高處理機執行級。核心處理中斷的操作順序如下:

1,對於正在進行的程序,儲存其當前暫存器上下文,並建立壓入乙個新的上下文層。

2,確定中斷源,識別中斷型別。如是時鐘或磁碟的。

3,查詢中斷向量。當系統接受乙個中斷時,它從機器中得到乙個數,系統把這個作為查表的偏移量。這個表通常成為中斷向量(interrupt vector)。中斷向量的內容包括各種中斷源的中斷處理程式的位址,以及中斷處理程式取得引數的方式。

4,核心呼叫中斷處理程式。

5,中斷處理程式執行那個返回,恢復(彈出)前一上下文層。

二,軟中斷

軟中斷通知程序發生了非同步事件。

系統有個程序表,每個程序在程序表中有有個程序表項,每個程序表項有個軟中斷訊號字段,紀錄發向乙個程序的所有未處理的軟中斷訊號。

當乙個程序即將從核心態返回到使用者態時,或它要進入或離開乙個適當的低排程優先順序時,核心要檢查它是否收到了乙個軟中斷訊號。

核心僅當乙個程序從核心態返回到使用者態時才處理軟中斷訊號。

三,系統呼叫

我們在c程式中呼叫系統呼叫好像是個一般的函式呼叫,當實際上呼叫系統呼叫會引起使用者態到核心態的狀態變化,這是怎麼做到的呢?

原來,c編譯程式採用乙個預定義的函式庫(c之程式庫),其中的函式具有系統呼叫的名字,從而解決了在使用者程式中請求系統呼叫的問題。這些庫函式一般都執行一條指令,該指令將程序的執行方式變為核心態,然後,使核心開始為系統呼叫執行**。我們稱這個指令為作業系統陷入(operating system trap)。

系統呼叫的介面是乙個中斷處理程式的特例。

在處理作業系統陷入時,

1,核心根據系統呼叫號查系統呼叫入口表,找到相應的核心子程式的位址。

2,核心還要確定該系統呼叫所要求的引數個數。

3,從使用者位址空間拷貝引數到u區(unix v)。

4,儲存當前上下文,執行系統呼叫**。

核心態:當cpu正在執行核心**時(核心**是共享的)。

使用者態:當cpu正在執行使用者**時。

使用者模式:不可以訪問核心空間(>=0x80000000)

核心態與使用者態

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

核心態與使用者態

核心態 cpu可以訪問記憶體的所有資料,包括外圍裝置,例如硬碟,網絡卡,cpu也可以將自己從乙個程式切換到另乙個程式。使用者態 只能受限的訪問記憶體,且不允許訪問外圍裝置,占用cpu的能力被剝奪,cpu資源可以被其他程式獲取。為什麼要有使用者態和核心態?由於需要限制不同的程式之間的訪問能力,防止他們...

核心態與使用者態

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