注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

xu3stones的技术博客

OS >> Virtualization >> Cloud

 
 
 

日志

 
 

操作系统学习笔记(三)-描述符以及特权级的总结  

2012-11-30 21:51:27|  分类: OS入门知识 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

在保护模式下有两个重要的概念即描述符和特权级。

1.描述符

     描述述是如何分类的? 按描述符所描述的对象来划分,描述符可分为如下三类:存储段描述符、系统段描述符、门描述符(控制描述符):

(1)存储段描述符又称作一般段描述符, 是指段寄存器中使用的描述符;

(2)系统段描述符包括LDT和TSS。每个任务都有自己的局部描述符表LDT 和和任务状态段TSS,LDT 和TSS 是内存中特殊的段, 它们也有起始地址、大小和属性,也需要描述符来描述它们,所以就有LDT 描述符和TSS 描述符, 系统段描述符指的就是LDT 描述符和TSS 描述符,LDT 描述符和TSS 描述符放在全局描述符表GDT 中;

(3)门描述符又称控制描述符,程序在运行中经常会发生转移,转移可能在同一个段内进行,更多的是段间转移,段间转移就需要改变CS 和EIP 的值,门描述符中就保存着程序之间进行段间转移的目标地址(即新的CS 和EIP 值)。

     各类描述符又有什么相似与区别? 存储段描述符和系统段描述符中存放的是段的起始地址、界限和属性,而门描述符中存放的是转移地址中的偏移量、选择子和属性,可见不同的描述符其内容还是有一定的区别。一个数据段只需要一个一般描述符,一个代码段需要两个描述符:一个一般段描述符和一个门描述符,要转移到这个代码段执行,首先从门描述符中取出选择子、偏移地址给CS 和EIP,再根据CS的选择子从一般段描述符中取出真正的段地址。不管什么样的描述符,其属性中都有一个特殊的字节叫做访问权字节,访问权字节是段的极其重要的属性, 描述符特权级DPL 是访问权字节中最重要的属性。

    特权级有以下几种形式表述:描述符特权级DPL,当前任务特权级CPL,请求特权级(选择符的特权级)RPL,有效特权级EPL,I/O 特权级IOPL。DPL 在描述符的访问权字节中,CPL 就是由当前CS 的最低两位值来规定的,RPL 是当前选择子的最低两位值,EPL=MAX(CPL,

RPL),IOPL 在标志寄存器中。

(1)在把选择子装入数据段寄存器DS、ES、FS 或GS 时, 选择子指定的描述符必须是数据段描述符、可读可执行代码段描述符,要求CPL<=DPL,RPL<=DPL ,也就是EPL=MAX(CPL,RPL) <=DPL;

(2)在把选择子装入堆栈段寄存器SS 时,选择子指定的描述符必须是堆栈段描述符, 要求CPL=DPL=RPL。

(3)把选择子装入代码段寄存器CS时,程序就发生了控制转移即转移到另一个代码段执行,控制转移涉及到特权级的转换即CPL 改变。

2.控制转移
      保护模式下的控制转移基本上可分为两大类:

(1)同一任务内的控制转移;

(2)任务间的控制转移,即“任务切换”。

    同一任务内的控制转移又可分为:段内转移、特权级不变的段间转移和特权级变换的段间转移。段内转移与实模式下相似,不涉及特权级变换和任务切换。只有段间转移才涉及特权级变换和任务切换。指令JMP、CALL 和RET 都具有段间转移的功能,指令INT 和IRET 总是段间转移。此外,中断/异常也将引起段间转移。把这些具有段间转移功能的指令统称为段间转移指令。在保护模式下,段间转移的目标位置由选择子和偏移地址表示,常把它称为目标地址指针。段间转移指令JMP 和段间调用指令CALL 还可分为段间直接转移和段间间接转移两类,如果指令JMP 和CALL 在指令中直接含有目标地址指针,那么就是段间直接转移,指令中的“选择子”给CS,“偏移量”给EIP;如果指令中的“选择子”不是直接给CS,而是指向调用门、任务门或TSS 描述符的选择子,那么就是段间间接转移,这时指令中只有“选择子”部分有效,而“偏移量”部分不起作用。段间直接转移只能进行任务内无特权级变换的转移,不能进行任务内特权级变换的转移,对于非一致代码段,要求CPL=DPL;对于一致代码段,要求CPL>=DPL。段间间接转移可通过调用门、任务门或TSS 描述符进行转移,通过调用门是任务内间接转移,通过任务门和TSS 描述符就是任务切换。如何通过调用门进行任务内间接转移呢? 当段间转移指令JMP和段间调用指令CALL 中的选择子指示调用门时,就可以实现通过调用门的转移。处理器采用与访问数据段相同的特权级规则控制对调用门的访问,即要求CPL(当前任务特权级)<=DPL(调用门的特权级),RPL (指令中选择子的特权级)<=DPL, 也就是EPL=MAX(CPL,RPL)<=DPL。调用门的特权级检测通过后,才开始向目标代码段转移,调用门中存放的是偏移量、选择子和属性,将选择子给CS,偏移量给EIP,在装载CS 描述符高速缓冲寄存器之前调整CS 中选择子的RPL=0,也即调用门中代码段选择子的RPL 被忽略,在装载CS 高速缓冲寄存器时,还要对CS 指向的目标代码段描述符进行保护检测,此时特权极规则与访问一般数据段正好相反:CPL>=DPL, 这里的DPL 不再是调用门的DPL, 而是调用门内选择子所指示的目标代码段描述符的DPL。通过调用门的间接转移只有CALL 指令能变换到内层的特权级,JMP 指令只能转移到同级的代码。对于使用调用门的段间转移指令JMP,检测条件与段间直接转移相同:对于非一致代码段,要求CPL=DPL;对于一致代码段,要求CPL>=DPL,其它情形就引起异常。对于使用调用门的段间调用指令CALL,情形就不同了:对于一致代码段,要求CPL>=DPL,且发生无特权级变换的转移;对于非一致代码段,要求CPL>=DPL, 当CPL=DPL 时, 仍发生无特权级变换的转移, 当CPL>DPL 时,就发生向内层特权级变换的转移,并使CPL 保持等于DPL,同时切换到内层堆栈。综上所述,使用段间调用指令CALL,通过调用门可以实现从外层程序调用进入内层程序(JMP 指令只能实现无特权级变换的转移);通过调用门也可实现无特权级变换的转移。需要注意的是,JMP 指令和CALL 指令都不能实现向外层特权级的转移否则会引起异常。段间间接转移通过任务门或TSS 描述符进行转移,就完成了任务切换。任务切换的实质就是用一个新的任务状态段的选择子加载TR。任务切换有两种方法:一是通过TSS 描述符进行直接任务切换,二是通过任务门进行间接任务切换。切换过程中也要注意特权级的检测规则。段间转移指令JMP 或段间调用指令CALL 中的选择子如果为新任务的TSS 描述符的选择子, 把此选择子加载到TR 就形成任务切换,这叫直接切换, 新任务的入口点由TSS 内的CS 和EIP 字段所规定的值确定,这样的JMP 或CALL 指令内的偏移被丢弃,另外,对于段间调用指令CALL,若指令中的选择子指示一TSS 段描述符或任务门时,则返回地址和外层栈指针并不压入堆栈。处理器采用与访问数据段相同的特权级规则控制对TSS 描述符的访问,即要求CPL(当前任务特权级)<=DPL(TSS 描述符的特权级),RPL(指令中选择子的特权级)<=DPL ,也就是EPL=MAX(CPL,RPL) <=DPL。段间转移指令JMP 或段间调用指令CALL 中的选择子如果为任务门的选择子,就是间接切换任务。任务门中存放的是偏移量、选择子和属性,任务门内的选择子是某个TSS 描述符的选择子,任务门内的偏移量不起作用,将任务门内的选择子加载到TR 就形成任务切换。处理器采仍然采用与访问数据段相同的特权级规则控制对任务门的访问,即要求CPL(当前任务特权级)<=DPL(任务门的特权级),RPL(指令中选择子的特权级)<=DPL , 也就是EPL=MAX (CPL,RPL) <=DPL。对于任务门中选择子所指向的TSS 描述符的DPL 不进行特权级检查

  评论这张
 
阅读(80)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017