用戶程序通過系統調用進入內核態,內核態下可以讓操作系統執行一些用戶進程不能執行的特權指令。

假如用戶進程存在特權指令,最終都是交於CPU處理器去執行,那處理器如何區分出這個指令來自用戶進程從而禁止執行的?

最好能說一說詳細機制或者給一些推薦資料。


x86的話通過cs段來區分,cs段選擇器有許可權等級,分為0,1,2,3共4級,操作系統一般只用0級跟3級。0級表示內核,驅動,3級表示應用程序。


首先,CPU沒有辦法區分出指令是來自操作系統,還是用戶進程。

但是,因為操作系統管理著所有的資源,操作系統知道哪些是用戶進程,哪些是系統進程。兩者可以通過通過特權級的標誌來加以區別。由此,CPU就知道了當前運行的是再特權級還是再用戶級,也可以粗略的說成,是工作在用戶態還是核心態。


有專門的寄存器來標識當前是處於哪種特權狀態,用戶程序想要從低特權切換到高特權可以通過使用特定的切換指令。

不過這種指令在執行之後會強制跳轉到操作系統初始化時設定的指定地址上執行,執行完後再跳回原地址。用戶程序無法修改這個過程。


如果從事嵌入式開發,對Linux和ARM比較熟悉,建議學習一下:

  • ARM處理器的普通模式和特權模式、協處理器
  • Linux系統調用的實現及流程
  • 操作系統的用戶態和內核態,與CPU的普通模式、特權模式之間的關係


實際上CPU本身並不能區分是誰發出的指令,而是通過特權等級來區分。

為什麼需要特權等級?

我們先講講為什麼要區分內核態和用戶態,只有內核態才能操作系統內存、處理中斷等,也就是說用戶態不能夠隨便操作系統內存和處理中斷。如果用戶態想要處理這些,必須調用內核態提供的系統調用介面去實現,先從用戶態切換到內核態,再去執行。這樣保證了系統的安全性,不會因為用戶態的某些非法操作而導致整個系統奔潰。

某些指令只有在特權等級高的情況下才能允許被執行,因此內核態的特權等級比用戶態高,內核態可以執行所有等級的指令,而用戶態只能執行最低等級的指令。下面我們看下不同CPU體系架構下是如何實現的。

1. X86架構

代表企業是Intel和AMD。x86有4個特權級別,編號為0(特權最大)到3(特權最小),以及3個受保護的主要資源:內存、I/O埠和執行某些機器指令的能力。在任何給定的時間,x86 CPU都以特定的特權級別運行,這決定了代碼可以做什麼和不能做什麼。這些特權級別通常被描述為保護環,最裡面的環對應於最高的特權。大多數現代x86內核只使用兩個特權級別:Ring 0 對應內核模式,Ring 3對應用戶模式。

代表企業是Intel和AMD。x86有4個特權級別,編號為0(特權最大)到3(特權最小),以及3個受保護的主要資源:內存、I/O埠和執行某些機器指令的能力。在任何給定的時間,x86 CPU都以特定的特權級別運行,這決定了代碼可以做什麼和不能做什麼。這些特權級別通常被描述為保護環,最裡面的環對應於最高的特權。大多數現代x86內核只使用兩個特權級別:Ring 0 對應內核模式,Ring 3對應用戶模式

RobotCode俱樂部:CPU的運行級別和保護機制?

zhuanlan.zhihu.com圖標

2. ARM架構

AArch64提出了簡單的4種特權模式EL(exception level),分別是EL0,EL1,EL2,EL3

  • EL0 : 運行應用程序
  • EL1 : 運行操作系統
  • EL2 : 運行虛擬機
  • EL3 : 運行安全管理

其中EL3的運行許可權最高,EL0的運行許可權最低。運行許可權,會影響資源的訪問。

ARMv8架構簡介 | 駿的世界?

www.lujun.org.cn圖標

3. PPC架構

PowerPC 體系結構分為三個級別(或者說是「book」)。通過對體系結構以這種方式進行劃分,為實現可以選擇價格/性能比平衡的複雜性級別留出了空間,同時還保持了實現間的代碼兼容性。

  • Book I. 用戶指令集體系結構。定義了通用於所有 PowerPC 實現的用戶指令和寄存器的基本集合。這些是非特權指令,為大多數程序所用。
  • Book II. 虛擬環境體系結構。定義了常規應用軟體要求之外的附加的用戶級功能,比如高速緩存管理、原子操作和用戶級計時器支持。雖然這些操作也是非特權的,但是程序通常還是通過操作系統調用來訪問這些函數。
  • Book III. 操作環境體系結構。定義了操作系統級需要和使用的操作。其中包括用於內存管理、異常向量處理、特權寄存器訪問、特權計時器訪問的函數。Book III 中詳細說明瞭對各種系統服務和功能的直接硬體支持。

PowerPC 體系結構開發者指南?

www.ibm.com

4. MIPS架構

在MIPS體系結構中,最多支持4個協處理器(Co-Processor)。其中,協處理器CP0是體系結構中必須實現的,它起到控制CPU的作用。MMU、異常處理、乘除法等功能,都依賴於協處理器CP0來實現。它是MIPS的精髓之一,也是打開MIPS特權級模式的大門。

https://jiaojinxing.github.io/2015/09/21/MIPS-%E5%AD%A6%E4%B9%A0/?

jiaojinxing.github.io

如何提高特權等級?

特權級間轉移控制的方法是使用門。段描述符用於描述內存段,門描述符則用於描述可執行的代碼,例如一個程序、一個過程或者一個任務。不同特權級間的過程調用可以使用調用門,中斷處理過程使用中斷門或陷阱門,任務間的切換使用任務門。調用門是安裝在描述符表(GDT 或 LDT)中的描述符。

代碼信條 - Code Belief?

www.codebelief.com圖標

原答案存在錯誤,已刪除

計算機科學中的分級保護域或者說環形保護就是用來提高容錯度,避免惡意操作,提高計算機安全的設計方式。

在計算機體系中,常用兩個或多個環來代表多個特權態,通常ring0具有最高特權,高特權的ring可以任意訪問低特權ring的資源,同樣低特權ring可以通過預定義的方式來訪問高特權ring的資源。

Intel處理器存在四種不同的特權級,ring0到ring3代表不同的許可權等級。ring0擁有cpu完整的控制權,可以使用所有指令,而ring3僅能執行非特權代碼。

特權的識別涉及到段選擇器,段選擇器的引入是因為8086僅有16位的寄存器,僅允許代碼使用64K內存,所以Intel的工程師使用段選擇器來告訴處理器要使用的代碼在哪個內存段上。如今的x86處理器依舊保留並啟用了段選擇權,儘管分段依舊存在,但實模式和保護模式的工作原理並不相同。

在保護模式下,段選擇器是一個包含索引的段描述符,段有代碼、數據和系統三種類型,這些段描述符存在全局描述符表(GDT)和本地描述符表(LDT)中。

數據段選擇器的全部內容通過代碼直接載入到各種段寄存器中,比如堆棧段寄存器和數據段寄存器。對於GDT,TI位為0,對於LDT,TI位為1,RPL則是請求的特權級,而代碼段選擇器的CPL則記錄了CPU當前的特權級別。

CPU在載入數據段選擇器時將進行以下檢查

由於較高的數字代表了更低的特權,因此上面的MAX()會選擇CPL或RPL中特權最低的那項,並將其與描述符特權級別(DPL)進行比較,如果DPL更高或相等則允許訪問。該設計背後的思路是運行內核代碼用更低的特權來載入段,例如可以用RPL=3來載入用戶模式可訪問的段。

然後我們需要讓CPU能夠在不同特權級之間切換,且這個過程是受控的,因此使用門描述符和sysenter指令來完成。

門描述符分為四個子類型:調用門描述符,中斷門描述符,陷阱門描述符和任務門描述符,其中調用門和任務門使用相對較少,剩下兩個用於處理硬體中斷和異常。這些門描述符存儲在中斷描述表(IDT)中,中斷永遠無法將控制權從高特權ring轉移到低特權ring,特權必須保持不變或被提升。無論那種情況,CPL都將等於目標段的DPL,如果CPL被修改,將會發生堆棧切換。

最後當需要返回ring3是,內核會發出iret或sysexit指令,分別從中斷和系統調用中返回,從而離開ring0並將CPL恢復為用戶模式的3。

一般情況下操作系統和程序都是用戶模式運行,只有內核才會運行在ring0,日常使用中看到的許可權管理都是操作系統實現的。

參考資料:https://manybutfinite.com/post/cpu-rings-privilege-and-protection/


粗略來講,開機後第一個指令特權等級是最高的,他調度別的線程,當然可以設置一個比他低的特權等級的上限。一個應用程序作為被調用的,從一開始就是最低等級,自己當然升不上去。


用戶態/內核態在CPU裏是有一個狀態位來記錄的,CPU就是根據這個狀態位來判斷。保證這個狀態位當且僅當在操作系統內部為內核態,是操作系統的任務。

參考資料:

深入理解計算機系統

Intel x86/x64軟體開發者手冊


順著這個頁面去了解,各種體系都有所覆蓋。想深入瞭解具體一個體系,可以去找對應的開發手冊。

https://en.m.wikipedia.org/wiki/Memory_management_unit


CPU有專為操作系統保留的特權指令,但無論如何,也還是指令,對CPU來說,其與普通指令沒啥區別

就象CPU並不在乎這條指令是老張發出的,還是老王發出的,它只管執行就是了


CPU內部有狀態寄存器保存自己在ring幾。


抽像一點說就是來自內核空間還是用戶空間,哈哈哈哈~ 我瞎說的~別信!


我理解cpu不會區分指令來自用戶還是操作系統,他只是根據狀態判斷是否能執行某條指令,比如ring 0-3


推薦閱讀:
相關文章