特权级概述

IA32的分段机制中,特权级总共有4个,较为核心的代码放在特权级较高的层级中,这种机制避免低特权级的任务在不被允许的情况下访问高特权级的段,如果处理器检测到访问请求不合法,将会产生常规保护错误。

内核是level0 服务是level1和level2,应用程序是level3

处理器通过识别CPL、DPL、RPL这三种特权级进行特权级检验

CPL (current privilege level)是当前执行程序或任务的特权级,它被存储在cs和ss的第0位和第1位。在通常情况下,CPL等于代码所在的段的特权级,当程序转移到不同特权级的代码段时,处理器将会改变CPL
当遇到一致代码段时,情况有点特殊,一致代码段可以被相同或者更低特权级的代码访问,当处理器访问一个与CPL特权级不同的一致代码段时,CPL不会被改变

DPL(descriptor privilege level)表示段或者门的特权级。他被存储在段描述符或者门描述符的DPL字段中,当当前代码段试图访问一个段或者门时,DPL将会和CPL以及段或门的选择子的RPL相比较,具体情况如下
数据段:DPL规定了可以访问此段的最低特权级。比如,一个数据段的DPL是1,那么只有运行在CPL为0或者1的程序才有权访问它
非一致代码段(不使用调用门的情况下):DPL规定访问此段的特权级。 比如,一个非一致代码段的特权级为0,那么只有CPL为0的程序才能访问它
调用门:DPL规定了当前执行的程序或任务可以访问此调用门的最低特权级(与数据段的规则是一致的)
一致代码段和通过调用门访问的非一致代码段:DPL规定了访问此段的最高特权级,比如,一个一致代码段的DPL是2,那么CPL为0和1的程序将无法访问此段
TSS:DPL规定了可以访问此TSS的最低特权级(与数据段规则一致)

RPL(request privilege level)是通过段选择子的第0位和第1位表现出来的。处理器通过检查RPL和CPL来确认一个访问请求是否合法。即便提出访问请求的段有足够的特权级,如果RPL不够是不行的。也就是说,如果RPL的数字比CPL大,则RPL将起决定性的作用(对于访问请求段而言)
操作系统用RPL来避免低特权级应用程序访问高特权级段内的数据。当操作系统过程(被调用过程)从一个应用程序(调用过程)接收到一个选择子时,将会把选择子(即将访问段的选择子)的RPL设成调用者的特权级,于是,当操作系统用这个选择子去访问相应的段时,处理器将会用调用过程的特权级(已经被存在RPL中),而不是更高的操作系统过程的特权级(CPL)进行特权检验,这样,RPL就保证了操作系统不会越俎代庖的代表一个程序去访问一个段,除非这个程序本身是有权限的。

将LABEL_DESC_DATA对应的段描述符的DPL修改为1
LABEL_DESC_DATA: Descriptor 0, DataLen - 1, DA_DRW+DA_DPL1

继续修改,把对刚才修改过的数据段的选择子的RPL改为3
SelectorData equ LABEL_DESC_DATA-LABEL_GDT+SA_RPL3
此时若是运行程序,程序会崩溃,原因在于违反了特权级的规则,用RPL=3的选择子去访问DPL=1的段

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值