當前位置: 華文星空 > 知識

作業系統內核態和使用者態切換落實到程式碼層面和執行層面的本質是什麽?

2021-05-08知識

只要你做過 MIT6.828 或者類似的 Mini os 就知道。

一般現代CPU都有幾種不同的指令執行級別。

在高執行級別下,程式碼可以執行特權指令,存取任意的實體位址,這種CPU執行級別就對應著內核態。

而在相應的低階別執行狀態下,程式碼的掌控範圍會受到限制。只能在對應級別允許的範圍內活動。

內核態和使用者態本質是CPU支持的,而不是作業系統做的限制,比如:

inter的CPU將等級分為四個級別:Ring0、Ring1、Ring2、Ring3。Windows只是用其中的兩個級別Ring0和Ring3,Ring0只給作業系統使用,Ring3誰都能用。如果普通應用程式企圖執行Ring0指令,則windows會顯示「非法指令」錯誤資訊。

當程式中有系統呼叫語句,程式執行到系統呼叫時,首先使用類似 int 80H 的軟中斷指令,保存現場,去的系統呼叫號,在內核態執行,然後恢復現場,每個行程都會有兩個棧,一個內核態棧和一個使用者態棧。

對於內核態和使用者態棧切換感興趣可以去看下哈工大李治軍老師的課程:

要說清楚內核態和使用者態,不得不提下真實模式和保護模式。

作業系統最初就是以真實模式執行的,真實模式是什麽?

對於早期CPU來說,真實模式其實就是 8086CPU 的工作環境、工作方式、工作狀態,這是一整套的內容,並不是單指某一方面的設定。

真實模式被保護模式淘汰的原因,最主要是安全隱患。

在真實模式下,使用者程式和作業系統可以說是同一特權的程式,因為真實模式下沒有特權級,它處處和操 作系統平起平坐,所以可以執行一些具有破壞性的指令。

程式可以隨意修改自己的段基址,這樣便在 1~但的記憶體空間內不受阻攔,可以隨意存取任意實體記憶體, 包括存取作業系統所在的記憶體數據。這就給程式設計師開放了無限的自由,程式設計師存取記憶體可以說是指哪打哪。

由於完全沒有保護性可言,使用者程式甚至可以覆蓋作業系統在記憶體中的映像,整個電腦世界的和平 全靠程式設計師的心情。

所謂保護模式下的「保護飛主要體現在特權級上,以後隨著後面工作的展開,會越來越多地和它們 打交道 。

保護模式的安全性也體現了「特權」:為了維護電腦世界的「和平飛避免潛在的危險,對於那些不 受控的程式,剝奪它們的部份能力,使它們沒有殺傷力,讓它們只能老老實實地執行 。

給不同的操作給與不同的「許可權」 。Linux作業系統就將許可權等級分為了2個等級,分別就是內核態和使用者態:

電腦世界其實可以分為兩部份,存取者和受訪者 。 存取者是動態的,具有能動性,它主動去訪 問各種資源。 受訪者是靜態的,它就是被存取的資源,只能幹坐著等待存取者光顧 。 存取者的特權級可以 變,受訪者的特權不能變。

Intel發明了ring0-ring3這些存取控制級別來保護硬件資源,ring0的就是我們所說的內核級別,要想使用硬件資源就必須獲取相應的許可權(設定PSW寄存器,這個操作只能由作業系統設定)。作業系統對內核級別的指令進行封裝,統一管理硬件資源,然後向使用者程式提供系統服務,使用者程式進行系統呼叫後,作業系統執行一系列的檢查驗證,確保這次呼叫是安全的,再進行相應的資源存取操作。 內核態能有效保護硬件資源的安全。

本質上就是特權指令的執行權,作業系統會設定狀態寄存器,來控制許可權,使用者態沒有,而內核態有執行特殊命令的許可權。

也推薦大家去看下【作業系統真象還原】,裏面對於內核態、使用者態、保護模式、真實模式這些概念都講得比較清晰。

這些書大家可以在這裏獲取,對於學習電腦的同學幫助非常大,且十分系統

書單:電腦必看經典書單(含下載方式)