保护模式特权级检验

基本说明

  • 一些术语

    • DPL --- 写在段描述符中的特权级

    • RPL --- 写在段选择子中的特权级

    • CPL --- 当前代码的特权级,一般情况下是当前运行代码的特权级。但是对于一致代码段,从低优先级条路高优先级的时候,  CPL为低优先级代码段的特权级

  • 数据段 / TSS / 调用门的特权级检查: CPL <= DPL && RPL <= DPL

  • 一致代码段和通过门调用的非一致代码段特权级检查: DPL规定了访问所需要的最高优先级 ( CPL >= DPL )。假设DPL = 1, 那么特权级为2 / 3的可以访问,特权级为0的就不能访问。对一致代码段的直接访问,CPL并不会变成目标段的DPL,而是保持原始值

  • 不通过门调用的非一致代码段特权级检查: CPL = DPL && RPL <=&#160; DPL

&#160;

代码调用详细解释 ( jmp / call)

  • 直接调用段选择子,这种情况

    • 目标是非一致代码段,那么CPL = DPL && RPL <= DPL

    • 目标是一致代码段,那么CPL >= DPL,并且跳转后,CPL保持不变

  • 通过调用门,这种情况 ( call gate ), for example A call B throught G,可以实现低特权级代码call 高特权级代码。 当特权级从低切换到高的时候,堆栈将发生切换

    • 堆栈切换的时候,目标段的ss / sp从tss段获取。tss实际上就是一段数据段,其中反正ring0 --- ring2的ss和sp。在调用调用门之前,需要load tss ( ltr 指令)

    • CPL <= DPL_G && RPL <= DPL_G&#160; and

    • 如果B是一致代码段, CPL >= DPL_B; 如果B是非一致代码段,并且使用Call,CPL >= DPL_B; 如果B是非一致代码段,并且使用jmp,&#160; 那么CPL=DPL_B


&#160;

附件1 --- 从低特权级代码条路高特权级代码堆栈切换示意图

保护模式特权级检验_第1张图片

你可能感兴趣的:(保护模式特权级检验)