1. 程式人生 > >關於CPL、DPL、RPL(3)

關於CPL、DPL、RPL(3)

關於CPL、DPL、RPL

這幾個概念剛開始是有點難理解的,因為各種情況都有,有點複雜。我覺得最簡單的辦法就是,把程式的各種段,理解為國家的各種政府機構,例如省級機構、市級機構、縣級機構等,DPL就是用來標識這個的,這是個靜態的概念,省級的機構辦省級的事,市級的機構辦市級的事,設定好了各自的職權範圍。而執行程式,可以理解為去這些機構辦事,CPL就是你當前的身份。而RPL呢,可以理解為,你去辦事的時候,希望以什麼樣的身份去辦事。

這裡還涉及一個概念:一致程式碼段和非一致程式碼段。這兩個概念有點拗口難理解,“一致”與“非一致”有點類似政府的辦事機構的不同性質,“非一致”的機構,就是那種吃飯不幹事的,老百姓想來辦事,直接攆出去,鳥都不鳥你。“一致”的機構,把老百姓當做自己家人,踏實為老百姓辦事的機構。
·
下面說下辦事的潛規則:
1.“非一致”的辦事機構,整天吃飯不幹事,除非你就是這機構裡的人員,其它人這個機構鳥都不鳥。
2.“一致”的辦事機構,你能進去辦事,但是進去後,你的老百姓身份並不會改變,只能辦老百姓的事,並不能說我一個普通老百姓,進去後要去管理這機構裡面的人。

CPL是當前執行的程式碼的特權級,儲存在CS和SS的第0、1位上。也就是說,特權級這裡只有四種,0,1,2,3。
DPL是段的特權級,可以是資料段、堆疊段或者程式碼段,這個很好理解,是個靜態的概念,這個DPL是在GDT建立段的時候,可以作為段的屬性進 行設定。

一致程式碼段和非一致程式碼段,這個屬性也是在GDT建立段的時候設定的。假如從A程式碼段要進入B程式碼段,1.如果B是非一致程式碼段,則要求執行A時的CPL=B的DPL。(同時要求RPL<= DPL)2.如果B是一致程式碼段,則執行A時的CPL>=B的DPL(RPL不檢查),進入B時,A的CPL會延續下來。

從上面總結下:使用jmp、call進行普通跳轉時,
1. 如果目標是非一致程式碼段,只能在相同特權級的程式碼間轉移;
2. 如果目標是一致程式碼段,則最多隻能從特權級低的程式碼轉移到高的程式碼,但是CPL不會改變。

從上面的第二點看,是不是有點失望,雖然能從低特權級轉到高特權級上去,但是你的身份還是沒有改變,就好比你去政府機構求人家辦事,你依然是個屌絲身份並沒有改變,咋辦呢,下面要提到的“呼叫門”就提供了這樣的機會,使用“呼叫門”,就好比考公務員,你有機會進去政府機構辦事,而且跟他們平起平坐。