在ia32的作業系統中,段被分為了4個特權級,分別為0-3級,有時候我們也叫做ring0-ring3,其中,數值越小特權級越高。如下圖所示:
圖中,核心**和資料所在的段的特權級都比較高,一般在ring0,而使用者程式所在的段的特權級較低,一般在ring3。當低特權級的任務試圖在未被允許的情況下訪問高特權級的段時,將會產生常規保護錯誤。
而處理器是如何區分所在段的特權級,進而對其進行保護的呢?這就不得不提到cpl、dpl和rpl三者了。但是在開始之前,我們需要先了解一下一致**段和非一致**段。
在作業系統中,我們有些高特權級的**是希望被低特權級的程式所訪問的,比如一些庫函式,於是我們將這些高特權級**放在乙個叫做一致**段的段裡。而有些高特權級的**,我們並不想讓低特權級的程式所訪問,於是我們把他們放在乙個叫做非一致**段的段裡。具體來說,當通過call或者jmp指令轉移到其它段時(即訪問其他段),當轉移的目標是乙個優先順序更高的一致**段時,我們是可以進行訪問的,但是當前的特權級會被延續下去;當轉移的目標是乙個優先順序更高的非一致**段時,這時的訪問會引起常規保護錯誤(除非使用呼叫門或任務門)。
總結來說:
所遵循的規則如下圖所示:
cpl全稱current privilege level,顧名思義,cpl代表的是當前執行的任務和程式的特權級。它儲存在cs和ss的第0位和第1位上。一般情況下,cpl等於**所在段的特權級,當程式轉移到不同的**段時,處理器將改變cpl的值。
但是當訪問一致**段時,並不會改變cpl,正如一致**段中所說,一致**段可以被低特權級的程式所訪問,但是並不會改變特權級,所以也就不會改變cpl,這就是與上面加粗的「一般情況」相對的「非一般情況」。
dpl全程為descriptor privilege level,它代表段或者門的特權級。他被儲存在段描述符或者門描述符屬性中的dpl欄位上。
當當前的**段試圖訪問乙個段或者門時,dpl將會和cpl以及段或者門選擇子的rpl相比較,而對於段或者門型別的不同,比較規則也不同,具體如下:
總結一下就是:
rpl全稱是requested privilege level。rpl儲存在段選擇子的第0位和第1位上。我們在上文說了當乙個段訪問另乙個段時,cpl與dpl的比較規則,但是僅僅比較cpl和dpl是不夠的,處理器還要通過檢查rpl來確定能否訪問另乙個段。
作業系統往往用rpl來避免低特權級應用程式訪問高特權級段內的資料,即便提出訪問請求的段有足夠的特權級,如果rpl不夠也是不行的,當rpl的值比cpl大的時候,rpl將起決定性作用。也就是說,只有當cpl和rpl都小於要訪問的資料段的dpl時,才有許可權訪問該資料段。關於為什麼引入rpl的討論還是比較複雜的,此處不再深入**。
完參考:
保護模式特權級變換總結
特權級的東西很亂,我決定今天花一點時間好好的整理一下,我一步一步慢慢開始,比較鬱悶的是還不知道理解得正確不正確,先寫著吧 首先,特權級別一共有四個特權級別 0 3 然後呢,數字越小,級別越高。其次,處理器通過cpl,dpl,rpl來進行特權級管理。接下來,我想分為2種模組來總結,之前,我一直沒把特權...
x386保護模式下的特權級互相跳轉小結
特權級別互相跳 從內 外 使用ret命令 或者retf命令實現長返回。短返回和長返回是不一樣的,主要是當時入棧時候cs要不要入棧 其實這裡用的是帶特權級變化的長返回進行特權級別跳轉的。從外 內 使用門,但是因為在特別級別之間互相呼叫的時候,涉及到堆疊的切換,所以要使用乙個tss task state...
進入保護模式
本文為 每個描述符佔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...