在計算機系統中,通常執行著兩種程式————系統程式和應用程式,為了保證整系統程式不被應用程式所破壞,系統設定了兩種狀態
1)核心態,作業系統在系統態執行———執行作業系統程式。
2)使用者態,應用程式只能在使用者態執行———執行使用者程式。
執行過程中處理機會在使用者態和核心態來回切換,由此相應的現代作業系統將cpu指令也劃分為兩類,特權指令和非特權指令。
特權指令(在核心態執行的指令)
1)對記憶體的訪問不受限制,不僅能訪問系統儲存空間也能訪問使用者儲存空間
2)特權指令只許作業系統呼叫,不允許應用程式呼叫,否則會使得系統紊亂。
非特權指令(在使用者態執行的指令)
一般的應用程式只能呼叫非特權指令,不能訪問系統的硬體和軟體,其記憶體的呼叫和訪問範圍也僅限與使用者空間範圍
特權指令包括:呼叫i/o,記憶體清零,修改程式狀態字,設定時鐘,允許禁止和中斷,停機
非特權指令包括:控制轉移,算數運算,訪管指令,取值指令
unix 系統把程序的執行狀態分為兩種:
一種是使用者態執行,表示程序正處於使用者狀態中執行;
另一種是核心態執行,表示乙個應用程序執行系統呼叫後,或 i/o 中斷、時鐘中斷後,程序便處於核心態執行。
這兩種狀態的主要差別在於:
處於使用者態執行時,程序所能訪問的記憶體空間和物件受到限制,其所占有的處理機是可被搶占的;
而處於核心態執行中的程序,則能訪問所有的記憶體空間和物件,且所占用的處理機是不允許被搶占的。
使用者態和核心態的切換
當在系統中執行乙個程式時,大部分時間是執行在使用者態下的,在其需要作業系統幫助完成一些使用者態自己沒有特權和能力完成的操作時就會切換到核心態。
使用者態切換到核心態的3種方式
(1)系統呼叫
這是使用者態程序主動要求切換到核心態的一種方式。使用者態程序通過系統呼叫申請使用作業系統提供的服務程式完成工作。例如fork()就是執行了乙個建立新程序的系統呼叫。系統呼叫的機制和新是使用了作業系統為使用者特別開放的乙個中斷來實現,如linux的int 80h中斷。
想仔細了解系統呼叫的相關知識的同學可以看看我的這篇部落格
(2)異常
當cpu在執行執行在使用者態下的程式時,發生了一些沒有預知的異常,這時會觸發由當前執行程序切換到處理此異常的核心相關程序中,也就是切換到了核心態,如缺頁異常。
(3)外圍裝置的中斷
當外圍裝置完成使用者請求的操作後,會向cpu發出相應的中斷訊號,這時cpu會暫停執行下一條即將要執行的指令而轉到與中斷訊號對應的處理程式去執行,如果前面執行的指令時使用者態下的程式,那麼轉換的過程自然就會是 由使用者態到核心態的切換。如硬碟讀寫操作完成,系統會切換到硬碟讀寫的中斷處理程式中執行後邊的操作等。
關於中斷和異常的區別我在這篇部落格做了詳細的介紹
這三種方式是系統在執行時由使用者態切換到核心態的最主要方式,其中系統呼叫可以認為是使用者程序主動發起的,異常和外圍裝置中斷則是被動的。從觸發方式上看,切換方式都不一樣,但從最終實際完成由使用者態到核心態的切換操作來看,步驟有事一樣的,都相當於執行了乙個中斷響應的過程。系統呼叫實際上最終是中斷機制實現的,而異常和中斷的處理機制基本一致。
使用者態到核心態具體的切換步驟:
(1)從當前程序的描述符中提取其核心棧的ss0及esp0資訊。
(2)使用ss0和esp0指向的核心棧將當前程序的cs,eip,eflags,ss,esp資訊儲存起來,這個過程也完成了由使用者棧到核心棧的切換過程,同時儲存了被暫停執行的程式的下一條指令。
(3)將先前由中斷向量檢索得到的中斷處理程式的cs,eip資訊裝入相應的暫存器,開始執行中斷處理程式,這時就轉到了核心態的程式執行了。
核心態切換到使用者態的途徑
設定程式狀態字
注意一條特殊的指令——陷入指令(又稱為訪管指令,因為核心態也被稱為管理態,訪管就是訪問管理態)
該指令給使用者提供介面,用於呼叫作業系統的服務。
核心態和使用者態的區別
核心態與使用者態是作業系統的兩種執行級別,intelcpu提供ring0 ring3三種級別的執行模式。ring0級別最高,ring3最低。當乙個任務 程序 執行系統呼叫而陷入核心 中執行時,我們就稱程序處於核心執行態 或簡稱為核心態 此時處理器處於特權級最高的 0級 核心 中執行。當程序處於核心態...
使用者態和核心態的區別
在cpu的所有指令中,有一些指令是非常危險的,如果錯用,將導致整個系統崩潰。比如 清記憶體 設定時鐘等。如果所有的程式都能使用這些指令,那麼你的系統一天宕機n回就不足為奇了。所以,cpu將指令分為特權指令和非特權指令,對於那些危險的指令,只允許作業系統及其相關模組使用,普通的應用程式只能使用那些不會...
使用者態和核心態的區別
在cpu的所有指令中,有一些指令是非常危險的,如果錯用,將導致整個系統崩潰。比如 清記憶體 設定時鐘等。如果所有的程式都能使用這些指令,那麼你的系統一天宕機n回就不足為奇了。所以,cpu將指令分為特權指令和非特權指令,對於那些危險的指令,只允許作業系統及其相關模組使用,普通的應用程式只能使用那些不會...