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。