Linux 核心空間與使用者空間實現與分析

2022-10-06 19:54:16 字數 2534 閱讀 5018

本文以 32 位系統為例介紹核心空間(kernel space)和使用者空間(user space)。

核心空間和使用者空間

對 32 位作業系統而言,它的定址空間(虛擬位址空間,或叫線性位址空間)為 4g(2的32次方)。也就是說乙個程序的最大位址空間為 4g。作業系統的核心是核心(kernel),它獨立於普通的應用程式,可以訪問受保護的記憶體空間,也有訪問底層硬體裝置的所有許可權。為了保證核心的安全,現在的作業系統一般都強制使用者程序不能直接操作核心。具體的實現方式基本都是由作業系統將虛擬位址空間劃分為兩部分,一部分為核心空間,另一部分為使用者空間。針對 linux 作業系統而言,最高的 1g 位元組(從虛擬位址 0xc0000000 到 0xffffffff)由核心使用,稱為核心空間。而較低的 3g 位元組(從虛擬位址 0x00000000 到 0xbfffffff)由各個程序使用,稱為使用者空間。

對上面這段內容我們可以這樣理解:

每個程序的 4g 位址空間中,最高 1g 都是一樣的,即核心空間。只有剩餘的 3g 才歸程序自己使用。

換句話說就是, 最高 1g 的核心空間是被所有程序共享的!

下圖描述了每個程序 4g 位址空間的分配情況(此圖來自網際網路):

為什麼需要區分核心空間與使用者空間

在 cpu 的所有指令中,有些指令是非常危險的,如果錯用,將導致系統崩潰,比如清記憶體、設定sgtzeq時鐘等。如果允許所有的程式都可以使用這些指令,那麼系統崩潰的概率將大大增加。

所以,cpu 將指令分為特權指令和非特權指令,對於那些危險的指令,只允許作業系統及其相關模組使用,普通應用程式只能使用那些不會造成災難的指令。比如 intel 的 cpu 將特權等級分為 4 個級別:ring0~rinsgtzeqg3。

其實 linux 系統只使用了 ring0 和 ring3 兩個執行級別(windows 系統也是一樣的)。當程序執行在 ring3 級別時被稱為執行在使用者態,而執行在 ring0 級別時被稱為執行在核心態。

核心態與使用者態

好了我們現在需要再解釋一下什麼是核心態、使用者態:

當程序執行在核心空間時就處於核心態,而程序執行在使用者空間時則處於使用者態。

在核心態下,程序執行在核心位址空間中,此時 cpu 可以執行任何指令。執行的**也不受任何的限制,可以自由地訪問任何有效位址,也可以直接進行埠的訪問。

在使用者態下,程序執行在使用者位址空間中,www.cppcns.com被執行的**要受到 cpu 的諸多檢查,它們只能訪問對映其位址空間的頁表項中規定的在使用者態下可訪問頁面的虛擬位址,且只能對任務狀態段(tss)中 i/o 許可位圖(i/o permission bitmap)中規定的可訪問埠進行直接訪問。

對於以前的 dos 作業系統來說,是沒有核心空間、使用者空間以及核心態、使用者態這些概念的。可以認為所有的**都是執行在核心態的,因而使用者編寫的應用程式**可以很容易的讓作業系統崩潰掉。

對於 linux 來說,通過區分核心空間和使用者空間的設計,隔離了作業系統**(作業系統的**要比應用程式的**健壯很多)與應用程式**。即便是單個應用程式出現錯誤也不會影響到作業系統的穩定性,這樣其它的程式還可以正常的執行(linux 可是個多工系統啊!)。

所以,區分核心空間和使用者空間本質上是要提高作業系統的穩定性及可用性。

如何從使用者空間進入核心空間

其實所有的系統資源管理都是在核心空間中完成的。比如讀寫磁碟檔案,分配**記憶體,從網路介面讀寫資料等等。我們的應用程式是無法直接進行這樣的操作的。但是我們可以通過核心提供的介面來完成這樣的任務。

比如應用程式要讀取磁碟上的乙個檔案,它可以向核心發起乙個 "系統呼叫" 告訴核心:"我要讀取磁碟上的某某檔案"。其實就是通過乙個特殊的指令讓程序從使用者態進入到核心態(到了核心空間),在核心空間中,cpu 可以執行任何的指令,當然也包括從磁碟上讀取資料。具體過程是先把資料讀取到核心空間中,然後再把資料拷貝到使用者空間並從核心態切換到使用者態。此時應用程式已經從系統呼叫中返回並且拿到了想要的資料,可以開開心心的往下執行了。

簡單說就是應用程式把高科技的事情(從磁碟讀取檔案)外包給了系統核心,系統核心做這些事情既專業又高效。

對於乙個程序來講,從使用者空間進入核心空間並最終返回到使用者空間,這程式設計客棧個過程是十分複雜的。舉個例子,比如我們經常接觸的概念 "堆疊",其實程序在核心態和使用者態各有乙個堆疊。執行在使用者空間時程序使用的是使用者空間中的堆疊,而執行在核心空間時,程序使用的是核心空間中的堆疊。所以說,linux 中每個程序有兩個棧,分別用於使用者態和核心態。

下圖簡明的描述了使用者態與核心態之間的轉換:

既然使用者態的程序必須切換成核心態才能使用系統的資源,那麼我們接下來就看看程序一共有多少種方式可以從使用者態進入到核心態。概括的說,有三種方式:系統呼叫、軟中斷和硬體中斷。這三種方式每一種都涉及到大量的程式設計客棧作業系統知識,所以這裡不做展開。

整體結構

接下來我們從核心空間和使用者空間的角度看一看整個 linux 系統的結構。它大體可以分為三個部分,從下往上依次為:硬體 -> 核心空間 -> 使用者空間。如下圖所示(此圖來自網際網路):

在硬體之上,核心空間中的**控制了硬體資源的使用權,使用者空間中的**只有通過核心暴露的系統呼叫介面(system call inte***ce)才能使用到系統中的硬體資源。其實,不光是 linux,windows 作業系統的設計也是大同小異。

總結

linux核心空間與使用者空間

核心空間和使用者空間是作業系統理論的基礎之一,即核心功能模組執行在核心空間,而應用程式執行在使用者空間。現代的cpu都具有不同的操作模式,代表不同的級別,不同的級別具有不同的功能,在較低的級別中將禁止某些操作。linux系統設計時利用了這種硬體特性,使用了兩個級別,最高端別和最低級別,核心執行在最高...

Linux的使用者空間與核心空間

當核心模組 或執行緒訪問記憶體時,中的記憶體位址都為邏輯位址,而對應到真正的物理記憶體位址,需要位址一對一的對映,如邏輯位址0xc0000003對應的實體地址為0 3,0xc0000004對應的實體地址為0 4,邏輯位址與實體地址對應的關係為 邏輯位址物理記憶體位址 0xc0000000 0 00x...

核心空間與使用者空間

1.核心態與使用者態的區別 1 核心態 的 不受任何限制,可以訪問 所有處理器指令集 記憶體位址以及i o空間 2 使用者態的 只能訪問其位址空間的頁表項中規定的虛擬位址。2.使用者態到核心態的切換方式 1 系統呼叫 軟中斷的一種 由使用者程序主動發起 2 異常 當cpu在執行執行在使用者態下的程式...