一步步编写操作系统 54 CPL和DPL入门1
我們在工作中,公司都給員工配有員工卡,此員工卡就是員工身份的“標簽”,用它來出入公司、食堂就餐等。給公司創造價值的是員工的生產力,不是員工卡,員工卡只是公司人事部門管理員工的一種手段而已。
現在說計算機,既然是用特權級來維護計算機世界的和平,那總該給每個被管理的對象加個特權“標簽”,也就是說cpu得知道誰的特權高誰的特權低,這樣才能辨識出是否有低特權級的程序越級訪問高特權級資源的違法行為。
員工的標簽體現在工卡,計算機特權級的標簽體現DPL,CPL和RPL,下面咱們圍繞這幾個概念展開討論。
先看看訪問者的特權標簽在哪里。
最初我們剛接觸保護模式的時候,最先感受到的區別是,訪問內存不像在實模式下那么自由、直接啦,在保護模式下有了段描述符,訪問內存得先經過它才行,它的作用是通過各種屬性描述一段內存區域,該描述符就相當該內存區域的“身份證”。
前情提要,x86訪問內存的機制是“段基址:偏移地址”,無論是實模式還是保護模式,都要遵循此方式。在實模式下,段基址直接寫在段寄存器中,而在保護模式下,段寄存器中的不再是段基址,而是段選擇子,通過該選擇子從GDT或LDT中找到相應的段描述符,從該描述符中獲取段的起始地址。大伙兒還記得選擇子的結構吧,第0~1位是RPL字段,第2位是TI位,第3~15位是段描述符索引,好啦,回憶到此為止。咱們要關注的就是RPL字段,它就是請求特權級,后面講RPL的時候咱們會細說。請求特權級中的“請求”是個動詞,只有具備“能動性”的訪問者才能做出動作。
話說回來了,誰是訪問者?計算機中,具備“能動性”的只有計算機指令,只有指令才具備訪問、請求其它資源的能力,指令便是資源的請求者。指令“請求”、“訪問”其它資源的能力等級便稱之為請求特權級,指令是存放在代碼段中,所以,就用代碼段寄存器CS中選擇子的RPL位表示代碼請求別人資源能力的等級。代碼段寄存器CS和指令指針寄存器EIP中指向的指令便是當前在處理器中正在運行的代碼,所以,位于CS寄存器中選擇子低2位的值不僅稱為請求特權級,又稱為處理器的當前特權級,也就是說處理器的當前特權級是CS.RPL。
處理器的當前特權級的真實面目是什么?
在cpu運行的是指令,其運行過程中的指令總會屬于某個代碼段,該代碼段的特權級(也就是代碼段描述符中的DPL)便是當前cpu所處的特權級,這個特權級稱為當前特權級,即CPL(Current Privilege Level),它表示處理器正在執行的代碼的特權級別。除一致性代碼段外(后面會說),轉移后的目標代碼據段的DPL是將來處理器的當前特權級CPL。
指令最終是用處理器執行的,執行到不同特權的代碼,處理器的特權級就換到不同的等級。所以,當前特權級實際上是指處理器當前所處的特權級,是指處理器的特權角色,更形象一點地說,是指cpu當前在計算機世界中的特權地位。再次提醒大伙兒,在任意時刻,當前特權級CPL保存在CS中選擇子中的RPL部分。
當前特權級是存儲在CS.RPL中,誰為代碼段寄存器CS賦值的呢? 要回答上面的問題,得先搞清楚處理器的當前特權級為什么會變化。
當前正在運行的代碼所在的代碼段的特權級DPL就是處理器的當前特權級,當處理器從一個特權級的代碼段轉移到另一個特權級的代碼段上執行時,由于兩個代碼段的特權級不一樣,處理器當前的特權身份起了變化,這就是當前特權級CPL改變的原因。好像說的有點神秘,其實就是使用了那些能夠改變程序執行流的指令如int、call等,這樣就使CS和EIP的值改變,從而使處理器執行到了不同特權級的代碼。不過,特權轉移可不是隨便進行的,處理器要檢查特權變換的條件,這里咱們暫不討論條件是什么,因為它需要過會兒結合RPL一塊說,等小弟把RPL給大伙兒說清楚了再解釋這個“條件”不遲。當處理器特權級檢查的條件通過后,新代碼段的DPL就變成了處理器的CPL,也就是目標代碼段描述符的DPL將保存在代碼段寄存器CS中的RPL位。
總之,代碼是資源的請求者,代碼段寄存器CS所指向的是處理器中當前運行的指令,所以代碼段寄存器CS中選擇子的RPL位稱為當前特權級CPL,這是再合理不過的事了。
RPL變成了CPL,似乎有點暈是嗎?其實只是代碼段寄存器CS中的RPL是CPL,其它段寄存器中選擇子的RPL與CPL無關,因為CPL是針對具有“能動性”的訪問者(執行者)來說的,代碼是執行者,它表示訪問的請求者,所以CPL只存放在代碼段寄存器CS中低2位的RPL中。
以上幾段內容想表達的就是處理器的當前特權級CPL為什么放在CS.RPL中,CPL和CS.RPL有什么關系,不信您再回頭看一遍^_^。
大多數情況下,處理器都是在“訪問者”訪問“受訪者”時進行特權檢查,訪問者(某個代碼段)的特權就是當前特權級CPL,在進行特權檢查時,都會以CPL為基礎,說到這里,不禁我要自問一下,既然CPL就是目標代碼段的DPL,那處理器總該有個初始CPL吧。答案是肯定的,特權級是保護模式下的概念,處理器進入保護模式后才有的當前特權級,讓我們回憶下處理器是怎么進入保護模式的,也許答案自然就揭曉啦。
在這之前,我和大家說過,MBR從BIOS接過接力棒的時候,它已經處于0特權級啦,其實這么說不太合適,畢竟在保護模式下才有特權級,而MBR是運行在實模式下,還談不上特權級。BIOS將控制權交給MBR,是用一個遠跳轉指令實現的,即jmp 0:0x7c00,也就是說進入MBR后,段寄存器CS會被替換為0,如果此時把CS看作是選擇子的話,RPL的值為0,也就是說“相當于”處于0特權級,段寄存器CS為0的情況一直持續到在loader中進入保護模式之后的第一條指令:流水線刷新跳轉。該跳轉語句如圖
總結
以上是生活随笔為你收集整理的一步步编写操作系统 54 CPL和DPL入门1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 招行信用卡分期购车要首付吗 招行信用卡分
- 下一篇: 由浅到深理解ROS(8)-线程管理