核心態與使用者態切換

2021-09-26 02:57:06 字數 1051 閱讀 6847

a. 系統呼叫

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

b. 異常

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

c. 外圍裝置的中斷

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

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

從觸發方式上看,可以認為存在前述3種不同的型別,但是從最終實際完成由使用者態到核心態的切換操作上來說,涉及的關鍵步驟是完全一致的,沒有任何區別,都相當於執行了乙個中斷響應的過程,因為系統呼叫實際上最終是中斷機制實現的,而異常和中斷的處理機制基本上也是一致的,關於它們的具體區別這裡不再贅述。關於中斷處理機制的細節和步驟這裡也不做過多分析,涉及到由使用者態切換到核心態的步驟主要包括:

[1] 從當前程序的描述符中提取其核心棧的ss0及esp0資訊。

[2] 使用ss0和esp0指向的核心棧將當前程序的cs,eip,eflags,ss,esp資訊儲存起來,這個

過程也完成了由使用者棧到核心棧的切換過程,同時儲存了被暫停執行的程式的下一

條指令。

[3] 將先前由中斷向量檢索得到的中斷處理程式的cs,eip資訊裝入相應的暫存器,開始

執行中斷處理程式,這時就轉到了核心態的程式執行了。

使用者態與核心態的切換與區別

核心態和使用者態的區別 當乙個任務 程序 執行系統呼叫而陷入核心 中執行時,我們就稱程序處於核心狀態。此時處理器處於特權級 最高的 0級 核心 當程序處於核心態時,執行的核心 會使用當前的核心棧。每個程序都有自己的核心 棧。當程序在執行使用者自己的 時,則稱其處於使用者態。即此時處理器在特權級最低的...

使用者態與核心態的切換與區別

核心態和使用者態的區別 當乙個任務 程序 執行系統呼叫而陷入核心 中執行時,我們就稱程序處於核心狀態。此時處理器處於特權級 最高的 0級 核心 當程序處於核心態時,執行的核心 會使用當前的核心棧。每個程序都有自己的核心 棧。當程序在執行使用者自己的 時,則稱其處於使用者態。即此時處理器在特權級最低的...

使用者態與核心態的切換與區別

核心態和使用者態的區別 當乙個任務 程序 執行系統呼叫而陷入核心 中執行時,我們就稱程序處於核心狀態。此時處理器處於特權級 最高的 0級 核心 當程序處於核心態時,執行的核心 會使用當前的核心棧。每個程序都有自己的核心 棧。當程序在執行使用者自己的 時,則稱其處於使用者態。即此時處理器在特權級最低的...