任务和特权级保护

一,概述

      1.1, 内存空间是分段的,每个段都有自己的描述符,描述符规定了这个段的起始基地址,段界限,段属性描述信息。

      1.2,一个段只能在它自己的范围内访问我理解的意思是:一个代码段的保护是指CS:EIP的访问不能超过这个代码段的范围;一个数据段的保护是指DS:BX的访问不能超过这个数据段的范围,但是代码段还是可以访问数据段的,只不过在访问的时候不能超过数据段的范围。

      1.3,一个程序可以有很多个段,该程序如果只在自己所属的段内访问没有任何问题。但是如果该程序访问不属于自己的段,那么就会出问题。

      1.4,一个任务对应一个程序;一个任务可以有很多个段,多任务系统是指在内存中存在多个程序,每个程序都有自己的段;处理器可以同时并发执行多任务是指,处理器可以让指令指针在多个任务(多个程序)之间按照固定的周期很快的切换来切换去,外界看起来好像多个任务在并发地运行。

      1.5,如何实现任务之间的隔离和保护,任务和操作系统之间的隔离和保护。操作系统负责加载任务、创建任务执行环境、调度任务之间的切换等,所以需要对任务和操作系统实施保护。

      1.6,特权级;特权级指的是段的特权级,不是指任务的特权级;一个任务可以有多个段,有些段位于全局空间中,这些段的特权级比较高;有些段的位于局部空间中,这些段的特权级比较低。

      1.7,CPL,DPL,RPL的含义;调用门的含义,调用门是用来描述什么的。

 

二,任务的隔离和特权级保护

       2.1,任务,LDT,LDTR,TSS,TR

               程序是为了完成某个特定的功能而写的一些指令和数据,程序正在执行中的一个副本就叫做任务;一个程序可以对应多个任务,一个程序也可以只对应一个任务。

               为了有效地控制任务之间的隔离,处理器建议为每个任务都建立专属于它自己的LDT(局部描述符表),只用来存放它自己私有的段描述符。整个内存空间中可以有多个LDT,有多少个任务就有多少个LDT。但是只有一个LDTR(局部描述符表寄存器),用来指向当前正在运行的那个任务的LDT。在任务发生切换的时候,要修改LDTR指向当前正在运行的LDT。

              每个任务都有自己的状态,或者叫做现场;主要就是这个任务的寄存器信息,这些寄存器信息存储在一个叫做TSS(Task State Segment)的地方,每个任务都有一个TSS,内存中有多少个任务就有多少个TSS,TSS的数目和LDT一样多,TR(Task Register)指向当前正在运行的TSS。TSS主要是在任务切换的时候会使用到。比如处理器将指令指针从任务A处切换到任务B处,刚开始的时候LDTR指向LDT(a),TR指向TSS(a);处理器将LDTR指向LDT(b),将寄存器信息放入TSS(a),将TR指向TSS(b),将TSS(b)中的信息覆盖到寄存器中。

 

       2.2,全局空间和局部空间

               全局空间由由操作系统段(代码段、数据段、栈段、附加段)组成,主要提供一些通用的服务,让所有任务共享,所有段信息在GDT中维护。局部空间由单个任务特有,内存中可以有N个局部空间,每个局部空间中由多个段组成,主要存放任务自己特有的数据,段信息在LDT中维护。

               一个任务的内存空间由 全局空间+局部空间组成。

    

     2.3,特权级(DPL、CPL、RPL)

              首先段特权级是用来段的,不是用来描述任务的。每个段都有自己的特权级,特权级在段描述符中定义,段特权级用来表示可以访问这个段所具有的最低特权级,用DPL表示。intel处理器特权级有四种,0>1>2>3。操作系统内核特权级为0,设备驱动程序特权级为1&&2,应用程序特权级为3。

              CPL=CS段选择子.倒数后两位,表示当前正在执行的代码段的特权级。

              RPL=请求特权级,表示的是发出访问请求(访问代码段/数据段/栈段)的代码段的特权级,一般来说RPL=CPL。但是请求可能会跨段。

              对于数据段来说,它的DPL规定了访问该数据段所应具备的最低特权级。

 

    2.4,代码段的特权级检查

             理论上代码段的跳转(即指令指针从一个代码段跳到另一个代码段)只允许在相同特权级别的代码段之间跳转,不过有时候我们需要应用程序代码段可以调用(指令指针转移)操作系统中断例程,此时就需要低特权级别的代码段访问高特权级别的代码段。这里所说的主要是指低特权级别的代码转移到高特权级别的代码段执行的问题。

             永远不允许将控制从特权级较高的代码段转移到特权级较低的代码段,除非调用返回。

             有两种方法可以将控制从特权级较低的代码段转移到特权级较高的代码段,如下所述:

             2.4.1,将被调用的高特权级的代码段定义为依从的代码段

                         代码段描述符的TYPE字段有C位,C位=0,表示这样的代码段只能供同特权级的代码段调用。C位=1,表示这样的代码段是依从的代码段,可以由特权级较低的代码段调用。必须满足CPL>=依从的代码段的DPL。

                         依从的含义是指当控制转移到依从的代码段时,CPL的数值并不改变,而是依从的代码段的DPL在数值上改成CPL。

 

             2.4.2,通过调用门访问特权级较高的代码段

                         门用来描述一段程序,不是用来描述一个代码段的,可以理解为门就是用来描述一个中断例程/一个函数的。调用门也是以描述符的形式存放于GDT/LDT中的。调用门描述符中给出了该中断例程所在代码段的选择子,该中断例程在代码段中的偏移地址。调用门通常以jmp far /call far的方式调用,在jmp/call的操作数中,需要给出调用门的选择子。

                        下面说说选择子,选择子由三部分组成:索引号,TI位,RPL位。TI位给出了要访问的段位于GDT中还是LDT中;索引号给出了段描述符在GDT/LDT中的位置;RPL位为请求特权级,在数值上等于发起请求的那个代码段的特权级。

                       通过jmp far的形式访问调用门,不改变CPL的数值,即被调用的中断例程的DPL变为CPL数值。

                       通过call far的形式访问调用门,CPL的特权级会提升到被调用的中断例程的特权级。

                       RPL记录的是发起请求的那个代码段的特权级,发起请求是最最原始的那个代码段发出来的。操作系统会把正确的RPL设置到选择子中,RPL记录的是历史,CPL记录的是当前。

                       

    2.5,代码段特权级检查整理

             2.5.1,将控制直接转移到非依从的代码段

                         CPL=RPL=目标代码段描述符的DPL

 

             2.5.2,将控制转移到依从的代码段

                        CPL>=目标代码段描述符的DPL

                        RPL>=目标代码段描述符的DPL

 

              2.5.3,高特权级别的代码段可以访问低特权级别的数据段,低特权级别的代码段不可以访问高特权级别的数据段

                          CPL <= 目标数据段描述符的DPL

                          RPL <= 目标数据段描述符的DPL

                          mov ds , ax

 

             2.5.4,在任何时候,栈段的特权级必须和当前特权级CPL相同

                         CPL = 目标栈段描述符的DPL

                         RPL = 目标栈段描述符的DPL

 

     2.6,总结

             2.6.1,程序员在写程序的时候,不需要自己对程序的各个段指定特权级别;操作系统会自动将程序转换为任务并放到任务的局部空间中,并将各个段的特权级设置为3;操作系统对应任务的全局空间,一个任务的内存空间为操作系统全局空间+局部空间。

             2.6.2,任务运行在局部空间的时候,可以自由访问自己局部空间内的所有段,包括数据段。不允许将控制直接转移到全局空间的段,除非全局空间的段是依从的或者通过调用门。

             2.6.3,通过调用门进入全局空间执行时候,可以自由访问全局空间的任何段;操作系统还可以访问局部空间的数据段;除了调用门返回外,不允许操作系统代码段访问局部空间代码段。

             2.6.4,任何时候,当前栈的特权级别必须和CPL一样,进入不同特权级的代码段时,栈要跟着切换。

              

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值