使用者態與核心態詳解

來源:互聯網
上載者:User

標籤:

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

 1、用系統調用時進入核心態。Linux對硬體的操作只能在核心態,這可以通過寫驅動程式來控制。在使用者態操作硬體會造成core dump。
   2、要注意區分系統調用和一般的函數。系統調用由核心提供,如read()、write()、open()等。而一般的函數由軟體包中的函數庫提供,如sin()、cos()等。在文法上兩者沒有區別。   
   3、一般情況:系統調用運行在核心態,函數運行在使用者態。但也有一些函數在內部使用了系統調用(如fopen),這樣的函數在調用系統調用是進入核心態,其他時候運行在使用者態。

大概是    當使用者程式調用系統的API時,就產生中斷,進入核心態的API,處理完成後,用中斷再退出,返回使用者態的調用函數。   
   user    api    -->    interrupt    -->    kernel    api    -->    interrupt

---------------------------------------------------------------------
簡單來講一個進程由於執行系統調用而開始執行核心代碼,我們稱該進程處於核心態中. 一個進程執行應用程式自身代碼則稱該進程處於使用者態.
intel x86 架構的 CPU 分為好幾個運行層級,從 0--3 , 0 為最進階別, 3 為最低層級
針對不同的層級,有很多的限制,比如說傳統的 in ,out 指令,就是連接埠的輸入輸出指令,在 0 級下是可以用的,但在 3 級下就不能用,你用就產生陷阱,告訴你出錯了,當然限制還有很多了,不只是這一點。
作業系統下是利用這個特點,當作業系統自己的代碼運行時, CPU 就切成 0 級,當使用者的程式運行是就只讓它在 3 級運行,這樣如果使用者的程式想做什麼破壞系統的事情的話,也沒辦法做到
當然,低層級的程式是沒法把自己升到進階別的,也就是說 使用者程式運行在 3 級,他想把自己變成 0 級自己是做不到的,除非是作業系統幫忙,利用這個特性,作業系統就可以控制所有的程式的運行,確保系統的安全了. 平時把作業系統運行時的層級就叫核心態(因為是作業系統核心運行時的狀態),而且普通使用者程式運行時的那個層級叫使用者態...
當作業系統剛引導時, CPU 處於實模式,這時就相當於是 0 級,於是作業系統就自動得到最高許可權,然後切到保護模式時就是0級,這時作業系統就佔了先機,成為了最進階別的運行者,由於你的程式都是由作業系統來載入的,所以當它把你載入上來後,就把你的運行狀態設為 3 級,即最低級,然後才讓你運行,所以沒辦法,你只能在最低級運行了,因為沒辦法把自己從低級上升到進階, 這就是作業系統在核心態可以系統管理使用者程式,殺死使用者程式的原因。

1. 使用者態和核心態的概念區別

究竟什麼是使用者態,什麼是核心態,這兩個基本概念以前一直理解得不是很清楚,根本原因個人覺得是在於因為大部分時候我們在寫程式時關注的重點和著眼的角度放在了實現的功能和代碼的邏輯性上,先看一個例子:

1)例子

   void testfork(){

       if(0 = = fork()){

           printf(“create new process success!\n”);

       }

       printf(“testfork ok\n”);

   }

       這段代碼很簡單,從功能的角度來看,就是實際執行了一個fork(),產生一個新的進程,從邏輯的角度看,就是判斷了如果fork()返回的是0則列印相關語句,然後函數最後再列印一句表示執行完整個testfork()函數。代碼的執行邏輯和功能上看就是如此簡單,一共四行代碼,從上到下一句一句執行而已,完全看不出來哪裡有體現出使用者態和進程態的概念。

如果說前面兩種是靜態觀察的角度看的話,我們還可以從動態角度來看這段代碼,即它被轉換成CPU執行的指令後載入執行的過程,這時這段程式就是一個動態執行的指令序列。而究竟載入了哪些代碼,如何載入就是和作業系統密切相關了。

2)特權級

熟悉Unix/Linux系統的人都知道,fork的工作實際上是以系統調用的方式完成相應功能的,具體的工作是由sys_fork負責實施。其實無論是不是Unix或者Linux,對於任何作業系統來說,建立一個新的進程都是屬於核心功能,因為它要做很多底層細緻地工作,消耗系統的實體資源,比如分配實體記憶體,從父進程拷貝相關資訊,拷貝設定頁目錄頁表等等,這些顯然不能隨便讓哪個程式就能去做,於是就自然引出特權層級的概念,顯然,最關鍵性的權力必須由高特權級的程式來執行,這樣才可以做到集中管理,減少有限資源的訪問和使用衝突。

特權級顯然是非常有效管理和控製程序執行的手段,因此在硬體上對特權級做了很多支援,就Intel x86架構的CPU來說一共有0~3四個特權級,0級最高,3級最低,硬體上在執行每條指令時都會對指令所具有的特權級做相應的檢查,相關的概念有CPL、DPL和RPL,這裡不再過多闡述。硬體已經提供了一套特權級使用的相關機制,軟體自然就是好好利用的問題,這屬於作業系統要做的事情,對於Unix/Linux來說,只使用了0級特權級和3級特權級。也就是說在Unix/Linux系統中,一條工作在0級特權級的指令具有了CPU能提供的最高權力,而一條工作在3級特權級的指令具有CPU提供的最低或者說最基本權力。

3)使用者態和核心態

    現在我們從特權級的調度來理解使用者態和核心態就比較好理解了,當程式運行在3級特權級上時,就可以稱之為運行在使用者態,因為這是最低特權級,是普通的使用者進程啟動並執行特權級,大部分使用者直接面對的程式都是運行在使用者態;反之,當程式運行在0級特權級上時,就可以稱之為運行在核心態。

雖然使用者態下和核心態下工作的程式有很多差別,但最重要的差別就在於特權級的不同,即權力的不同。運行在使用者態下的程式不能直接存取作業系統核心資料結構和程式,比如上面例子中的testfork()就不能直接調用sys_fork(),因為前者是工作在使用者態,屬於使用者態程式,而sys_fork()是工作在核心態,屬於核心態程式。

當我們在系統中執行一個程式時,大部分時間是運行在使用者態下的,在其需要作業系統協助完成某些它沒有權力和能力完成的工作時就會切換到核心態,比如testfork()最初運行在使用者態進程下,當它調用fork()最終觸發sys_fork()的執行時,就切換到了核心態。

2. 使用者態和核心態的轉換

1)使用者態切換到核心態的3種方式

a. 系統調用

   這是使用者態進程主動要求切換到核心態的一種方式,使用者態進程通過系統調用申請使用作業系統提供的服務程式完成工作,比如前例中fork()實際上就是執行了一個建立新進程的系統調用。而系統調用的機制其核心還是使用了作業系統為使用者特別開放的一個中斷來實現,例如Linux的int 80h中斷。

b. 異常

    當CPU在執行運行在使用者態下的程式時,發生了某些事先不可知的異常,這時會觸發由當前運行進程切換到處理此異常的核心相關程式中,也就轉到了核心態,比如缺頁異常。

c. 外圍裝置的中斷

    當外圍裝置完成使用者請求的操作後,會向CPU發出相應的中斷訊號,這時CPU會暫停執行下一條即將要執行的指令轉而去執行與中斷訊號對應的處理常式,如果先前執行的指令是使用者態下的程式,那麼這個轉換的過程自然也就發生了由使用者態到核心態的切換。比如硬碟讀寫操作完成,系統會切換到硬碟讀寫的中斷處理常式中執行後續操作等。

這3種方式是系統在運行時由使用者態轉到核心態的最主要方式,其中系統調用可以認為是使用者進程主動發起的,異常和外圍裝置中斷則是被動的。

使用者態與核心態詳解

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.