我在一篇教程中讀到,x86架構中的大約15條指令不允許在用戶模式下使用。在linux用戶模式下使用指令的保護
我知道有個東西叫代碼段寄存器這使的當前previlege水平軌道
我的問題是
一)做CPU,之前執行的每一個指令必須檢查當前previlege水平它正在運行?
b)如果在用戶程序中存在無法在用戶模式下使用的指令,實際上會發生什麼情況?CPU在執行前如何知道這一點?
我在一篇教程中讀到,x86架構中的大約15條指令不允許在用戶模式下使用。在linux用戶模式下使用指令的保護
我知道有個東西叫代碼段寄存器這使的當前previlege水平軌道
我的問題是
一)做CPU,之前執行的每一個指令必須檢查當前previlege水平它正在運行?
b)如果在用戶程序中存在無法在用戶模式下使用的指令,實際上會發生什麼情況?CPU在執行前如何知道這一點?
在執行某些指令或其中某些部分(有很多非常複雜的邏輯指令和要執行的一組檢查取決於多個條件)之前,CPU會檢查CPL,RPL和類似的東西。
如果不允許指令執行,CPU會生成一個異常事件,然後將其分派給其處理程序。異常處理程序與本質上的中斷處理程序相似,並由OS定義。所以,當操作系統得到處理它無法糾正的異常時,它會終止導致異常的程序。
「可更正」異常的一個示例是已卸載到磁盤的虛擬內存的頁面故障。操作系統將應用程序嘗試使用的代碼/數據從磁盤加載回內存。
當前權限級別保存在CS寄存器的某個位(技術上位於x86的2位)。
代碼中不允許某些指令,可以阻止Ex用戶進行某些系統調用.int X(在彙編(x86)中導致系統調用),其中X是IDT(中斷描述符表)的索引。該索引指向系統調用。另外,稱爲DPL的字段存儲在IDT的每個條目中。
這是一個int指令後面的步驟:
•從IDT中獲取第n個描述符,其中n是int的參數。
•檢查%cs中的CPL是否爲< = DPL,其中DPL是描述符中的權限級別。
•如果是,那麼用戶代碼具有執行此係統調用的足夠特權,當前執行上下文被保存(寄存器等),因爲我們現在切換到內核模式。
•如果沒有,那麼用戶沒有足夠的權限來執行此操作,並且會導致執行int 13指令(一般性保護錯誤)
對於DO NOT DO指令的1個類別而言,這是如何執行檢查的,I我不知道它是如何完成其他指令的。
也用於通過GDT(門描述符表)訪問不同的段。方法是相同的。
PS:僅在基於x86的系統上有效。 請評價你所看到的保留條款清單的鏈接。
其實還有很多。希望我有時間寫一個答案,希望有人會向你解釋這一點。 :) – 2012-07-15 09:26:37
@DanielKamilKozar:請回答這個問題,當你是免費的,我無法找到答案:) – Dhatri 2012-07-15 09:37:55