特權級
也就是描述符中的DPL(實模式與保護模式)
作用:
在進行內存訪問時(保護模式下的內存訪問),用於控制操作或者限制訪問性,其實也就是滿足了特權級的轉換規則,才允許操作,不然就是不合法的內存訪問。
概述:
特權級分爲4級:
特權級級別 | 通常歸屬的對象 |
---|---|
0 | 操作系統 |
1 | 系統服務程序 |
2 | 系統服務程序 |
3 | 普通用戶程序 |
P.S.就是因爲分 了4個級,因此描述符中需要2bit來表示
當然這也只是大概的分類,沒有硬性要求,如果不想使用特權級機制,可以把所有段描述符的特權級都設爲0
分類:
DPL:段描述符自身的特權級
CPL:當前特權級(當前執行的代碼所屬的特權級)
RPL:請求特權級,就是發生內存訪問時(保護模式下的內存訪問),訪問之前的代碼段的特權級爲請求特權級
例子:
有兩個段描述符A、B,它們分別都具有自己的DPL,A的DPL是0,B的特權級3,當前正在執行的段爲A,因此CPL爲0,然後A訪問B,訪問之後,現在正在執行的代碼段爲B,因此CPL變爲3,而現在RPL爲0.
特權級檢查規則(保護機制)
1.將控制直接轉移到非依從的代碼段,要求當前特權級(CPL)和請求特權級(RPL)都等於目標代碼段描述符的DPL
在數值上表示爲:
CPL = 目標代碼段描述符的DPL
RPL = 目標代碼段描述符的DPL
2.將控制直接轉移到依從的代碼段,要求CPL和RPL都低於或者等於目標代碼段描述符的DPL
在數值上爲:
CPL >= 目標代碼段描述符的DPL
RPL >= 目標代碼段描述符的DPL
3.高特權級別的程序可以訪問低特權級別的數據段,但低特權級別的不能訪問高特權級別的數據段
在數值上爲:
CPL <= 目標代碼段描述符的DPL
RPL <= 目標代碼段描述符的DPL
4.任何時候,棧段的特權級別必須和CPL相同
在數值上爲:
CPL = 目標代碼段描述符的DPL
RPL = 目標代碼段描述符的DPL
特權級之間的訪問方法
1.同級之間可以相互訪問
直接可以相互訪問
2.低級訪問高級
2.1將高特權級的代碼段定義爲依從的(實模式與保護模式):
要求:CPL必須低於或者等於目標代碼段描述符的DPL。
特點:依從的代碼段不是在它的DPL上運行,而是在調用者的DPL上運行
2.2使用調用門:
使用方法:使用jmp far或者call far
特點:
1.jmp far:不改變CPL
2.call far:CPL會提升到目標代碼段的DPL
要求:當前特權級CPL必須低於或者等於目標代碼段描述符的特權級DPL
3.高級訪問低級(代碼段)
使用調用門:
使用方法:使用jmp far或者call far
特點:
1.jmp far:不改變CPL
2.call far:CPL會提升到目標代碼段的DPL
要求:當前特權級CPL和請求特權級RPL都必須高於或者等於目標代碼段描述符的特權級DPL
在數值上:
CPL >= 目標代碼段描述符的DPL
RPL >= 目標代碼段描述符的DPL
總結
其實,特權級也就和read、write屬性的作用差不多,內存訪問之前,檢測訪問是否合法,然後該怎樣就怎樣做。
本質上,都是用來加強分段機制的安全性。
++++++++++++++++++++++++++++++++++++++++++++++
更新:
看到上面的特權級的介紹就感覺挺麻煩的,對的!是非常非常麻煩,當使用特權級機制後,代碼比沒有用特權級機制,要複雜好多好多。。。