【orange】特权级变换总结

特权级的东西很乱,我决定今天花一点时间好好的整理一下,我一步一步慢慢开始,比较郁闷的是还不知道理解得正确不正确,先写着吧:

首先,特权级别一共有四个特权级别(0-3),然后呢,数字越小,级别越高。

其次,处理器通过CPL,DPL,RPL来进行特权级管理。

接下来,我想分为2种模块来总结,之前,我一直没把特权级访问和特权级转移分开理解,这里我想分成2块来总结。

 

 

第一种:访问。

 

我想访问主要针对数据段,TSS之类的,当然代码段也会涉及,他们的规则如下:

 

数据段:DPL规定了可以访问此数据段的最低特权级。

非一致代码段:DPL规定了可以访问此代码段的特权级(即特权级必须相同)

调用门:DPL规定了可以访问此调用门的最低特权级

一致代码段:DPL规定了可以访问此一致代码段的最高特权级

TSS:DPL规定了可以访问此TSS的最低特权级

 

 

访问的规则应该主要是如上所述,我想访问的准确定义是对段或门进行读写吧

 

 

第二种:不同级代码段之间的转移。

主要说2种方式:

I.通过jmp和call直接转移:

对于这种直接转移的方法,会受到很大的限制,只有以下几种情况才能成功转移:

1.目标段是非一致代码段:要求CPL必须等于目标段的DPL,同时要求RPL小于等于DPL

2.目标段是一致代码段   :要求CPL大于或者等于目标段的DPL,此时RPL不做检查,且转移后,CPL会被延续,而不会变成目标段的DPL

 

 

II.通过调用门转移:

由于上面的转移方式受到诸多限制,所以调用门就显得很重要了。

 

A.call(通常是从低特权级代码段转至高特权级代码段)

准备工作:

1.准备一个调用门描述符和调用门选择子(注意描述符的DPL大于等于源代码段的CPL和RPL),并初始化

2.准备TSS,只需要目标段DPL的堆栈位置即可

3.加载TSS

4.call调用门

 

 

B.retf(通常从高特权级转至低特权级)

总结就四个压栈:

1.压入目标段的SS

2.压入目标段的esp

3.压入目标段的CS

4.压入目标段的eip

5.retf即可

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值