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

来源:互联网 发布:淘宝双十一外媒 编辑:程序博客网 时间:2024/04/29 17:33

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


在存储段描述符中,属性区域的TYPE由位0-3组成。位3称为E位,E=1,表示此描述符用于描述代码段。位2称为C位,位C=1,表示对应的代码段是一致代码段;位C=0,表示对应的代码段不是一致代码段.
所谓的“一致代码段”,目的是为了共享,比如该一致代码段的特权级是2,那么即使是特权级是3的代码,也可以访问该一致代码。也就是允许低权限的代码访问高权限的代码,而成功访问之后,当前的特权级并不是目标代码的特权级,而是原来代码的特权级,也就是说,跳转之后,CPL不变。要注意的是,一致代码段的DPL的定义,它定义的是允许访问改一致代码段的最高权限,也就是说,如果一个权限比一致代码段中DPL的权限还要高的话,是不允许访问该一致代码段的。
总结:一致代码段的DPL规定了成功访问它的最高权限,高于这个权限的代码不能成功访问它。成功访问一致代码段后,CPL并不会改变,还是保持为原来的权限。这样的设置主要是为了共享,比如一些函数库之类的,而不用受到权限的限制.
对于非一致代码段,要求CPL=DPL,RPL<=DPL.
对于非一致代码段,只允许同特权级的转移
原因:
1.低特权级下不能调用高特权级的代码,即保护高特权级的代码.
2.高特权级下不能调用低特权级的代码,为了避免低特权级代码获得高特权级从而能执行某些系统指令.
1.
一致代码段的转移,转移后的CPL不变
对于非一致代码段的转移与通过调用门转移,转移后的CPL就是段的DPL.
2.
而给其他段寄存器赋值(除CS以外)时,赋值后该寄存器的RPL就是选择子的RPL.
DPL是存储段的允许访问特权级,CPL是CPU的当前特权级,代表当前程序的特权级。RPL是选择子的请求访问特权级。对非一致代码段,要求代表当前程序特权级的当前程序特权级CPL必须等于存储段的允许访问特权级DPL,也就是说,对于非一致代码段,程序只能访问相同特权级的存储段。选择子的请求访问特权级RPL必须高于存储段的允许访问特权级DPL。


原创粉丝点击