1.作業系統需要兩種CPU狀態
核心態(Kernel Mode):執行作業系統程式,操作硬體
使用者態(User Mode):執行使用者程式
2.指令劃分
特權指令:只能由作業系統使用、使用者程式不能使用的指令。 舉例:啟動I/O 記憶體清零 修改程式狀態字 設定時鐘 允許/禁止終端 停機
非特權指令:使用者程式可以使用的指令。 舉例:控制轉移 算數運算 取數指令 訪管指令(使使用者程式從使用者態陷入核心態)
3.特權級別
特權環:R0、R1、R2和R3
R0相當於核心態,R3相當於使用者態;
不同級別能夠執行不同的指令集合;
4.CPU狀態之間的轉換
使用者態—>核心態:唯一途徑是透過中斷、異常、陷入機制(訪管指令)
核心態—>使用者態:設定程式狀態字PSW
5.核心態與使用者態的區別
核心態與使用者態是作業系統的兩種執行級別,當程式執行在3級特權級上時,就可以稱之為執行在使用者態。因為這是最低特權級,是普通的使用者程序執行的特權級,大部分使用者直接面對的程式都是執行在使用者態;
當程式執行在0級特權級上時,就可以稱之為執行在核心態。
執行在使用者態下的程式不能直接訪問作業系統核心資料結構和程式。當我們在系統中執行一個程式時,大部分時間是執行在使用者態下的,在其需要作業系統幫助完成某些它沒有權力和能力完成的工作時就會切換到核心態(比如操作硬體)。
這兩種狀態的主要差別是
處於使用者態執行時,程序所能訪問的記憶體空間和物件受到限制,其所處於佔有的處理器是可被搶佔的
處於核心態執行時,則能訪問所有的記憶體空間和物件,且所佔有的處理器是不允許被搶佔的。
6. 通常來說,以下三種情況會導致使用者態到核心態的切換
系統呼叫這是使用者態程序主動要求切換到核心態的一種方式,使用者態程序透過系統呼叫申請使用作業系統提供的服務程式完成工作。比如前例中fork()實際上就是執行了一個建立新程序的系統呼叫。
而系統呼叫的機制其核心還是使用了作業系統為使用者特別開放的一箇中斷來實現,例如Linux的int 80h中斷。
使用者程式通常呼叫庫函式,由庫函式再呼叫系統呼叫,因此有的庫函式會使使用者程式進入核心態(只要庫函式中某處呼叫了系統呼叫),有的則不會。
異常當CPU在執行執行在使用者態下的程式時,發生了某些事先不可知的異常,這時會觸發由當前執行程序切換到處理此異常的核心相關程式中,也就轉到了核心態,比如缺頁異常。
外圍裝置的中斷當外圍裝置完成使用者請求的操作後,會向CPU發出相應的中斷訊號,這時CPU會暫停執行下一條即將要執行的指令轉而去執行與中斷訊號對應的處理程式,
如果先前執行的指令是使用者態下的程式,那麼這個轉換的過程自然也就發生了由使用者態到核心態的切換。比如硬碟讀寫操作完成,系統會切換到硬碟讀寫的中斷處理程式中執行後續操作等。
這3種方式是系統在執行時由使用者態轉到核心態的最主要方式,其中系統呼叫可以認為是使用者程序主動發起的,異常和外圍裝置中斷則是被動的。
1.作業系統需要兩種CPU狀態
核心態(Kernel Mode):執行作業系統程式,操作硬體
使用者態(User Mode):執行使用者程式
2.指令劃分
特權指令:只能由作業系統使用、使用者程式不能使用的指令。 舉例:啟動I/O 記憶體清零 修改程式狀態字 設定時鐘 允許/禁止終端 停機
非特權指令:使用者程式可以使用的指令。 舉例:控制轉移 算數運算 取數指令 訪管指令(使使用者程式從使用者態陷入核心態)
3.特權級別
特權環:R0、R1、R2和R3
R0相當於核心態,R3相當於使用者態;
不同級別能夠執行不同的指令集合;
4.CPU狀態之間的轉換
使用者態—>核心態:唯一途徑是透過中斷、異常、陷入機制(訪管指令)
核心態—>使用者態:設定程式狀態字PSW
5.核心態與使用者態的區別
核心態與使用者態是作業系統的兩種執行級別,當程式執行在3級特權級上時,就可以稱之為執行在使用者態。因為這是最低特權級,是普通的使用者程序執行的特權級,大部分使用者直接面對的程式都是執行在使用者態;
當程式執行在0級特權級上時,就可以稱之為執行在核心態。
執行在使用者態下的程式不能直接訪問作業系統核心資料結構和程式。當我們在系統中執行一個程式時,大部分時間是執行在使用者態下的,在其需要作業系統幫助完成某些它沒有權力和能力完成的工作時就會切換到核心態(比如操作硬體)。
這兩種狀態的主要差別是
處於使用者態執行時,程序所能訪問的記憶體空間和物件受到限制,其所處於佔有的處理器是可被搶佔的
處於核心態執行時,則能訪問所有的記憶體空間和物件,且所佔有的處理器是不允許被搶佔的。
6. 通常來說,以下三種情況會導致使用者態到核心態的切換
系統呼叫這是使用者態程序主動要求切換到核心態的一種方式,使用者態程序透過系統呼叫申請使用作業系統提供的服務程式完成工作。比如前例中fork()實際上就是執行了一個建立新程序的系統呼叫。
而系統呼叫的機制其核心還是使用了作業系統為使用者特別開放的一箇中斷來實現,例如Linux的int 80h中斷。
使用者程式通常呼叫庫函式,由庫函式再呼叫系統呼叫,因此有的庫函式會使使用者程式進入核心態(只要庫函式中某處呼叫了系統呼叫),有的則不會。
異常當CPU在執行執行在使用者態下的程式時,發生了某些事先不可知的異常,這時會觸發由當前執行程序切換到處理此異常的核心相關程式中,也就轉到了核心態,比如缺頁異常。
外圍裝置的中斷當外圍裝置完成使用者請求的操作後,會向CPU發出相應的中斷訊號,這時CPU會暫停執行下一條即將要執行的指令轉而去執行與中斷訊號對應的處理程式,
如果先前執行的指令是使用者態下的程式,那麼這個轉換的過程自然也就發生了由使用者態到核心態的切換。比如硬碟讀寫操作完成,系統會切換到硬碟讀寫的中斷處理程式中執行後續操作等。
這3種方式是系統在執行時由使用者態轉到核心態的最主要方式,其中系統呼叫可以認為是使用者程序主動發起的,異常和外圍裝置中斷則是被動的。