一致性代码段和非一致性代码段

来源:互联网 发布:net和java有什么区别 编辑:程序博客网 时间:2024/05/21 08:23

“一致”的意思是这样的,当转移的目标是一个特权级更高(PDL   <   CPL)的一致代码段,当前的特权级(CPL)会被延续下去,而向特权级更高的非一致代码段的转移会引起常规保护错误。


比如当前程序的特权级(CPL)是3,有一个描述符的特权级(DPL)是0,现在向该描述符转移:
若该描述符是一致代码段,能正常转移,但当前程序的特权级(CPL)仍然是3;
若该描述符是非一致代码段,违约,触发常规保护错误。

 

所谓的一致和非一致代码段,简单的可以用是否共享的段来区分,如果共享(系统内核共享的段)就是一致段,不共享的就是非一致段!至少我现在这么理解的!
 
 
 
对于非一致代码段,只允许同特权级的转移
原因:
1.低特权级下不能调用高特权级的代码,即保护高特权级的代码
2.高特权级下不能调用低特权级的代码,为了避免低特权级代码获得高特权级从而能执行某些系统指令


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

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

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

总结:似乎这些东西跟我们初学者预想的那样不同.核心态是老大.想用访问谁都可以.其实错了.结果恰恰相反.
这是因为防止用户篡改核心态的数据.导致核心态执行用户代码.而造成内核崩溃.

 
 
原创粉丝点击