核心模式位元

核心模式位元

我讀了高爾文的《操作系統與概念》一書中的以下內容

“一個稱為模式位的位元被添加到電腦的硬體中以指示當前模式:內核(0)或用戶(1)。透過模式位,我們能夠區分執行在代表作業系統和代表使用執行的一個”

現在,如果它是多處理器系統,則假設一個進程執行系統呼叫並將模式位元從 1 更改為 0 。

現在可能有一些其他進程在用戶模式下並行運行,因為它是一個多處理器系統,但模式位元設定為 0 表示核心模式導致不一致。

那麼暫存器的數量(儲存模式位元所需的)是否取決於處理器的數量?

答案1

你的書把事情過於簡單化了。實際上,這取決於 CPU 如何設定模式,而且它不一定是“位元”,也不一定只有兩種模式。

出於該問題的目的,我們假設 Linux、Intel x86 和多核心。

多工處理是透過上下文切換來實現的,在 Linux 中,上下文切換是基於軟體的。上下文切換只是停止處理器正在執行的操作(核心或 CPU),將其狀態保存到 RAM,然後用另一個上下文取代它。

x86 實作了可以在進程級執行發生之前在每個處理器上設定的保護環。 Linux 核心透過在記憶體空間開始執行之前將進程設為環 3(非特權)來處理此問題。透過前面提到的上下文切換的實現,核心維護了在特定執行緒上運行的進程的概念(通常每個核心有2 個執行緒),因為每當該程式碼運行時,核心總是將環設定回3 ,即使處理器每秒會發生多次上下文切換,因此許多進程將在同一核心上運行。它可以透過一個或多個核心以基本相同的方式完成此操作。

在 x86 的 Linux 上,當執行緒想要從環 3​​ 切換到環 0(管理程式)時,它只能透過軟體中斷來實現。在環 1 和環 2 中,也可以使用特殊指令,但 Linux 不會實現這一點。因為 Linux 控制軟體中斷處理程序,所以即使執行緒現在位於環 0 中,它也可以確保它只運行「核心空間」中的程式碼,也就是屬於核心一部分的程式碼,即使它與執行用戶空間程式碼的執行緒相同。在作業系統中,這被稱為系統調用,因為這就是它真正在做的事情。您是否想將此視為“進程”正在切換到內核模式並返回,或者該進程實際上處於暫停狀態,因為只有內核空間代碼正在執行,直到它切換回用戶空間,這取決於您。

因為 x86 允許高環中的那些切換到低環,所以它可以在中斷處理程序完成後切換回 3。這就是所有系統呼叫都會發生的情況,因此從硬體角度來看,所有系統呼叫都可以在系統上執行任何操作。它可以反向運行程式的每條指令,然後根據需要從記憶體中刪除所有程式碼。或者它可以切換到環 0 並在程式開始時開始執行。正如您所看到的,這些範例打破了“核心/用戶”模式的概念,因為硬體中不存在這樣的概念。然而,在 Linux 上,它始終實現為對核心空間的呼叫和對使用者空間的回傳(實際上,內存在 x86 上不受環 0 的保護)。

因此,核心/使用者模式切換是透過使用軟體中斷處理程序來實現的,該軟體中斷處理程序可以突破線程保護環,但實現時只在核心空間中執行,然後返回到用戶空間,特別是執行該命令的使用者空間進程。

相關內容