文件名称:
(第三章 10)“代码段间跳转” 和 “访问数据段”
开发工具:
文件大小: 202kb
下载次数: 0
上传时间: 2019-03-24
详细说明:NULL
博文链接:https://chuanwang66.iteye.com/blog/1075472么cPL为0和1的程序将无法访问此段
5.TS5:DPL规定了可以访问此TSS的最低特权级(这与数据段的规定是一致的)
2代码间跳转(段间)
(1)普通转跳(没有使用调用门):即』MP或CALL后跟着48位全指针(16位段选择子+32位
地址偏移),且其中的段选择子指向代码段描述符,这样的跳转称为直接(普通)跳转。普
通眺转不能使特权缴发生跃辽,即不会引起CPL的变化,看卜面的详细描述:
致代码段
要求:CPL>=DPL,RPL不检查,也说是一致代码段描述符中的DPL规定可以转移到一致的代
码段的最内层特权级(3级可以转移到0级,而0级只能转移到0级)。一致代码段描述符
内DPL的这和解释,正好与正常的DPL的解釋相反。这是为了提供对应用程序的共亨支持,
而不要求改变特权级。
特权变化:转跳后程序的CPL=转跳前程序的CPL
非一致代码段
要求CPL=DPL&RPL<=DPL
特权变化:转跳后稈序的CPL=转跳前程序的CPL
(2)通过调用门的眺转:当段间转栘指令』P和段间转移指令CALL后跟着的目标段选择子指
向一个调用门描述符时,该跳转就是利用调用门的跳转。这时如果选择子后跟着32位的地
址偏移,也不会被cpu使用,因为调用门描述符已经记录了目标代码的偏移。使用调门进行
的跳转比普通跳转多一个步骤,即在访问调用门描述符时要将描述符当作一个数据段来检查
访问权限,要求指示调用门的选择子的RPL<=门描述符DPL,同时当前代码段CPL<=门措述
符DPL,就如同访问数据段一样,要求访问数据段的程序的CPL<=待访问的数据段的DPL:
冋时选择子的RPL<=待访问的数据段或堆栈段的DPL。只有满足了以上条件,CPU才会进
步从调用门描述符中读取目标代码段的选择了和地址偏移,进行下一步的操作。
从调用门中读取到目标代码的段选择子和地址偏移后,我们当前掌握的信息又回到了先前,
和普通跳转站在了同一糸起跑线上(普通跳转一廾始就得到了目标代码的段选择子和地址偏
移),有所不同的是,此时,cPU会将读到的目标代码段选择子中的RPL清0,即忽晔了调
用门中代码段选择了的RPL的作用。完成这步后,CPU开始对当前程序的CPL,目标代码
段选择子的RPL(事实上它被清0后总能满足要求)以及由日标代码选择子指示的日标代码
段描述符中的DL进行特杈级检査,并根据情況进行跳转,具体情况如下
致代码段
要求:CPL>=DPL,RPL不检查
特权变化:因为RPL被清0,所以事实上永远满足RL<=DPL,这一点与普通跳转一致,适用
于JMP和CALL
转跳后程序的CPL=转跳前程序的CPL,因此特杖级没有发生跃迁。
非一致代码段MP
要求CPL=DPL(RPL被清0,不检查),若不满足要求则程序引起异常。
特权变化:转跳后程序的cPL=DPL因为前提是cPL=DPL,所以转跳后程序的CPL=DPL不会改
变CPL的值,特权级也没有发生变化。如果访问时不满足前提CPL=DPL,则引发异常。
非一致代码段(CAL)
要求:CPL≥=DPL(RPL被清0,不检查),若不满足要求则程序引起异常。
特权变化:转跳后程序的CPL=DPL,当条件CPL=DPL时,程序跳转后CPL=DPL特权级不发生跃
迁;当CPL>D門L时,程序跳转后CPL=DPL,特权级发生跃迁,这是我们当目前位置唯一见到
的使程序当前执行优先缴(cPL发生变化的跳转方法,即用CALL指令+调用门方式踯转,且目
标代码段是非一致代码段。
本篇只涉及段特权级的内容,关于各种门也只涉及调用门。
先看儿个名词:
cPL( Current Privilege Level)当前特权级,由CS和Ss中的第O和第1位记录
DPL( De script or Privilege Level描述符特权级,由描述符中段属性的第5和第6位记录
RPL( Requested Privilege Leve)请求特权级,由选择子的第0和第1位记录
TSS(Task- State Segment)任务状态段,用于保存任务的相关信息
现在一步一步来讨论特权级的比较
1.cPL表示的是程序或者说任务的当前特权缴,它不属于某个段,当前的程序或任务不可能
同时表现出2种特权级,那么CS和Ss的第0位和第1位应该总是相同的。尝试将RPL异于
cPL的数据段选择了装入SS会引起异常。另外后面在论述跳转的吋候可以看到,它们!总是
相同的。
2DPL表示的是某个段或门的特权缴,当程序要访问段A的时侯,会将CPL和段A的DPL作
比较,以确定程序是否有权限访问段A
3RPL表示选择子是否有权限访问其所指向的段。选择子指向一个段描述符,段描述符指向
个段,段的特权级由段描述符中的DPL决定。当程序需要访问段A的时候,需要先通过
段A的选择子加载段A的段描述符,然后才能访问段A,在这个过程中CPU会先将段A选
择子中的RPL和段A描述符中的DPL作比较,确定选择子是否有权限访问其所指向的段
成功后才是CPL和段A的DPL的比较。
RPL、DPL之间的比较规则与CPL、D門L之间的比较规则一致。举个例子解释前面这句话的
意思:比如当前程序要访问一个数据段A,那么CPL不能大于段A的DPL,否则失败(后面
会讲到这一点)。这是CPL和段A的DPL的比较规则,那么同样段A的RPL、DPL也遵循这
样的规则,也就是段A的RPL不能大于段A的DPL
RPL和CPL不会进行比较。
4.不管什么情况下,相同特权级之间的访问总是不会错的,所以后面的讨论中通常会忽珞相
同特权级之问的比较。
5保护模式下代码段中可以存放数据,但数据段中不能存放代码(跳转不过去)。所以代码
段既可以荻取代码段中的数据(皴读的代码段属性需要可读,就算是荻取自身段内数据也需
要可读),也可以获取数据段中的数据(数据段总是可读的),还可以跳转到其他代码段。而
数据段除了被读取,什么都做不了。
6代码段分为一致代码段和非一致代码段,这会对特权级比较产生影响,是否一致由段描述
符的第42位决定。数据段和代码不同,它总是非一致的。代码段只在作为被访问一方(或
者说目标代码段)时一致性才会对特权纵比较产生影响,在作为访问一方时没有区别。是否
致代码段的区别是,在段间跳转过稈中,如果目标代码段是一个特权级更高的一致代码段,
那么跳转成功,并且CPL不会收变(CS和SS都不会变),于是CPL异于目标代码段的RPL
(CPL数值更大,特权级更低):如果目标代码段是一个特权级更高的非一致代码段,那么
跳转是会失败的,此时需要使用调用门。另外,如果目标代码段是一个特杈级更低的代码段
(不论是否一敛),那么跳转总是会失败的,除非使用RETF跳转。
7如果当前程序要访问一个数据段A,那么CPL不能大于段A的DPL,否则失败。也就是说
当前程序不能访问特权级更髙的数据段。CPL可以小于段A的DPL,也就是说当前程序可以
访问特杈级更低的数据段。当前程序对调用门和TSs的访问规则与此一致。
8特权级的检査是在选择子被装入段寄存器的时候进行的。先看相对简单一点的数据段A选
择子装入DS的情况(装入ES,FSGS类似,这里以DS为例说明):段A的DPL必须大于RPL,
同时还必须大」CPL(第7点),否则产生异常,段A的RPL不和CPL进行比较。
另外,当程序向低特权级跳转时,会检查CPL和DS指向的段的DPL,如果DPL小于CPL
那么DS会被加载空描述符的选择子。
9数据段A选择子裝入SS的情况(只有数据段选择子才能装入SS,代码段选择子不能装入
Ss,不管是否可读):段A的RPL和DPL都必须和CPL相等,否则失败
来看下为什么会这样。CPU要保证CS和Ss中的第0和第1位(CPL)致,所以段A的RPL
必须等于cPL。CPU还要保证当前程序的特权级和当前使用的堆栈段的特权级一致,所以段
A的DPL要等于CPL。
10代码段A选择子装入DS的情况(装入ES,FS,GS类似,这里以Ds为例说明):如果段A
不可读,装入失败。如果段A是可读的非·致代码段,那么CPL、段A的RPL都必须等于
段A的DPL,否则装入就会失败。如果段A是可读的一致代码段,那么CPL、段A的RPL都
可以大于段A的DPL,但不能小于段A的DPL
代码段A用段超越前缀CS读取自身段内数据的时侯,虽然没有选择子的裝入过程,但Cp∪
会检查段A是否可读,如果不可读公产生异常。
11.最后是代码段的段间跳转。段间跳转可以用JMP、CALL、RETF和调用门。从高特权级到
低特权级只能用RETF;从低特杈级到高特权级非一致代码段,只能用调用门,而且还必须
是用CAL指令来使用调用门;从低特权级到晑特杖级‘致代码段」MP、CALL、调用门都可
(系统自动生成,下载前可以参看下载内容)
下载文件列表
相关说明
- 本站资源为会员上传分享交流与学习,如有侵犯您的权益,请联系我们删除.
- 本站是交换下载平台,提供交流渠道,下载内容来自于网络,除下载问题外,其它问题请自行百度。
- 本站已设置防盗链,请勿用迅雷、QQ旋风等多线程下载软件下载资源,下载后用WinRAR最新版进行解压.
- 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
- 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
- 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.