• 特权级概述(哥子就想知道CPU是如何验证特权级的)GATE+TSS


    【0】README

    text description from orange’s implemention of a os .


    【1】特权级概述

    当当前代码段试图访问一个段或者门时,目标段的DPL将会和 CPL 以及段或门选择子的RPL相比较,如何比较:(这里是干货)

    • (1)数据段: DPL规定了可以访问此段的最低特权级;如一个数据段的DPL=1,那么只有CPL=0或1的程序才有权访问;
    • (2)调用门: DPL规定了当前执行的程序或任务可以访问此调用门的最低特权级(这与数据段是一致的);
    • (3)TSS: DPL规定了可以访问此TSS的最低特权级(这与数据段的规则是一致的);
    • (4)非一致代码段(不使用调用门的情况下): DPL规定了访问此段的特权级;如一个非一致代码段的特权级为0,那么只有CPL=0的程序才可以访问;
    • (5)一致代码段和非一致代码段(使用调用门的情况下): DPL规定了访问此段的最高特权级;如一个一致代码段的DPL=2,那么CPL=0或1 的程序将无法访问此段;
    • (5.1)即是说, 一致代码段允许低特权级访问高特权级,不允许高特权级访问第特权级;
    • (5.2)通过调用门访问的非一致代码段的特权级验证也是这样: 允许低特权级访问高特权级,不允许高特权级访问低特权级;
    • (6)以上的特权级检验(除开RPL)的话,都是允许同级特权级代码段间的访问的;

    【2】RPL-requested privilege level-请求特权级

    • 2.1) RPL 是通过段选择子的第0位和第1位表现出来的;
    • 2.2)即是说, 如果RPL的数字比CPL的数字大(即,其特权级比较小),那么RPL将会起决定性作用, 反之亦然;
    • 2.3) os 过程往往用 RPL 来避免低特权级应用程序访问高特权级段内的数据;
      这里写图片描述

    【3】不同特权级间的转移

    使用jmp 或 call 指令可以实现以下4 种转移:

    • 3.1) 目标操作数包含目标代码段的段选择子;
    • 3.2) 目标操作数指向一个包含目标代码段选择子的调用门描述符;
    • 3.3) 目标操作数指向一个包含目标代码段选择子的TSS;
    • 3.4) 目标操作数指向一个任务门, 这个任务门指向一个包含目标代码段选择子的TSS;

    我们来看看通过调用门来访问代码段是如何进行特权级验证的?(干货)
    假设我们想由代码A 转移到 代码B,运用一个调用门G ,即调用门G中的目标选择子指向代码B的段。进行特权级验证,涉及这么几个要素:CPL、RPL、代码B 的DPL(DPL_B)、调用门G 的DPL(DPL_G)。特权级验证方法如下(methods):

    • M1) A访问G 这个调用门时,规则相当于访问一个数据段,要求 CPL 和 RPL 都小于或者等于DPL_G。即是,CPL 和 RPL 需要比 DPL_G 更高的特权级上;
    • M2) 如果M1的验证通过的话,系统还要比较CPL 和 DPL_B;
    • M2.1) 如果代码B 是一致代码段的话,要求DPL_B <= CPL;
    • M2.2) 如果代码B 是非一致代码段的话,call 指令 和 jmp指令又会不同;
    • M2.2.1) 在用call 指令时,要求 DPL_B <= CPL;
    • M2.2.2) 在用jmp时,只能是 DPL_B=CPL;

    使用调用门进行转移时特权级检验的规则(call + jmp 跳转指令)

    这里写图片描述
    这里写图片描述
    将上图做个总结-Conclusion:

    • C1)目标是一致代码段: DPL_B<=CPL<=DPL_G && RPL<=DPL_G
    • C2)目标是非一致代码段
    • C2.1)采用 call 指令调用: DPL_B<=CPL<=DPL_G && RPL<=DPL_G
    • C2.2)采用 jmp 指令调用: DPL_B<=CPL<=DPL_G && RPL=DPL_G

    (Attention)

    因为从低特权级 跳转到 高特权级,是需要切换堆栈的,所以这就必须要用到TSS了。TSS里面存储有ring0~ring2共3个特权级的堆栈信息,当跳转到那个ring,就将其堆栈抽取出来赋给 ss 和 sp; 参见 http://blog.csdn.net/PacosonSWJTU/article/details/48657053

  • 相关阅读:
    del命令
    echo命令
    什么是批处理
    ubuntu禁止ping操作(禁用ICMP协议访问)
    树莓派:raspberry pi 3b
    小tips合集
    吐个槽:bose的售后真心差劲!愧对这个顶级音响产品!
    WinSetupFromUSB
    win7 64位下vs不能以管理员身份运行的问题解决
    vs2010中如何设置Visual Assist方便地使用现成的代码编辑器风格
  • 原文地址:https://www.cnblogs.com/pacoson/p/4893149.html
Copyright © 2020-2023  润新知