天天看點

核心空間與使用者空間之一:基礎概念

(1)Linux簡化了分段機制,使得虛拟位址與線性位址總是一緻,是以Linux的虛拟位址空間也為0~ 4G(32位位址最大通路極限)。Linux核心将這4G位元組的空間分為兩部分,将最高的1G位元組(從虛拟位址0xC0000000到0xFFFFFFFF),供核心使用,稱為“核心空間”。而将較低的3G位元組(從虛拟位址0x00000000到0xBFFFFFFF,供各個程序使用,稱為“使用者空間)。因為每個程序可以通過系統調用進入核心,是以,Linux核心由系統内的所有程序共享。于是,從具體程序的角度來看,每個程序可以擁有4G位元組的虛拟空間。 

核心空間與使用者空間之一:基礎概念

(2)其中,核心位址空間又被劃分為"實體記憶體區","虛拟記憶體配置設定區","高端頁面映射區","專用頁面映射區","系統保留映射區"幾個區域。在标準配置下,實體區最大長度為896M,系統的實體記憶體被順序映射在實體區中,當系統實體記憶體大于896M時,超過實體區的那部分記憶體稱為高端記憶體。低端記憶體和高端記憶體用highmem_start_page變量來定界,核心在存取高端記憶體時必須将它們映射到"高端頁面映射區"。

      Linux保留核心空間最頂部128K區域作為保留區,緊接保留區以下的一段區域為專用頁面映射區,它的總尺寸和每一頁的用途由fixed_address枚舉結構在編繹時預定義,用__fix_to_virt(index)可擷取專用區内預定義頁面的邏輯位址。在專用頁面區内為CPU預定義了一張高端記憶體映射頁,用于在中斷進行中高端頁面的映射操作。

      距離核心空間頂部32M,長度為4M的一段區域為高端記憶體映射區,它正好占用1個頁幀表所表示的實體記憶體總量,它可以緩沖1024個高端頁面的映射。在實體區和高端映射區之間為虛存記憶體配置設定區,用于vmalloc()函數,它的前部與實體區有8M隔離帶,後部與高端映射區有8K的隔離帶。

      當系統實體記憶體超過4G時,必須使用CPU的擴充分頁(PAE)模式所提供的64位頁目錄項才能存取到4G以上的實體記憶體。在PAE模式下,線性位址到實體位址的轉換使用3級頁表,第1級頁目錄由線性位址的最高2位索引,每一目錄項對應1G的尋址空間,第2級頁目錄項以9位索引,每一目錄項對應2M的尋址空間,第3級頁目錄項以9位索引,每一目錄項對應4K的頁幀。

(3) 關于核心态和使用者态:當一個任務(程序)執行系統調用而陷入核心代碼中執行時,我們就稱程序處于核心運作态(或簡稱為核心态)。此時處理器處于特權級最高的(0級)核心代碼中執行。當程序處于核心态時,執行的核心代碼會使用目前程序的核心棧。每個程序都有自己的核心棧。當程序在執行使用者自己的代碼時,則稱其處于使用者運作态(使用者态)。即此時處理器在特權級最低的(3級)使用者代碼中運作。當正在執行使用者程式而突然被中斷程式中斷時,此時使用者程式也可以象征性地稱為處于程序的核心态。因為中斷處理程式将使用目前程序的核心棧。這與處于核心态的程序的狀态有些類似。

核心空間與使用者空間之一:基礎概念
核心空間與使用者空間之一:基礎概念

      關于程序上下文和中斷上下文。處理器總處于以下狀态中的一種:

1、核心态,運作于程序上下文,核心代表程序運作于核心空間;

2、核心态,運作于中斷上下文,核心代表硬體運作于核心空間;

3、使用者态,運作于使用者空間。

(4)通常我們隻會在使用者空間通過linux native/app 層 讀寫檔案,但可能有一些非常特别的情況下,我們需要直接在Kernel 中讀寫檔案資訊,參見FAQ10425

繼續閱讀