一致代码段,非一致代码段,特权级,代码间跳转

转载 2012年03月22日 20:40:24

一致代码段,非一致代码段

一致位:在描述符属性中TYPE(包含4个二进制位)字段的第2位。

当 S=1 时TYPE中的4个二进制位情况:

3 2 1 0分别对应下面四个属性

执行位 一致位 读写位 访问位

执行位:置1时表示可执行,置0时表示不可执行;

一致位:置1时表示一致码段,置0时表示非一致码段;

读写位:置1时表示可读可写,置0时表示只读;

访问位:置1时表示已访问,置0时表示未访问。

所以一致代码段和非一致代码段的意思就是指这个一致位是否置1,置1就是一致代码段,置0就为非一致代码段。

特权级

CPL

CPL是当前进程的权限级别(Current Privilege Level),是当前正在执行的代码所在的段的特权级,存在于cs寄存器的低两位。 (个人认为可以看成是段描述符未加载入CS前,该段的DPL,加载入CS后就存入CS的低两位,所以叫做CPL,其值就等于原段DPL的值)

RPL

RPL说明的是进程对段访问的请求权限(Request Privilege Level),是对于段选择子而言的,每个段选择子有自己的RPL,它说明的是进程对段访问的请求权限,有点像函数参数。而且RPL对每个段来说不是固定的,两次访问同一段时的RPL可以不同。RPL可能会削弱CPL的作用,例如当前CPL=0的进程要访问一个数据段,它把段选择符中的RPL设为3,这样虽然它对该段仍然只有特权为3的访问权限。 (个人认为是以CPL来访问段DPL所出示的“证件(RPL)”,如出示的“证件”权级范围在CPL之内且满足DPL的特权检查规则:DPL >= max{CPL,RPL},就能正常通过DPL;反之则不会通过还会发生错误)

DPL

DPL存储在段描述符中,规定访问该段的权限级别(Descriptor Privilege Level),每个段的DPL固定。当进程访问一个段时,需要进程特权级检查,一般要求DPL >= max {CPL, RPL}

下面打一个比方,中国官员分为6级国家主席1、总理2、省长3、市长4、县长5、乡长6,假设我是当前进程,级别总理(CPL=2),我去聊城市(DPL=4)考察(呵呵),我用省长的级别(RPL=3 这样也能吓死他们:-))去访问,可以吧,如果我用县长的级别,人家就不理咱了(你看看电视上的微服私访,呵呵),明白了吧!为什么采用RPL,是考虑到安全的问题,就好像你明明对一个文件用有写权限,为什么用只读打开它呢,还不是为了安全!

代码间跳转

普通转跳

普通转跳(没有经过Gate 这东西):即JMP或Call后跟着48位全指针(16位段选择子+32位地址偏移),且其中的段选择子指向代码段描述符,这样的跳转称为直接(普通)跳转。普通跳转不能使特权级发生跃迁,即不会引起CPL的变化,看下面的详细描述:

1.目标是一致代码段:

要求:CPL >= DPL ,RPL不检查。

转跳后程序的CPL = 转跳前程序的CPL

2.目标是非一致代码段:

要求:CPL = DPL AND RPL<= DPL

转跳后程序的CPL = 转跳前程序的CPL

通过调用门的跳转

当段间转移指令JMP和段间转移指令CALL后跟着的目标段选择子指向一个调用门描述符时,该跳转就是利用调用门的跳转。这时如果选择子后跟着32位的地址偏移,也不会被cpu使用,因为调用门描述符已经记录了目标代码的偏移。使用调门进行的跳转比普通跳转多一个步骤,即在访问调用门描述符时要将描述符当作一个数据段来检查访问权限,要求指示调用门的选择子的 RPL≤门描述符DPL,同时当前代码段CPL≤门描述符DPL,就如同访问数据段一样,要求访问数据段的程序的CPL≤待访问的数据段的DPL,同时选择子的RPL≤待访问的数据段或堆栈段的DPL。只有满足了以上条件,CPU才会进一步从调用门描述符中读取目标代码段的选择子和地址偏移,进行下一步的操作。

从调用门中读取到目标代码的段选择子和地址偏移后,我们当前掌握的信息又回到了先前,和普通跳转站在了同一条起跑线上(普通跳转一开始就得到了目标代码的段选择子和地址偏移),有所不同的是,此时,CPU会将读到的目标代码段选择子中的RPL清0,即忽略了调用门中代码段选择子的RPL的作用。完成这一步后,CPU开始对当前程序的CPL,目标代码段选择子的RPL(事实上它被清0后总能满足要求)以及由目标代码选择子指示的目标代码段描述符中的DPL进行特权级检查,并根据情况进行跳转,具体情况如下:

1.目标是一致代码段:

要求:CPL >= DPL ,RPL不检查,因为RPL被清0,所以事实上永远满足RPL <= DPL,这一点与普通跳转一致,适用于JMP和CALL。

转跳后程序的CPL = 转跳前程序的CPL,因此特权级没有发生跃迁。

2.目标是非一致代码段:

当用JMP指令跳转时:

要求:CPL = DPL (RPL被清0,不检查),若不满足要求则程序引起异常。

转跳后程序的CPL = DPL

因为前提是CPL=DPL,所以转跳后程序的CPL = DPL不会改变CPL的值,特权级也没有发生变化。如果访问时不满足前提CPL=DPL,则引发异常。

当用CALL指令跳转时:

要求:CPL >= DPL(RPL被清0,不检查),若不满足要求则程序引起异常。

转跳后程序的CPL = DPL

当条件CPL=DPL时,程序跳转后CPL=DPL,特权级不发生跃迁;当CPL>DPL时,程序跳转后CPL=DPL,特权级发生跃迁,这是我们当目前位置唯一见到的使程序当前执行优先级(CPL)发生变化的跳转方法,即用CALL指令+调用门方式跳转,且目标代码段是非一致代码段。

一致代码段,非一致代码段,特权级,代码间跳转[总结]

一致代码段,非一致代码段 ---------------------------------------------------------------------------------------...
  • bruce2010
  • bruce2010
  • 2010年06月29日 12:35
  • 224

保护模式下,什么是一致性代码和非一致性代码段

C++ 保护模式下,什么是一致性代码和非一致性代码段 李健 3 票 706 ...
  • linuxheik
  • linuxheik
  • 2012年11月17日 21:40
  • 987

【从头开始写操作系统系列】一致代码段与非一致代码段

上几篇文章,我们一直在讨论的都是 GDT 相关的一些问题,现在我们知道在系统在从实模式向保护模式跳转时,GDT 是必须要准备的结构。在介绍这一跳转之前,这篇文章我们来介绍两个概念:一致代码段和非一致代...
  • luoyhang003
  • luoyhang003
  • 2015年08月18日 16:54
  • 1025

操作系统的特权级(2) ---- 一致代码段和非一致代码段

这是在网上看到的比较通俗易懂的解释,转载于:http://blog.csdn.net/feijj2002_/archive/2009/09/27/4597174.aspx 之所以出现这个定义是因为系统...
  • kkk8000
  • kkk8000
  • 2010年11月14日 00:00
  • 944

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

一致码段,非一致码段 conforming code segment 之所以出现这个定义是因为系统要安全:内核要和用户程序分开.内核一定要安全.不能被用户程序干涉. 但是有时候用户程序也需要读取...
  • hjjj_122
  • hjjj_122
  • 2010年08月31日 15:56
  • 388

(转载)一致代码段和非一致代码段

 转自:http://hi.baidu.com/walkingman520/blog/item/4463e21133a42513b9127b91.html之所以出现这个定义是因为系统要安全:内核要和用...
  • liuyu790810
  • liuyu790810
  • 2008年04月10日 20:05
  • 1921

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

前辈的一篇文章,拿来主义也! 之所以出现这个定义是因为系统要安全:内核要和用户程序分开..内核一定要安全.不能被用户程序干涉.但是有时候用户程序也需要读取内核的某些数据,怎么办呢?于是os将内核程序开...
  • lingang_
  • lingang_
  • 2008年04月02日 19:28
  • 568

“一致代码段”和“非一致代码段”解惑!

自己在学习的过程中,发现对“一致”和“非一致”代码段的定义不是太清晰,所以在网上荡了一圈,总结一下加深印象!呵呵       1. 所谓的“一致代码段”,目的是为了共享,比如说该一致代码段的特权...
  • yu_chenglong
  • yu_chenglong
  • 2012年08月02日 16:26
  • 508

一致代码段与非一致代码段

一致代码段与非一致代码段刺猬@http://blog.csdn.net/littlehedgehog网上转载的一篇文章, 字字珠玑、句句精华。之所以出现这个定义是因为系统要安全:内核要和用户程序分开,...
  • littlehedgehog
  • littlehedgehog
  • 2008年03月25日 20:27
  • 1440

【转】一致代码段和非一致代码段

原文地址: http://blog.csdn.net/feijj2002_/article/details/4597174 之所以出现这个定义是因为系统要安全:内核要和用户程序分开..内核一定要安全...
  • lingqi1818
  • lingqi1818
  • 2014年06月16日 09:51
  • 212
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一致代码段,非一致代码段,特权级,代码间跳转
举报原因:
原因补充:

(最多只允许输入30个字)