CPU如何區分指令來自操作系統還是用戶進程的?
用戶程序通過系統調用進入內核態,內核態下可以讓操作系統執行一些用戶進程不能執行的特權指令。
假如用戶進程存在特權指令,最終都是交於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.com2. ARM架構
AArch64提出了簡單的4種特權模式EL(exception level),分別是EL0,EL1,EL2,EL3。
- EL0 : 運行應用程序
- EL1 : 運行操作系統
- EL2 : 運行虛擬機
- EL3 : 運行安全管理
其中EL3的運行許可權最高,EL0的運行許可權最低。運行許可權,會影響資源的訪問。
ARMv8架構簡介 | 駿的世界?www.lujun.org.cn3. 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)中的描述符。