任务和特权级保护

        多任务系统,对任务间的隔离和保护,及任务和操作系统之间的隔离和保护都提出了要求。

        1.通过演示如何创建一个任务,并使之投入运行来学习任务的概念及其组成要素,包括任务的全局空间和局部空间,TSS,LDT,特权级等。

        2.特权级指组成任务的各个部分的特权级。

        3.需清楚CPL,DPL,RPL的含义,及不同特权级之间的控制转移规则。

        4.熟悉调用门的用法

        5.掌握一些在Bochs下调式程序的新手段

        6.学习一些新的x86处理器指令,包括lldt,ltr,pushf/pushfd,ret n/retf n,arpl等,同时了解像jmp和call这样的传统指令如何被赋予一些新功能

14.1.任务的隔离和特权级保护

14.1.1.任务,任务的LDT和TSS

        为有效地在任务之间实施隔离,处理器建议每个任务都应有自己的描述符表,称为局部描述符表LDT,且把专属于自己的那些段放到LDT中。

        LDT只属于某个任务。

        为了追踪全局描述符表,访问它内部的描述符,处理器使用了GDTR寄存器。全局描述符表是全局性的,为所有任务服务。

        为了追踪和访问这些LDT,处理器使用了局部描述符表寄存器【LDTR】。

        因为LDTR寄存器只有一个,所以,它只用于指向当前任务的LDT。每当任务切换时,LDTR的内容被更新,以指向新任务的LDT。

        LDTR包含了32位线性基地址字段和16位段界限字段。

        段选择子的标志位,用于指示从GDT还是LDT中加载描述符。

        每个LDT能容纳2^13个描述符。

        在一个多任务的环境中,当任务切换发生时,需保护旧任务的运行状态,或保护现场。保护的内容包括通用寄存器,段寄存器,栈指针寄存器ESP,指令指针寄存器EIP,状态寄存器EFLAGS,等等。

        为保存任务的状态,并在下次重新执行时恢复它们,每个任务应用一个额外的内存区域保存相关信息,这叫做任务状态段。任务状态段TSS具有固定的格式,最小尺寸是104字节。处理器能识别TSS中的每个元素,并在任务切换时,读取其中的信息。

        处理器用TR寄存器来指向当前任务的TSS。TR寄存器在处理器中也只有一个。任务切换发生时候,TR寄存器的内容会跟着指向新任务的TSS。

        处理器将当前任务的现场信息保存到由TR寄存器指向的TSS,

        TR指向新任务的TSS,从新任务的TSS恢复现场。

14.1.2.全局空间和局部空间

        每个任务实际上包括两个部分:全局部分,私有部分。全局部分是所有任务共有的,含操作系统的软件和库程序,及可调用的系统服务和数据;私有部分则是每个任务各自的数据和代码,与任务所要解决的具体问题有关。

        任务在内存中运行。地址空间的访问依靠分段机制来进行的。全局地址空间用全局描述符表来指定的,局部地址空间则是由每个任务私有的局部描述符表来定义的。

        任务的全局空间包含了操作系统的段,由别人编写,任务可调用这些段的代码,或获取这些段中的数据;任务局部空间的内容是由程序员自己创建的。通常,任务会在自己的局部空间运行,当它需要操作系统提供的服务时,转入全局空间执行。

        段寄存器【CS,SS,DS,ES,FS,GS】由16位的选择器和不可见的描述符高速缓存器组成。

        每个段描述符都对应着一个内存段。段内偏移是32位。因此,一个任务的全局地址空间,总大小:2^13*2^32,即32TB。

        同理,一个任务的局部地址空间,总大小也是32TB。一个任务总地址空间可达64TB。

        同一块物理内存,可以让多个任务,或每个任务的不同段来使用。执行或访问一个新的段时,如它不在物理内存,且没有空闲物理内存空间来加载它,操作系统将挑出一个暂时用不到的段,把它换出磁盘,把腾出的空间分配给马上要访问的段,修改段的描述符,使之指向这段内存空间。下一次,被换出段又要使用时,再按相同办法换回到物理内存。

        这就是虚拟内存管理的一般方法。

14.1.3.特权级保护概述

        在分段机制基础上,处理器引入了特权级,由固件负责实施特权级保护。

        特权级,是存在于描述符及其选择子中的一个数值,当这个描述符或选择子所指向的对象要进行某种操作,或被别的对象访问时,该数值用于控制它们所能进行的操作,或限制它们的可访问性。

        Intel处理器可识别4个特权级别,分别是0到3,较大的数值意味着较低的特权级别。

        操作系统特权级为0,特权级1,2通常赋予那些可靠性不如内核的系统服务程序,比较典型的就是设备驱动程序。很多操作系统中,驱动也是0特权级。

        应用程序的可靠性低,特权级为3。

        实施特权级保护的第一步,是为所有可管理的对象赋予一个特权级,以决定谁能访问它们。

        特权低的段可被特权级高的段访问,反之,则不可。

        处理器正在一个代码段中取指令和执行指令时,那个代码段的特权级叫做当前特权级。正在执行的这个代码段,其选择子位于段寄存器CS中,最低两位就是当前特权级的数值。

        任务的全局部分是特权级0的,局部空间是特权级3的。

        停机指令,写cro这类指令,只可在当前特权级为0时,才可指令的指令称为特权指令。其他还有,lgdt,lldt,ltr,读写控制寄存器的mov,hlt等。

        对设备的访问都是通过端口进行的。在处理器的标志寄存器EFLAGS中,位13,12是IOPL位,也就是输入、输出特权级,它代表着当前任务的I/O特权级别。

        代码段

猜你喜欢

转载自blog.csdn.net/x13262608581/article/details/125346354