特权级保护

特权级

也就是描述符中的DPL(实模式与保护模式

作用:

在进行内存访问时(保护模式下的内存访问),用于控制操作或者限制访问性,其实也就是满足了特权级的转换规则,才允许操作,不然就是不合法的内存访问。

概述:

特权级分为4级:

特权级级别 通常归属的对象
0 操作系统
1 系统服务程序
2 系统服务程序
3 普通用户程序

P.S.就是因为分 了4个级,因此描述符中需要2bit来表示
当然这也只是大概的分类,没有硬性要求,如果不想使用特权级机制,可以把所有段描述符的特权级都设为0

分类:

DPL:段描述符自身的特权级

CPL:当前特权级(当前执行的代码所属的特权级)

RPL:请求特权级,就是发生内存访问时(保护模式下的内存访问),访问之前的代码段的特权级为请求特权级

例子:
有两个段描述符A、B,它们分别都具有自己的DPL,A的DPL是0,B的特权级3,当前正在执行的段为A,因此CPL为0,然后A访问B,访问之后,现在正在执行的代码段为B,因此CPL变为3,而现在RPL为0.

特权级检查规则(保护机制)

1.将控制直接转移到非依从的代码段,要求当前特权级(CPL)和请求特权级(RPL)都等于目标代码段描述符的DPL

在数值上表示为:
CPL = 目标代码段描述符的DPL
RPL = 目标代码段描述符的DPL

2.将控制直接转移到依从的代码段,要求CPL和RPL都低于或者等于目标代码段描述符的DPL

在数值上为:
CPL >= 目标代码段描述符的DPL
RPL >= 目标代码段描述符的DPL

3.高特权级别的程序可以访问低特权级别的数据段,但低特权级别的不能访问高特权级别的数据段

在数值上为:
CPL <= 目标代码段描述符的DPL
RPL <= 目标代码段描述符的DPL

4.任何时候,栈段的特权级别必须和CPL相同

在数值上为:
CPL = 目标代码段描述符的DPL
RPL = 目标代码段描述符的DPL

特权级之间的访问方法

1.同级之间可以相互访问

直接可以相互访问

2.低级访问高级

2.1将高特权级的代码段定义为依从的(实模式与保护模式):

要求:CPL必须低于或者等于目标代码段描述符的DPL。

特点:依从的代码段不是在它的DPL上运行,而是在调用者的DPL上运行

2.2使用调用门:

使用方法:使用jmp far或者call far

特点:

1.jmp far:不改变CPL
2.call far:CPL会提升到目标代码段的DPL

要求:当前特权级CPL必须低于或者等于目标代码段描述符的特权级DPL

3.高级访问低级(代码段)

使用调用门:

使用方法:使用jmp far或者call far

特点:

1.jmp far:不改变CPL
2.call far:CPL会提升到目标代码段的DPL

要求:当前特权级CPL和请求特权级RPL都必须高于或者等于目标代码段描述符的特权级DPL

在数值上:
CPL >= 目标代码段描述符的DPL
RPL >= 目标代码段描述符的DPL

总结

其实,特权级也就和read、write属性的作用差不多,内存访问之前,检测访问是否合法,然后该怎样就怎样做。
本质上,都是用来加强分段机制的安全性。
++++++++++++++++++++++++++++++++++++++++++++++

更新:

看到上面的特权级的介绍就感觉挺麻烦的,对的!是非常非常麻烦,当使用特权级机制后,代码比没有用特权级机制,要复杂好多好多。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章