學過保護模式的人都知道,cpl,rpl,dpl是保護模式中很重要的幾個概念.這些概念是理解保護模式的基礎.
每一段**,在她誕生之後,就開始靜靜地等待著,等待著被執行.可能這就是她們存在的意義吧.某位先知曾經說過,沒有被執行過 的**是悲哀的,沒有崩潰過的程式是不完整的. 當某段**開始被執行的時候,她的特權級別將會被設定在cs 暫存器的低兩位,於是 她就開始執行, cpl - current privilege level,顧名思義, 就是正在執行的**所在段的特權級.這個時候,如果你要訪問某段 東東(資料||**||堆疊||?),在保護模式下,作業系統會檢查下你的特權級別.這個時候就需要用到dpl和rpl了, 所謂dpl 就是descriptor privilege level,簡單的說就是每個段的描述符裡規定好的,你訪問這個段需要的許可權級別.而rpl request privilege level,這個就 比較有意思,顧名思義, 它應該指的是,當你要訪問某個段的時候,你實際上想使用的一種身份(許可權).怎麼說了,我們訪問乙個段的時候,都是通過乙個16位的 段選擇子和32位的位址偏移來訪問的,這個段選擇子的高13位是乙個索引,第2位是table 型別,就 是放段描述符的一張表,每個段描述符就是乙個8位元組的東東.第0,1位就是表示rpl,那麼,我們就可以設定rpl來表示我們請求以什麼樣 的許可權來訪問這個段.
下面根據我們所要訪問的段的型別不同分類討論:
1.目標段是堆疊段或資料段 在保護模式下,原則上是不允許低特權級的**訪問高特權級的資料段或**段,也就是說要滿足條件: cpl <= dpl && rpl <= dpl, 這個應該很好理解,例如dpl 為1, cpl 為0, prl 為1,也就是說,雖然我有 0的特權級,但是我只以1(prl)的特權級來訪問目標段,在這裡已經是足夠的.當然如果cpl 為2,那麼即使你宣稱 要以0的特權級來訪問也是被禁止的.
2.目標段是**段 我們再來看一下段描述符,段描述符中有一位用來表示該**段是一致**段還是不一致**段.而段描述符是 有幾種型別的,比如**段描述符,呼叫門描述符. 理論上說,**跳轉有兩種,一種是jmp(call)指令後直接跟的是**段描述符,我們下面定義這種跳轉為ajump/acall, 另一種是 jmp(call)指令後跟的是呼叫門描述符,我們後面稱之為bjump/bcall 當發生了乙個**跳轉,作業系統會檢查目標**段的描述符,如果發現
a.目標**段是一致性**段 遊戲規則是,如果是ajump/acall 的跳轉方式需要滿足條件 cpl>=dpl,否則產生異常,跳轉後的cpl將保持不變,如果採用的是 bjump/bcall 的跳轉方式需要滿足條件 cpl==dpl && rpl <= cpl,因此跳轉後cpl 也將保持不變.
b.目標**段是非一致性**段 遊戲規則是,如果是ajump/acall如果是ajump/acall 的跳轉方式需要滿足條件 cpl>=dpl,否則產生異常,跳轉後的cpl將保持不 變,但是如果採用bjump/bcall 的跳轉方式需要滿足條件cpl >= dpl,跳轉後cpl被 置為dpl(這種情況有可能造成cpl提公升). 簡單的說,作業系統就是按照這些遊戲規則來管理特權級的.乍一看,似乎rpl沒什麼用?既然存在,就必定有理由,當一段cpl為3的 **跳轉到dpl為1的**段的時候,這個時候如果沒有rpl,那麼就可能導致這段**通過執行dpl為1的**的時候訪問dpl為1的資料 段和堆疊段,所以在跳轉的時候,作業系統可以將rpl設定為原先跳轉前**的特權級3,那麼當跳轉到dpl為1的**段的時候,cpl為 1,rpl為3,仍然可以限制訪問dpl為1的資料段,這樣其實也就實現了對某些敏感資料段的保護.
進入保護模式
本文為 每個描述符佔8位元組,下圖中,上面位高32位,下面為低32位 disk boot ata channel 0 first hd cd on channel 0 type of disk image這個選項是vpc,我用2.6.2配置時選vpc無法啟動,得選flat才可以,2.6.0貌似選vp...
進入保護模式
以下圖2,圖4和圖5截自intel手冊 每個描述符佔8位元組,下圖中,上面位高32位,下面為低32位 disk boot ata channel 0 first hd cd on channel 0 type of disk image這個選項是vpc,我用2.6.2配置時選vpc無法啟動,得選fl...
保護模式小結
在gdt ldt以及idt中,每乙個描述符都有自己的界限和屬性等內容,是對描述符所描述物件的一種限定和保護 分頁機制中的pde和pte都含有r w以及u s位,提供了頁級保護 頁式儲存的使用使應用程式使用的是線性空間而不是實體地址,於是物理記憶體被保護起來 中斷不再像是模式下一樣使用,也提供特權檢驗...