一致性/非一致性代码段的总结

关于一致性代码段和非一致性代码段的由来:http://wenda.tianya.cn/wenda/thread?tid=0cc76471fd94f119

 

代码段分为一致代码段和非一致代码段,这会对特权级比较产生影响,是否一致由段描述符的第42位决定数据段和代码不同,它总是非一致的。代码段只在作为被访问一方(或者说目标代码段)时一致性才会对特权级比较产生影响,在作为访问一方时没有区别。是否一致代码段的区别是,在段间跳转过程中,如果目标代码段是一个特权级更高的一致代码段,那么跳转成功,并且CPL不会改变(CS和SS都不会变),于是CPL异于目标代码段的RPL(CPL数值更大,特权级更低);如果目标代码段是一个特权级更高的非一致代码段,那么跳转是会失败的,此时需要使用调用门。另外,如果目标代码段是一个特权级更低的代码段(不论是否一致),那么跳转总是会失败的,除非使用RETF跳转。

 

对于非一致代码段,只允许同特权级的转移
原因:
1.低特权级下不能调用高特权级的代码,即保护高特权级的代码
2.高特权级下不能调用低特权级的代码,为了避免低特权级代码获得高特权级从而能执行某些系统指令


其实我也觉得很混乱,现在是这样总结的:
1.
一致代码段的转移,转移后的CPL不变
对于非一致代码段的转移与通过调用门转移,转移后的CPL就是段的DPL
2.
而给其他段寄存器赋值(除CS以外)时,赋值后该寄存器的RPL就是选择子的RPL

 

 

DPL是存储段的允许访问特权级,CPL是CPU的当前特权级,代表当前程序的特权级。RPL是选择子的请求访问特权级。对非一致代码段,要求代表当前程序特权级的当前程序特权级CPL必须等于存储段的允许访问特权级DPL,也就是说,对于非一致代码段,程序只能访问相同特权级的存储段。选择子的请求访问特权级RPL必须高于存储段的允许访问特权级DPL。
更详细的内容请参阅《自己动手写操作系统》的62-64页。

对于一致代码段:也就是共享的段.
1.特权级高的程序不允许访问特权级低的数据:核心态不允许调用用户态的数据.
2.特权级低的程序可以访问到特权级高的数据.但是特权级不会改变:用户态还是用户态.

 

对于普通代码段.也就是非一致代码段:
0.只允许同级间访问.
1.绝对禁止不同级访问:核心态不用用户态.用户态也不使用核心态

 

 

  • CPL是当前进程的权限级别(Current Privilege Level),是当前正在执行的代码所在的段的特权级,存在于cs和ss寄存器的低2位(第0,1位)。CPL表示的是程序或者说任务的当前特权级,它不属于某个段,当前的程序或任务不可能同时表现出2种特权级,那么CS和SS的第0位和第1位应该总是相同的。尝试将RPL异于CPL的数据段选择子装入SS会引起异常。它们总是相同的。
  • CPL就是CS和SS的段选择子的RPL,CPL存放在CS和SS寄存器的RPL字段内,每当一个代码段/堆栈段(特殊的数据段)选择子装入CS/SS寄存器中时,处理器自动地把CPL存放到CS/SS的RPL字段。
  • RPL说明的是进程对段访问的请求权限(Request Privilege Level), 是对于段选择子而言的,每个段选择子有自己的RPL,它说明的是进程对段访问的请求权限,有点像函数参数。而且RPL对每个段来说不是固定的,2次访问同一段时的RPL可以不同。RPL可能会削弱CPL的作用,例如当前CPL=0的进程要访问一个数据段,它把段选择符中的RPL设为3,这样它对该段仍然只有特权为3的访问权限。处理器通过检查RPL和CPL来确认一下请求是否合法。即便提出访问请求的段有足够的特权级,如果RPL不够也是不行的。(CPL <= DPL) && (RPL <= DPL

     

     

     

    保护模式下代码段中可以存放数据,但数据段中不能存放代码(跳转不过去)。所以代码段既可以获取代码段中的数据(被读的代码段属性需要可读,就算是获取自身段内数据也需要可读),也可以获取数据段中的数据(数据段总是可读的),还可以跳转到其他代码段。而数据段除了被读取,什么都做不了。

     

    代码段A选择子装入DS的情况(装入ES,FS,GS类似,这里以DS为例说明):如果段A不可读,装入失败。如果段A是可读的非一致代码段,那么 CPL、段A的RPL都必须等于段A的DPL,否则装入就会失败。如果段A是可读的一致代码段,那么CPL、段A的RPL都可以大于段A的DPL,但不能小于段A的DPL。 代码段A用段超越前缀CS读取自身段内数据的时候,虽然没有选择子的装入过程,但CPU会检查段A是否可读,如果不可读会产生异常。

     

    最后是代码段的段间跳转。段间跳转可以用JMP、CALL、RETF和调用门。从高特权级到低特权级只能用RETF;从低特权级到高特权级非一致代码段,只能用调用门,而且还必须是用CALL指令来使用调用门;从低特权级到高特权级一致代码段JMP、CALL、调用门都可以

     

     

     

     

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值