在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.硬體通過觸發訊號,導致核心呼叫中斷處理程式,進入核心空間。這個過程中,硬體的一些變數和引數也要傳遞給核心,核心通過這些引數進行中斷處理。所謂的「中斷上下文」,其實也可以看作就是硬體傳遞過來的這些引數和核心需要儲存的一些其他環境(主要是當前被打斷執行的程序環境)。
乙個程式我們可以從兩種角度去分析。其一就是它的靜態結構,其二就是動態過程。下圖表示了使用者態和核心態直接的關係(靜態的角度來觀察程式)
作業系統為什麼要分使用者態和核心態
在cpu的所有指令中,有一些指令是非常危險的,如果錯用,將導致整個系統崩潰。比如 清記憶體 設定時鐘等。如果所有的程式都能使用這些指令,那麼你的系統一天宕機n回就不足為奇了。所以,cpu將指令分為特權指令和非特權指令,對於那些危險的指令,只允許作業系統及其相關模組使用,普通的應用程式只能使用那些不會...
作業系統為什麼要分使用者態和核心態
在cpu的所有指令中,有一些指令是非常危險的,如果錯用,將導致整個系統崩潰。比如 清記憶體 設定時鐘等。如果所有的程式都能使用這些指令,那麼你的系統一天宕機n回就不足為奇了。所以,cpu將指令分為特權指令和非特權指令,對於那些危險的指令,只允許作業系統及其相關模組使用,普通的應用程式只能使用那些不會...
作業系統使用者態和核心態
核心態 cpu可以訪問記憶體所有資料,包括外圍裝置,例如硬碟,網絡卡.cpu也可以將自己從乙個程式切換到另乙個程式 使用者態 只能受限的訪問記憶體,且不允許訪問外圍裝置.占用cpu的能力被剝奪,cpu資源可以被其他程式獲取 為什麼要有使用者態和核心態 由於需要限制不同的程式之間的訪問能力,防止他們獲...