DPL,RPL,CPL特权级别

 

DPL,RPL,CPL

 

DPL放在段/门描述符中,RPL位于选择子中,CPL即装载选择子的CS的可见部分的CS.RPL

 

数据段:数据段总是一致段,访问数据段需要满足max(RPL,CPL)<=DPL

 

有一个比喻非常形象:

 

总理(CPL=1),想访问市长(DPL=3),可以以省长的名义(RPL=2)进行访问。当然如果以乡长的名义(RPL=4),估计就没有人理他了。

 

JMP,CALL直接跳转 

 

非一致代码段: 起到隔离的作用,需要CPL=DPL,同时RPL<=DPL。并且CS中的特权级字段不会改变,仍为

                   调用者的CPL,这样只能在相同级别的代码段间进行转移。

一致代码段:需要CPL<=DPL,但是CPL会传递下去,不检测RPL。这样只能逐渐向高级别的代码段进行转移。

 

这两种情况CPL都没有改变,都为调用者的CPL。

 

直接跳转不能自由的在各种级别的代码间转移,可以采用调用门的方式

 

访问门的方式和访问数据段的方式一样

需要max(RPL,CPL)<=Gate.DPL

对于CALL:不管是一致代码段或是非一致代码段均有CPL<=DPL

对于JMP: 对于非一致代码段CPL=DPL,一致代码段CPL<=DPL

 

堆栈切换

对于JMP不存在堆栈切换,短JMP对应段内跳转,长JMP对应段间跳转 

对于CALL,若存在特权级变换,则有堆栈切换 

 

存在一个TSS,里面保存了各个特权级的堆栈的ss,esp

当向高的特权级代码段跳转时,需要首先将调用者的堆栈复制到被调用者的堆栈中

 

例如:

调用者堆栈:参数一 参数二 参数三 

被调用者堆栈: 调用者ss,调用者esp,参数一,参数二,参数三,调用者cs,调用者eip

其中调用者ss和调用者esp是根据调用者的特权级DPL在TSS中获得的

 

当返回时,可以根据堆栈中的内容得到正确的调用者的ss和esp。

 

 

 

 

你可能感兴趣的:(DPL,RPL,CPL特权级别)