天天看點

使用者态和核心态的差別

在CPU的所有指令中,有一些指令是非常危險的,如果錯用,将導緻整個系統崩潰。比如:清記憶體、設定時鐘等。如果所有的程式都能使用這些指令,那麼你的系統一天當機n回就不足為奇了。是以,CPU将指令分為特權指令和非特權指令,對于那些危險的指令,隻允許作業系統及其相關子產品使用,普通的應用程式隻能使用那些不會造成災難的指令。Intel的CPU将特權級别分為4個級别:RING0,RING1,RING2,RING3。

    linux的核心是一個有機的整體。每一個使用者程序運作時都好像有一份核心的拷貝,每當使用者程序使用系統調用時,都自動地将運作模式從使用者級轉為核心級,此時程序在核心的位址空間中運作。

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

    核心态與使用者态是作業系統的兩種運作級别,跟intel cpu沒有必然的聯系, 如上所提到的intel cpu提供Ring0-Ring3四種級别的運作模式,Ring0級别最高,Ring3最低。Linux使用了Ring3級别運作使用者态,Ring0作為 核心态,沒有使用Ring1和Ring2。Ring3狀态不能通路Ring0的位址空間,包括代碼和資料。Linux程序的4GB位址空間,3G-4G部 分大家是共享的,是核心态的位址空間,這裡存放在整個核心的代碼和所有的核心子產品,以及核心所維護的資料。使用者運作一個程式,該程式所建立的程序開始是運

行在使用者态的,如果要執行檔案操作,網絡資料發送等操作,必須通過write,send等系統調用,這些系統調用會調用核心中的代碼來完成操作,這時,必 須切換到Ring0,然後進入3GB-4GB中的核心位址空間去執行這些代碼完成操作,完成後,切換回Ring3,回到使用者态。這樣,使用者态的程式就不能 随意操作核心位址空間,具有一定的安全保護作用。

     處理器總處于以下狀态中的一種:

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

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

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

從使用者空間到核心空間有兩種觸發手段:

1.使用者空間的應用程式,通過系統調用,進入核心空間。這個時候使用者空間的程序要傳遞很多變量、參數的值給核心,核心态運作的時候也要儲存使用者程序的一些寄存器值、變量等。所謂的“程序上下文”,可以看作是使用者程序傳遞給核心的這些參數以及核心要儲存的那一整套的變量和寄存器值和當時的環境等。

2.硬體通過觸發信号,導緻核心調用中斷處理程式,進入核心空間。這個過程中,硬體的一些變量和參數也要傳遞給核心,核心通過這些參數進行中斷處理。所謂的“中斷上下文”,其實也可以看作就是硬體傳遞過來的這些參數和核心需要儲存的一些其他環境(主要是目前被打斷執行的程序環境)。

   一個程式我們可以從兩種角度去分析。其一就是它的靜态結構,其二就是動态過程。下圖表示了使用者态和核心态直接的關系(靜态的角度來觀察程式)

使用者态和核心态的差別
下一篇: kotlin

繼續閱讀