前言
所有保护模式索引链接:保护模式笔记一 保护模式介绍
先前学习了段描述符的结构,这次来补充段描述符结构中的DPL(特权等级)相关的内容
段权限检查
CPU权限分级
在补充段权限检查之前,要了解CPU的权限分级
- 处理器的段保护机制定义了RING0,RING1,RING2,RING3一共4个特权级别
- 大多数现代操作系统将0级用于内核/可执行程序,将3级用于应用程序
- 可用于级别n的任何资源也可用于级别0到n,因此特权级别是环
- 当特权较低的进程尝试访问特权较高的进程时,将向操作系统报告常规保护错误异常
- 8086中的实模式程序在级别0(最高特权级别)上执行,而8086中的虚拟模式在级别3执行所有程序
- 多数现代x86内核仅使用两个特权级别,即RING0和RING3
|
RING0 |
RING1 |
RING2 |
RING3 |
通常用途 |
内核 |
特权代码、特权数据、特权栈 |
特权代码、特权数据、特权栈 |
应用程序 |
级别 |
最高 |
第二高 |
第三高 |
最低 |
对应层 |
内核层(内核态) |
|
|
应用层(用户态) |
内核层
在内核模式下,CPU可以执行其体系结构允许的任何操作。可以执行任何指令,启动任何I / O操作,访问任何内存区域,使用特权指令,控制中断、修改页表、访问设备等等
应用层
硬件会对CPU操作施加某些限制。通常,某些指令是不允许的(尤其是那些指令(包括I / O操作)可能会改变机器的全局状态),某些内存区域无法访问等。CPU的用户模式功能通常是这些指令的子集可以在内核模式下使用,但是在某些情况下,例如非本机体系结构的硬件仿真,它们可能与标准内核模式下的可用软件有显着差异
应用层切换内核层
应用程序的代码运行在最低运行级别上ring3上,不能做受限操作
如果要做受限操作,比如要访问磁盘,写文件,那就要通过执行系统调用(函数),执行系统调用的时候,CPU的运行级别会发生从ring3到ring0的切换,并跳转到系统调用对应的内核代码位置执行,这样内核就为你完成了设备访问,完成之后再从ring0返回ring3。这个过程也称作用户态和内核态的切换
CPU权限分级的作用
RING设计的初衷是将系统权限与程序分离出来,使之能够让OS更好的管理当前系统资源,也使得系统更加稳定
举个很常见的例子:
普通的应用程序崩溃一般是程序未响应或者停止运行,并不会影响系统的正常运行
但当驱动程序出现问题后,动辄 BSOD
(蓝屏死机)
判断程序特权级别
了解了CPU的权限分级后,再来了解 如何查看程序处于几环
这涉及到了CPL(Current Privilege Level) :当前特权级别
CPL是段寄存器CS和SS的段选择子的后两位
在保护模式笔记三 段描述符和段选择子中已经说明了段选择子的结构
|
Index |
TI |
RPL |
含义 |
索引 |
表指示器 |
请求特权等级 |
全称 |
Index |
Table Indicator |
Requested Privilege Level |
数据宽度 |
13位 |
1位 |
2位 |
对比可知,当段寄存器为CS和SS时,其段选择子的RPL就是CPL
通过OD附加应用程序后查看其段寄存器:
段寄存器 |
段选择子(Selector) |
二进制段选择子 |
二进制RPL |
十进制RPL |
ES |
23 |
0010 0011 |
11 |
3 |
CS |
1B |
0001 1011 |
11(CPL) |
3(CPL) |
SS |
23 |
0010 0011 |
11(CPL) |
3(CPL) |
DS |
23 |
0010 0011 |
11 |
3 |
FS |
3B |
0011 1011 |
11 |
3 |
根据CS和SS的段选择子可以得到CPL为3,印证了应用程序的CPU权限分级为RING3
EPL(有效特权级别)
上面提到了CPL(当前特权级别)和RPL(请求特权级别)
所谓的有效特权级别EPL(Effective Privilege Level),顾名思义就是最终的确定可否执行的特权
EPL = max(RPL,CPL)
即 EPL 等于 RPL和CPL的最大值,EPL为RPL和CPL中较低的权限
DPL(描述符特权级别)
关于DPL,在保护模式笔记四 段描述符结构中已经略微说明了,现在展开细说
DPL的作用
DPL存储在段描述符中,规定了访问该段所需要的特权级别是什么;即 如果想要加载某个段描述符,就必须具备对应的特权级别
DPL权限检查
当加载一个段描述符时,首先CPU要判断其P位(有效位),如果该段描述符有效,则继续进行DPL权限检查
所谓的DPL权限检查 就是 判断 DPL是否满足:EPL=max(RPL,CPL)<=DPL是否成立
只有当EPL<=DPL时,权限检查才通过,段描述符才能够被加载到段寄存器中
RPL |
CPL |
EPL |
DPL |
权限检查是否通过 |
0 |
0 |
0 |
0 |
√ |
0 |
0 |
0 |
3 |
√ |
0 |
3 |
3 |
0 |
× |
0 |
3 |
3 |
3 |
√ |
3 |
0 |
3 |
0 |
× |
3 |
0 |
3 |
3 |
√ |
3 |
3 |
3 |
0 |
× |
3 |
3 |
3 |
3 |
√ |
总结
|
RPL |
CPL |
EPL |
DPL |
含义 |
请求特权级别 |
当前特权级别 |
有效特权级别 |
描述符特权级别 |
说明 |
用什么权限去访问一个段 |
CPU当权的权限级别 |
max(RPL,CPL) |
访问该段所需要的特权级别 |