《微型计算机原理与应用》课件第9章_第1页
《微型计算机原理与应用》课件第9章_第2页
《微型计算机原理与应用》课件第9章_第3页
《微型计算机原理与应用》课件第9章_第4页
《微型计算机原理与应用》课件第9章_第5页
已阅读5页,还剩97页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第9章高档微机中虚拟存储、多任务和保护原理9.1硬件基础和基本概念

9.2虚拟存储器原理

9.3多任务的实现原理

9.4保护功能的实现原理

小结

习题九

9.1硬件基础和基本概念

在保护模式下的虚拟存储、多任务和保护功能是依靠特殊的硬件支持实现的。其中除了第2章图2.12给出的直接影响保护模式存储器寻址过程的寄存器外,还包括一组系统级寄存器。图9.1是这组系统级寄存器的结构图。它们在虚拟存储、多任务和保护控制中的具体作用,将在下面相关部分介绍。图9.1系统级寄存器结构这组寄存器包括3个控制寄存器和4个段基址寄存器。

1.控制寄存器

3个控制寄存器分别为CR0、CR2和CR3(CR1留给后代CPU使用)。这里只介绍CR0的功能。

CR0的低16位又称机器状态字,可以用指令装入内容。其中控制位按功能还可以分为5组:

(1)对CPU工作方式进行控制的有两位:

PE(位0)为保护模式允许位,该位置1,使CPU转移到保护模式;该位为0时,为实模式。

PG(位31)为分页功能允许位。分页是在保护模式下实现虚拟存储器管理的一种方式(以后详细说明),可以利用这种方式,也可以不用这种方式。该位置1,表示设置为这种方式,使CPU的有关逻辑按分页方式编址和寻址。

(2)对CPU内高速缓冲存储器Cache操作方式进行控制的有两位:

CD(位30)为高速缓存禁止(即不允许)位:该位置1,表示片内高速缓冲的功能处于不允许状态,不把主存内容拷贝到高速缓存器,CPU直接访问内存;只有该位复位为0,高速缓存功能才处于允许状态。

NW(位29)为高速缓存通写方式禁止(即不允许)位。为了保持高速缓存的内容与它对应的主存储器部分内容相同,在改变了高速缓存中的数据后,有两种方法修改主存中的数据。一种方法为写回(writeback)法,另一种称为通写(writethrough)法。NW位置1,意味着不用通写法;NW位为0,用通写法。

(3)与协处理器或浮点运算部件有关的控制位有TS、EM、MP和NE,这里不介绍。

(4)对界屏蔽位AM。对界是指访问存储器时数据类型与在存储器内起始地址的关系:如果访问存储器中字型数据时其起始地址为奇地址,或访问双字型数据时其起始地址不是4的倍数的地址,或者访问4字型数据时起始地址不是8的倍数的地址,都是未对准界限,或简称未对界。

在前面介绍的标志寄存器EFLAGS中,有一个控制标志位AC(位18),称为对界检查标志。该位设置为1,意味着要进行对界检查,并且当检查出未对界发生时,CPU将产生一类型号为17的异常中断;AC位为0时,意味着访问内存时不进行对界检查。

CR0中的AM位对EFLAGS中的AC位进行控制:如果AM位置1,使AC位具有所指定的控制作用;AM为0,表示AC位不再起控制作用,也就不会有类型号为17的异常中断产生。

(5)写保护控制位WP。在对存储器管理采用分页方式时,WP对只读页面提供保护控制功能。如果设定WP位为1,则在管理程序中出现了对只读页面写操作时将自动产生故障中断(类型号14);当WP为0时,允许有条件地对只读页面写操作。

2.系统地址寄存器

为了实现保护模式的功能,系统软件(操作系统)需要在存储器内定义4种表,也可以称表段。较低层次的两个表段是:局部描述符表段LDT,有多个,每个任务一个;任务状态段TSS,有多个,每个任务一个。需要注意的是,这些段也和程序的代码段、数据段有相同的属性,就是也有各自的描述符,这些描述符将存储于较高层次的描述符表段内。较高层次描述符表段有:全局描述符表段GDT,只有一个;中断描述符表段IDT,只有一个。LDT表段描述符和TSS任务状态段的描述符存储于全局描述符表段GDT内。全局描述表段GDT和中断描述符表段IDT都只有一个,它们本身不需要完整的描述符。它们的基地址和段界限直接分别存储于全局描述符表寄存器GDTR、中断描述符表寄存器IDTR中。从相反方向看过去,GDTR内的32位基地址和16位界限值,直接定位了全局描述符表段GDT在内存中的位置;GDT内的任一项描述符,指向较低层次的一个LDT表段、TSS段或直接指向层次更低的程序的代码段、数据段。除了GDTR和IDTR两个系统级地址寄存器之外,还有局部描述符表寄存器LDTR和任务状态段寄存器TR两个系统级地址寄存器。LDTR用于指向当前任务正在使用的局部描述符表段;TR用于指向当前任务的TSS段。LDT段和TSS段都有多个,而LDTR和TR只寄存当前正在活跃的LDT和TSS描述符。LDTR、TR的结构和CS、DS等段选择符寄存器一样,可以由指令访问的只有16位,即选择器部分,用以寄存正在执行任务的LDT描述符表段的16位选择符和正在执行任务的TSS段的16位选择符。LDTR和TR也有相应的描述符高速缓冲寄存器部分。当某个LDT(或TSS)的选择符装入LDTR(或TR)的选择器部分时,将自动地把这个LDT(或TSS)的描述符装入相应的描述符高速缓冲寄存器部分。

这些表段和寄存器更多的应用将在下面的虚拟存储、多任务和保护部分说明。

9.2虚拟存储器原理

虚拟存储器是通过管理把主存储器(常称为内存)和辅助存储器(常称为外存,例如磁盘)有机地结合起来,使得程序员可以按比主存储器容量大得多的存储空间编制程序。这时,把程序员编程可用的空间称为虚拟空间,把主存储器的实际空间称为物理空间。虚拟存储器的实现,允许同一程序的一部分在主存储器中,其它部分在辅助存储器里。运行时,可能会频繁地进行着辅存部分装入主存,主存部分传至辅存的操作。这就要有一套技术通过程序进行管理,也需要CPU内有相应逻辑结构的支持。本节以80486为例,介绍其与虚拟存储、多任务保护有关的逻辑结构和概念。

9.2.1实现虚拟存储的基础

在第2章的2.7节,结合图2.12介绍了高档微处理器在保护模式下访问存储器的寻址机制。关键是要理解段、段寄存器中的段选择符、段描述符、为保存段描述符而定义的段(称为描述符表)的概念和它们之间的关系。如图9.2所示,概括地说,保护模式下访问存储器的地址由段基地址和偏移地址两部分合成。偏移地址根据寻址方式计算,为32位;段的基地址不是段寄存器直接提供的,而是经过段寄存器中的选择符中的索引号,指明存储于段描述符表中的描述符,这个描述符提供了段的基地址。正是这种“间接提供”基地址方法,使得可寻址空间几乎可以无限扩大,因为只要把描述符中基地址的位数增加就可以了。

为了后面讨论的方便,这里介绍虚拟地址、物理地址和线性地址三种存储地址空间的概念。图9.280486保护模式下寻址过程

1)虚拟地址

虚拟地址即逻辑地址,也就是程序访问存储器时由程序指明的地址。在实模式下,与8086CPU相同,一个虚拟地址是用它的段地址和段内偏移地址两部分表示的。因为任何由程序访问内存的操作,总是要指明段地址和段内偏移地址。保护模式下,虚拟地址仍由程序指明段的基地址(即段地址)和偏移地址两部分表示,也就是说,任何由程序指明的访问存储器操作,必须指明一个段的基地址和一个偏移地址而组成虚拟地址。

2)物理地址

物理地址即物理存储器的地址。物理存储器是CPU可以访问的存储器。物理存储器空间的大小由CPU具有的地址总线的位数决定。对于8086CPU,地址总线为20位,其物理存储空间为220B,即1MB地址。由8086CPU内部逻辑决定的由虚拟地址变换成物理地址的规则是,16位段地址(在段寄存器中)左移4位与16位偏移地址相加,得到20位地址,即是物理地址。

80486CPU的地址总线为32位,决定了物理存储器地址空间为232B(4GB)。一个程序要占用的虚拟存储器空间大于CPU可以直接访问的物理存储器空间,这就出现了矛盾,解决矛盾的方法是将虚拟存储器空间扩展到磁盘上,也就是说,虚拟存储器空间是由磁盘等外部存储器支持实现的。

3)线性地址

段的基地址与偏移地址之和称为线性地址。由于段基地址和偏移地址都是32位,所以线性地址也是32位。在分页机制被禁止的情况下,线性地址就是物理地址,如图9.2所示。而在分页机制被使用时,分页机制将把线性地址转换成物理地址,如图9.3所示。图9.3分页机制转换线性地址为物理地址这种存储器管理或存储器分配一般是由操作系统进行的,但CPU内部结构必须支持存储器管理功能。80486CPU内的分段存储管理机制和分页管理机制为操作系统的虚拟存储器管理提供了必要的硬件支持。

9.2.2实现虚拟存储的控制方式

虚拟存储器的操作必然有内存与硬盘之间频繁的信息交换。根据内存与硬盘之间交换信息的管理控制方式的不同,虚拟存储器的控制可分为分段控制、分页控制和段页控制三种方式。

1.分段控制方式

前面的讨论已经为理解虚拟存储器的分段控制方式打下基础。因为对于编程而言,任何信息(包括程序本身)都是分段存储的。这些段包括熟悉的代码段、数据段、堆栈段,还包括描述符段等系统段。分段控制方式的基本思想是把段作为基本信息单位在主存和硬盘之间传送。在信息分段存储下,还有两位状态信息,即P位和A位的状态信息起着重要控制作用,它们都在图2.12给出的段描述符的12位“属性”字段中,其中的访问权字节见图9.7(c)。

P位,指明该段当前是否在内存中。P位为1,表示该段在内存中;P位为0,表示该段不在内存,而在硬盘中。如果要访问P位为0的段,必须转入操作系统中负责把该段从磁盘装入内存的程序。

A位,代码段或数据段属性字段的A位是这样操作的:每当该段被程序访问时,将A位置1,操作系统按一定周期查看、记录A位的状态并使A位复位为0。借助对A位的操作,可以统计出近期一段时间内该段被访问的频繁程度,以决定是否把该段移送硬盘。在虚拟存储器系统中,随着程序的运行,把存于磁盘上的段装入内存是常有的操作,自然也有从内存中删除某些段的操作。分段管理的优点是段的分界和程序的自然分界相对应;段的逻辑独立性使它易于编译、管理、修改和保护,也便于多任务共享。分段管理的缺点来自于段长度不固定、不相同。段的起点和终点不定,对内存空间分配带来不便,每次对内存清除腾空的段长度必须大于将要从磁盘装入的段,在内存与磁盘多次交换段之后,内存中将出现许多空余的零碎存储空间无法利用而浪费。

2.分页控制方式

80486CPU中,对于存储器管理除分段控制机制外,还有分页控制机制。在前面介绍的控制寄存器CR0中的PG位就是分页机制控制位,该位设置为1,意味着分页机制被使用;该位设置为0,表示分页机制不使用。分页管理将克服简单分段控制的缺点,把虚拟存储空间和内存物理空间都划分成长度为4KB的页;页的起点地址和终点地址都是固定的;无论是程序还是数据,在内存中存储和在内存与磁盘之间交换时都是以4KB的页为单位进行的。这就是说,一个程序或一个段都可以划分为多个页,在划分为多个页时,这些页在内存中不一定是地址相邻的。在从磁盘向内存调入一页时,只要内存有空闲页就可容纳。唯一可能造成浪费的存储空间是程序最后一页所留下的剩余空间。由于一页的字节数只有4KB,所以剩余空间必然小于4KB。

图9.4是分页控制时存储器的寻址过程。图9.4分页控制时的存储器寻址过程图中的“CPU分页机制”概括为以下几点:

(1)把内存的物理空间划分为每4KB为1页,页与页互不重叠,页的开始地址必须是地址码低12位全为0,页的最高地址必然是地址码的低12位全为1。

(2)和分段管理方式中引入段描述符和为存储描述符而定义描述符表段的思想类似,分页控制方式引入描述页属性的“项”,定义存储项的“项表”页和存储项表页的“目录”页。它们之间是层次关系。

项包含32位(4B)描述页的物理地址和属性信息, 其中20位是物理地址的高20位(页起始地址的低12位为0),其余12位为属性信息。这类似于分段控制中的段描述符。项表是不超过1024项的集合,其占据的4KB内存空间就是页表页。这类似于分段控制中的描述符表段。

描述页表页也需要项,而且描述页表页的项也需要组成表,占据页。这个表称为目录,在内存中存于目录页。

现在可以看出项的层次关系和伴随的页的不同作用。虽然项都是4字节的描述页的信息,但页表中的项和目录中的项,在存储器编址和寻址过程中的作用是不同的。

(3)前面介绍过的CPU内的系统级控制寄存器CR3是目录的物理基地址寄存器,它寄存着目录的物理起始地址。CR3用其32位中的高20位给出目录页的起始地址(低12位全0)。从以上所述可以看出,对任何一个存储单元的编址包含三部分信息:这个单元在页内的地址、对应的页表项在页表中的地址以及对应的目录项在目录中的地址。

在使用分页功能时,CPU分段机制形成的32位线性地址分解成三个字段:位11~位0,共12位,指明页内的偏移地址;位21~位12,共10位,作为页表项在页表内的索引号,这个索引号乘以4,就是页表项在页表页内的偏移地址;位31~位22,共10位,作为目录项在目录中的索引号,这个索引号乘以4,就是目录项在目录内的偏移地址;目录的起始地址在CR3中。分页的机制介绍之后,下面介绍内存与硬盘交换信息的控制方法。

都是4字节的目录项和页表项的格式是相同的,但它们描述的对象是不同的:目录项描述的是一个页表,而页表项描述的是一页。除了位31~位12(共20位)给出了页表或页的起始地址的高20位外,位11~位0给出了属性信息:P(Present)位表示该项是否正确可用。P位为1,表示该目录项或该页表项正确,可在线性地址到物理地址变换中使用;P位为0,表示该项不可用,此时,其它位已无意义。A(Access)位的意义和前面讨论描述符内的A位意义相同:程序对该目录项或页表项描述的地址区域进行访问时,CPU的固件将A位置1,由软件(操作系统)周期性地将A位复位为0,这样,对A位为1状态的统计可以知道该页的活动情况。D(Dirty)位在目录项中无意义,在页表项中,当程序向对应页写入数据时,使D位置1。和A位一样,D位只能由操作系统复位为0,所以D位用于描述对应页被写入的情况。U/S(User/Suppervisor)位和R/W(Read/Write)位用于支持页保护功能。标有AVL(位11~位9)留给操作系统定义和使用。分页控制方式的缺点:由于页不是编程使用的独立的存储空间单位,所以对于页的处理、保护和共享都不及分段控制方式来得方便。

3.段页控制方式

段页控制方式就是将分段控制方式和分页控制方式结合起来,先对程序按模块分段,然后段内再分页,内存与硬盘之间仍以页为基本信息传送单位,而在编址寻址时,用段表和页表(每段一个页表)进行两级定位管理。对这种控制方式这里不再深入讨论。 9.3多任务的实现原理

高档微处理器最主要的特点是支持多任务操作系统,例如Windows。本节介绍高档微处理器支持多任务操作的机制。

不严格地说,多任务就是微机系统同时运行多道程序,每道程序又可以处于不同阶段。对于存储器来说,可能多道程序的全部或部分处于内存中。例如在Windows下,可以打开IE、Word、PowerPoint等多个程序窗口,有的在前台运行,有的在后台运行。第1章图1.3给出的多道程序分时操作已经表明多道程序在时间上是如何互相分时而协调的。多任务是由操作系统和支持硬件共同实现的。支持硬件主要是9.1节讲的系统级控制寄存器和地址寄存器,还需要补充和说明。9.3.1任务状态段TSS和门(Gate)描述符

任务状态段TSS在操作系统术语中常称为进程控制块,在这里是在内存中定义的存储格式确定的段,每个任务一个。任务状态段本身不包含任务的程序,只用于记录任务的有关信息。由于任务在系统运行过程中的状态是不断变化的,所以必须把这些信息记录下来,以便操作系统对任务进行调度。系统在建立任务的同时定义该任务的任务状态段,在撤消任务时也就撤消了它的任务状态段;在任务切换过程中,必须既要访问原任务的任务状态段,向其中保存当前CPU寄存器值,以备以后返回,又要访问新任务的任务状态段,从其中读取相关状态信息并装入CPU的寄存器,使新任务开始运行。当前任务的任务状态段描述符寄存在CPU的TR寄存器中。为了说明方便,称转换前的任务为旧任务,转换后的任务为新任务,它们的TSS分别用TSSO和TSSN表示。TSS段的结构格式如图9.5所示。图9.5TSS的结构格式

TSS所包含的信息如下:

(1)字节0、1共16位称做反向链(BackLink)。如果该任务状态段为TSSN,那么反向链保存TSSO描述符的选择符,是在任务转换时自动装入的。从该任务返回旧任务时,需要这个选择符返回原来任务,很像子程序调用时压入堆栈的的返回地址。

(2)字节4~1BH存储三个特权级堆栈的SS和ESP修改值。关于特权级和特权保护的概念将在下节讨论,这里只需知道在控制转移过程中,可用这些值修改SS和ESP寄存器的值。

(3)字节1CH~5FH标有CR3~GS,存储CPU各寄存器的初值。这就是说,在任务转换时,要把TSSN的这些值装入CPU寄存器,其中包括CS和EIP,使程序运行从新的起点开始。

(4)字节60H和61H存储本任务的LDT表段描述符的选择符。在任务转换时,用TSSN的这个值修改LDTR,包括把LDT表段的描述符自动装入LDTR的高速缓冲器部分,表明它是当前任务的TSS。

(5)字节64H的位0标以T,与调试支持功能有关,这里不再介绍。

(6) I/O地址位屏蔽偏移量和I/O地址位屏蔽共同支持输入输出的保护功能。其基本原理是,在执行任务时,可以屏蔽某些I/O端口地址,当有I/O指令访问被屏蔽的I/O端口时,将产生异常中断,从而达到保护的目的。

对于TSS中的信息,简单地说,初始任务的TSS是用程序定义置入的。在任务切换时,切换前的CPU状态信息,除了把TR中的选择符字段作为反向链存入TSSN之外,其它状态信息存入TSSO,以便任务返回切换时使用。任务切换时,TSSN中的信息大部分要分别置入CPU的有关寄存器,作为新任务运行的初始状态。由于TSS段的特殊作用,TSS段的描述符只能定义在全局描述符表GDT中。在任务切换过程中,从GDT中读取或写入TSS段的描述符。

前面9.1节讲的中段描述符表段IDT,保存的是门(Gate)描述符。一般意义上的“门”,是“过渡”机制。门描述符,简称门,用于程序的转移,包括任务之内的间接段间转移、任务之间切换和转入中断服务子程序。根据功能不同,门有4种:调用门,用于任务之内段间间接转移;任务门,用于任务之间切换;中断门和陷阱门,用于调用中断服务程序和陷阱处理程序。门的用途不同和程序中用于转移的指令不同,决定了它们可以包含在哪种描述符表段中:调用门的描述符可以在GDT和LDT中;任务门的描述符可以在GDT、LDT和IDT中;而中断门和陷阱门的描述符只能在IDT中。表9.1综合了各种描述符表段可以定义的描述符类型。表9.1各种描述符表段内可以定义的描述符类型门描述符的格式符合功能要求。门描述符与段描述符的主要区别是,在8个字节的描述符格式中,段描述符有32位段的基地址和20位的段界限值;而门描述符中有16位的选择符指向其它描述符,不需要指明段的界限。调用门、中断门和陷阱门的描述符还有32位地址偏移量,指明代码段段内偏移地址;而任务门用于间接的任务转换。任务门不同于调用门的是,其中的选择符指向TSS描述符,而不是指向代码段的描述符。由于TSS描述符的选择符将引出一个TSS描述符,进而指向一个TSS段,所以在调用门中4个字节的偏移值对于任务门是无意义的。9.3.2任务的设置、启动和任务之间的切换

1.任务的设置和启动

CPU在加电或复位(Reset)之后立即进入实模式开始运行程序。如要进入保护模式执行任务或进行任务转换,必须做三件事:①在实模式下的初始化和转入保护模式的准备;②从实模式转入保护模式;③执行任务和任务之间的切换。

三件事中之②,即从实模式转入保护模式最为简单,只要将图9.1中的控制寄存器CR0的PE位(位0)置1即可,用下面两条指令实现:

MOVEAX,1

MOVCR0,EAX三件事中之③,即进入保护模式后如何开始执行任务有两种方法:控制转移法和任务转换法。这两种方法都用JMP指令,此时的JMP指令格式为:

JMP(选择符:偏移量)

控制转移法用的JMP指令,其格式中的段选择符指向GDT的第一个代码段描述符,所以JMP指令执行后,将第一个代码段描述符选择符装入CS,对应的段描述符装入CS对应的描述符高速缓冲寄存器。其中的段基地址成为当前段的段地址。可见,控制转移法是用一条JMP指令进行段间间接控制转移。任务转换法也是用一条JMP指令,但利用的是JMP的直接任务转换操作。也就是说,JMP格式中的选择符指向GDT的一个TSS描述符,进而指向一个已被定义的TSS段,TSS段中给出的初值自动装入CPU各寄存器,开始执行第一个任务。

三件事之①,即在实模式下的初始化和转入保护模式要完成的准备操作与如何开始执行任务的方法有关,任务转换法与控制转移法稍有不同。下面是在实模式下程序应完成的准备操作:

(1)在存储器中定义一个GDT段,其中包括建立必要的各种描述符。在利用控制转移法转入任务执行时,GDT中至少应包含一个空描述符、一个代码段描述符和一个数据段描述符,如图9.6所示。GDT段的定义在其中建立描述符的编程过程(此时还在实模式下)是,首先用定义结构伪指令定义描述符结构,然后在数据段中定义GDT,其中设置结构变量以建立描述符。图9.6最简单保护模式下的GDT定义结构的例子如下:

DescSTRUC ;结构开始

LimitDW? ;段界限低16位

base_lDW? ;段基址低16位

base_m  DB? ;段基址16~23位

access DB? ;访问权字节

granDB? ;段界限高4位和部分属性

base_hDB? ;段基址24~31位

Descends ;结构结束在数据段定义GDT的例子如下:

gdt_defEQU$

desc<>

gdt_kcs desc<0fffh,0,0,9ah,0,0>;9ah=exec/read,DPL=0

gdt_kds desc<0fffh,0,0,92h,0,0>;92h=p,DPL=0,type=2

gdt_size    EQU$-gdt_def本例中定义了一个GDT表。在汇编语言中 $ 称为地址计数器(LocationCounter),它是一个特殊的操作数,在汇编过程中代表当前地址,即在哪里出现就代表哪里的地址。gdt_def是GDT的开始地址,GDT的字节数为gdt_size。本例中建立了三个描述符:一个空描述符;一个代码段描述符,首地址为gdt_kcs;一个数据段描述符,首地址为gdt_kds。用这样的方法,在GDT中可以建立更多的描述符。这里用“建立”这个词,是因为只为描述符定义了“框架”,其中只对访问权字节赋予了初值。其它字段,如基地址、界限值等还没有置入真实值。如果用控制转移法转去执行任务,如上述定义两个描述符是最低的要求。它能控制转移到这个代码段描述符指向的代码段。在这个代码段内再定义其它描述符、LDT、TSS等。这里的数据段同时也用作堆栈段。

如果用任务转换法开始执行任务,那么在GDT中至少还要定义两个TSS描述符,一个指向TSSO,另一个指向TSSN。因为在执行任务转换的JMP或CALL指令时,要向TSSO中存入当前CPU的状态值,还要从TSSN中取值装入CPU各寄存器,这样才能开始任务的执行(关于任务转换的操作将在后面说明)。

(2)在实模式时,要对GDT中建立的必要的描述符置入初值。先要计算出应赋的初值,如基地址、界限值等,然后用传送指令把初值装入描述符的相应字段。

(3)用LGDT指令把GDT的基地址和界限值装入GDTR寄存器(32位基址和16位界限值),使GDT成为可使用状态。

(4)用(1)和(2)所述相似的方法, 在存储器中定义IDT并根据需要在IDT建立中断门、陷阱门和任务门。

(5)用LIDT指令把IDT的基地址和界限值装入IDTR,使IDT成为可使用状态。在实模式下完成上述准备后,如前所述用传送指令使CR0寄存器的PE位置1,CPU进入保护模式。

进入保护模式后,凡是访问存储器都要遵循新的寻址规则。首先必须修改CS的内容,CS的修改值就是第一个要执行的代码段的选择符。随着CS中装入这个选择符,代码段的描述符自动装入属于CS的高速段描述符缓冲器,使段的基地址起作用。为了实现这样的操作,一种选择是在进入保护模式后的第1条指令(紧随使CR0的PE位置1指令)为段间转移指令:

JMP偏移量,选择符在实际编程时,这条指令的指令码常用下列3条伪指令表示:

DB0eah ;段间转移JMP指令码第一字节(操作代码)

DWoffsetlabelen ;lablein为入口地址标号

DWgdt_kcs_sel ;gdt_kcs_sel是在GDT中第1个代码段描述符的选择符值

3条伪指令的第1条是段间转移JMP的指令操作码字节,第2条是转移目的地址的段内偏移量(16位),第3条给出的是选择符,应该事先用equ伪指令使gdt_kcs_sel赋予正确值,如:

gdt_kcs_selEQU08

它是GDT表内描述符1的选择符。

这3条伪指令组成JMP指令执行后,gdt_kcs_sel选择符装入CS,对应的描述符装入属于CS的高速缓冲寄存器,目的地址的段内偏移量装入IP(16位),程序从这个入口继续执行下去。在程序的第1个代码段中,把第1个数据段描述符选择符装入所有数据段寄存器,或者用不同的选择符修改各数据段寄存器。此外,在第1代码段中还必须定义若干个TSS描述符和LDT描述符,把它们置入GDT中; 把某个LDT描述符选择符用LLDT指令装入LDTR的选择符字段,使其对应的LDT描述符自动装入LDTR的高速缓冲器,对应的LDT成为进入使用状态;同样,用LTR指令把某个TSS描述符的选择符装入TR的选择符字段,对应的TSS描述符自动装入TR的高速缓冲器,使对应的TSS成为当前任务的TSS。值得说明的是,指令LLDT和LTR是高档微处理器才有的,只能在保护模式下执行,如果试图在实模式时执行这两条指令,将产生异常中断。以上是在进入保护模式后用段间转移JMP指令向CS赋初值,然后向其它段寄存器、LDTR、TR赋初值的操作。另一种选择是进入保护模式后,用JMP或CALL指令进行任务转换操作方法,转去执行任务。为了实现这一方法,一方面,需要在实模式作准备时在GDT中定义两个TSS描述符,一个为TSSO,另一个为TSSN,对TSSN要赋初值,因为在任务转换时,将把TSSN的值装入CPU各寄存器,然后执行任务;另一方面,在进入保护模式后还要先用LTR指令把TSSO的选择符装入TR的选择器段,使TSSO的描述符自动装入TR的高速缓冲器,这是因为在任务转换时TSSO将保存当前的CPU寄存器。这些准备完成后,用一条JMP或CALL指令,指向GDT中的TSSN描述符,就可开始执行TSSN的任务。

2.用JMP、CALL指令实现任务转换

前面曾经讲过,在系统工作于多任务时,每个任务有自己的TSS和LDT。正在执行任务的LDT描述符及其选择符在LDTR中寄存,它的TSS描述符及其选择符在TR中寄存。从一个正在执行的旧任务转换为执行一个新任务,意味着TR和LDTR需要更新。

如果JMP或CALL指令后的选择符指向GDT中的描述符,经过硬件逻辑判别,其类型(描述符的属性字段有“类型”指示位)为TSS描述符,那么就意味着将进行直接任务转换,CPU的固件将控制完成以下操作:

(1)按指令格式中选择符的指引,从GDT中取出TSSN的描述符,装入TR的描述符高速缓冲器,使其指向TSSN。

(2)从TSSN中取出新的LDT描述符的选择符,装入LDTR的选择符段,并随之自动地把对应的LDT描述符从GDT中取出装入LDTR的描述符高速缓冲器。

(3)把当前CPU各寄存器的值存入TSSO中,以备返回时使用。

(4)把TSSN中的各值装入CPU对应的各寄存器,完成新任务的初始化。

(5)把当前TR的选择符装入TSSN的反向链字中。如果要从新任务返回旧任务,只需从反向链中取出旧任务TSSO描述符的选择符,重新装入TR即可。

(6)用JMP或CALL指令后的选择符修改TR的选择符段。

至此,程序将从新起点(TSSN提供代码段描述符和EIP)开始执行。上述6项操作是一条JMP或CALL指令完成的操作。前面已经说过,之所以不同于一般的段间转移操作,是因为指令后给出的选择符的类型是TSS描述符的选择符。以上所述是直接任务转换操作。如果JMP或CALL指令后的选择符指向的不是TSSN描述符,而是任务门(在GDT或当前的LDT中),那将引起间接任务转换。间接任务转换比直接任务转换只多了一项操作,那就是先要通过任务门选择符找到GDT或当前LDT中的任务门,从任务门中取出TSS描述符的选择符,这以后的操作就和直接任务转换相同了。除了JMP、CALL指令可以进行任务转换外,IRET和IRETD指令也可以进行任务转换。这两条指令实现的是从正在执行的“新”任务到“新”任务之前的“旧”任务转换。IRET本来是中断返回指令,只有在Flags寄存器中的NT位为1时,才能实现“新”到“旧”的任务转换功能。用IRET或IRETD指令返回“旧”任务时的操作是,把当前TSS中反向链字保存的选择符装入TR的选择符段,然后自动地把“旧”的TSS描述符装入TR的描述符缓冲器,TSS中的各值装入CPU各寄存器,将使由于JMP或CALL指令转换被中断了的任务重新继续运行。 9.4保护功能的实现原理

CPU在保护模式下最重要的特征之一是具有保护功能。为什么需要保护功能呢?

在8086/8088系统运行DOS2.0的时候没有保护功能。对于汇编语言的程序,由于程序设计出现简单错误,在运行时破坏了常驻内存的DOS部分而造成死机,这是常有的事。之所以出现这种情况就是因为没有保护功能,指令访问内存时超越了可以访问的范围。这对于单任务系统来说造成的危害不是很大,但是对于多任务系统,在内存中同时可能有多个任务的程序,如果没有保护功能,任务程序中的一条错误指令可能造成整个系统的破坏,后果是不堪设想的。保护功能的讨论涉及的问题有:保护的任务是什么,或者说有哪些方面应该受到保护;保护的规则是什么,也就是说,保护意味着不允许出现“不合理”的操作,那么“合理”操作与“不合理”操作是如何定义的;CPU内实现保护功能的机制是什么。在本节讨论之后,应该能理解这些问题。但是,这是一个较难讨论的问题,因为保护的任务、保护的规则和保护的机制三个方面是互相交织的,不能分别讨论。因此,讨论可以从以下不同的思路进行:

(1)按异常中断类型讨论保护。所谓保护,就是当出现了不合理的指令或操作要求时,CPU将拒绝执行,并进入某种异常中断。不同的异常中断有不同的处理程序。有的异常中断处理程序将通知用户出现了哪种不合理的指令或操作,以便修改。例如执行除法指令时,如果除数为0,则将引起中断类型号为0的异常中断,这可看做是一种保护功能。80486CPU的多种异常中断是为实现保护功能而设置的。所以一种讨论路线是逐个讨论异常中断类型。

(2)按访问存储器过程不同讨论保护。保护出现在操作过程中,例如用JMP指令实现间接任务转换要经过一系列操作,几乎每个操作过程都要判断是否合理,都有保护规则。所以另一种讨论路线是按不同的访问存储器的过程讨论保护的功能。

(3)描述符的字段格式、选择符的格式、描述符表以及相应的系统级寄存器、控制寄存器字段中,都包含着保护的信息。按照这些保护信息,更容易讨论保护的任务、规则和实现机制。所以下面将主要沿着这种思路进行讨论。9.4.1特权级保护

在前面的讨论中,段选择符、描述符以及系统级寄存器中都包含特权级信息。如图9.7所示,段描述符的选择符,在其未装入段寄存器之前,称为选择符修正值,其最低两位称为请求特权级RPL(RequestPrivilegeLevel);在16位的CS中的选择符最低2位称为当前特权级CPL(CurrentPrivilegeLevel);段描述符中的访问权字节的位6、位5指明描述符特权级DPL(DescriptorPrivilegeLevel)。S=1,是代码段、数据段或堆栈段;S=0,则是系统段或门描述符。段描述符访问权字节中的P位、A位的功能已经在9.2.2节说明,分别用于指明该段是否在内存和该段被使用的频度。TYPE位指明描述符的类型。此外,在CPU的标志寄存器FLAGS中的位11和位12两位规定了I/O特权级IOPL,用以指明在什么情况下I/O指令允许执行或不允许执行。图9.7特权级信息(a)未置入段寄存器的选择符;(b)置入CS的选择符;(c) S=1访问权字节;(d) S=0访问权字节

1. 4级特权级和特权规则

如上所述,特权级采用两位指示位,这就决定了4个特权级,分别为0级、1级、2级和3级。0级为最高级,3级为最低级。4级特权级机制能支持多任务操作系统的需要,使得用户程序之间和用户程序与操作系统之间能相互隔离和保护。4级特权级机制还控制着特权指令、I/O指令的使用和执行以及对段和段描述符的访问控制。特权级保护机制中,为每个段赋予一特权级别,使系统中的全部程序形成一个4级层次保护结构。操作系统的核心部分具有最高特权级0级,操作系统中的系统服务部分具有次高级1级,特权级2级留给操作系统的扩充部分,用户的应用程序指定为最低级3级。除了为各种软件指定特权级之外,保护含义的重要内容是特权规则。特权规则的两个要点是:

(1)对于数据而言,特权级为P级的数据段的数据,只能由特权级为P级或比P级更高级的代码段访问(包括读和写)。

(2)对于程序而言,特权级为P级的代码段和代码段中的过程(即子程序),只能由正在执行的P级代码段或比P级更低的代码段来调用。从特权级层次关系和上述两项特权规则,不难得出这样的保护关系:用户程序可以调用操作系统提供的程序。这是合理的,因为操作系统的程序是经过精心设计并经过考验,具有高可靠性。这种调用可以简化应用程序的开发。用户程序不能访问(读、写)操作系统的数据段。这也是合理的,如果用户程序修改了操作系统的数据,那么可能造成灾难性的后果。操作系统不能调用用户程序,不但用户程序没有可靠性保护,而且操作系统不应该指望调用用户程序来完成属于操作系统本身的任务。但是必须允许操作系统的程序能访问用户的数据,因为在用户程序为完成自己的任务而调用操作系统的程序时,要处理的是用户的数据。特权规则和用户程序与操作系统之间的保护关系无疑是合理的,但是在程序设计过程中,RPL、CPL、DPL本来是有关系的,但却是独立设置的,不可能保证不出错,所以才需要保护机制的保护。如何实现呢?高档CPU中,把这些保护功能集成于存储器管理单元中。

特权级的保护功能主要体现在访问描述符,特别是修改当前段的操作过程。由于程序是由代码段、数据段和堆栈段组成的,所以段的特权级是最基本的,特权级的保护功能的核心是对段的保护。前面说过的两点特权规则体现在段的保护时,变成了这样的原则:

(1)不允许从特权级高的代码段向特权级低的代码段控制转移。

(2)特权级低的代码段在运行时不允许访问特权级高的数据段。

(3)允许特权级低的代码段向特权级高的代码段控制转移和转移后返回到原来特权级低的代码段。但是在控制转移和返回的两种操作中,都要进行堆栈段的更换,使堆栈段的特权级保持与当时代码段特权级相同。段的改变体现在对段寄存器内选择符的修改上。段的特权级保护最终落实到这样的操作过程:当用一个选择符试图修改段寄存器并获取描述符时,检查选择符中的RPL、CS中的CPL以及选择符对应的段描述符中的DPL三者之间的关系,看它们是否满足段的保护规则。如果满足保护规则,操作正常进行,修改段寄存器并把对应的描述符装入段寄存器的描述符高速缓冲器;如果不满足保护规则,将不进行修改段寄存器的操作并产生中断类型号为13的异常中断。下面分别讨论利用特权级对数据段、堆栈段和代码段的保护。

2.数据段的保护

特权级机制对数据段的保护,体现在修改数据段寄存器内容的操作过程中。数据段寄存器DS、ES、FS和GS的内容用传送指令(MOV、LDS、LES、LFS、LGS)直接修改。例如修改DS的内容可用下列指令:

MOVDS,AX

其中,AX中已先置入了一个数据段的选择符。在实模式下,这条指令的执行没有什么限制条件,但在保护模式下,AX内容向DS传送前,要经过几项判别,其中之一是特权级的判别,必须满足以下关系才能执行:

DPL≥MAX(CPL,RPL)其中,CPL为当前特权级,即当前代码段的特权级。RPL是装入了AX内待装入DS的选择符的特权级。DPL是该选择符对应的在GDT或LDT内的数据段描述符的特权级。在大多数情况下,RPL是由CPL形成的,所以RPL=CPL,这样,保护的条件变为:

DPL≥CPL(值大意味着特权级低)

这个保护条件的意义是,代码段(程序)只能访问特权级与它相同或比它低的数据段。所形成的选择符,也有可能RPL不等于CPL。如果满足关系

DPL≥RPL>CPL或DPL≥CPL>RPL

是不存在问题的,因为它们满足:

DPL≥MAX(CPL,RPL)

如果形成的选择符出现了这样的关系:

RPL>DPL≥CPL

它不满足保护条件:

DPL≥MAX(CPL,RPL)当出现这种情况时,将不能执行传送指令MOVDS,AX,而产生异常中断13。

如果出现不合理的RPL值,在修改段寄存器指令之前,用调整RPL指令,可以使RPL变为合理值。

3.堆栈段的保护

堆栈段寄存器SS的内容可以直接修改,也可以间接修改。直接修改时,例如用指令:

MOVSS,AX

其中AX内是堆栈段描述符的选择符。执行该指令时,特权级的判别应满足的条件是:

DPL = RPL = CPL

这里,CPL是正在执行的代码段的特权级,RPL是AX内待装入SS的选择符的特权级,DPL是选择符对应的堆栈段描述符的特权级。三个特权级相等的条件意味着,堆栈段的保护要求正在执行的代码段只能访问有相同特权级的堆栈段。

4.代码段的保护

特权级机制对代码段的保护体现在对CS内容修改时的特权级条件限制。

1)直接修改CS时的保护

代码段寄存器CS的修改有直接修改和间接修改之分。直接修改CS出现在用JMP或CALL指令进行段间直接转移或段间直接调用的操作中。这时指令可以等效成:

JMP/CALL[选择符:偏移量]

其中的选择符一定是一个代码段描述符的选择符。这就是说,这个选择符将装入CS,取代原来的CS内容,程序将转移到新的代码段上执行。段间直接转移或直接调用引起的CS内容的直接修改,在特权级上必须满足的条件是:

DPL=RPL=CPL

这就是说,这种情况下,代码段的特权级不能改变。

2)间接修改CS和SS时的保护

先以门的选择符选出门,再用门中的选择符修改CS,这就经过了一个间接的过程。有以下几种操作属于这种情况:

(1)用JMP/CALL指令通过调用门、陷阱门和中断门实现任务内段间间接转移。指令格式中的选择符不是代码段描述符的选择符,而是门的选择符。

(2)用子程序返回指令RET或中断返回指令IRET实现高级段向低级段转移。

(3)利用任务状态段TSS实现任务转换。

(4)用任务门和任务状态段实现任务的间接转换。

这里不对每种操作的保护仔细讨论,用表9.2把它们综合起来。表9.2中,“转移类型”表示为什么要改变当前的代码段;“操作类型”给出了用什么操作改变当前的代码段;“引用的描述符”表明在改变当前代码段的过程中访问过哪种描述符,本来在访问调用门、陷阱/中断门和任务状态段描述符时,也有特权保护,但表中未列出;“目标代码段的特权限制条件”给出目标代码段与当前代码段的特权级要求。如果不满足所要求的条件,将引起异常中断13,起到保护作用。这些限制条件体现了特权规则——在同一任务内,特权级低的代码段可以调用特权级相同或更高的代码段,只有调用了更高级代码段之后,返回时才允许从高级代码段向低级代码段转移。不同任务之间的转换,代码段没有特权级限制。表9.2代码段特权级保护小结

5.输入输出的特权级保护和输入输出地址位屏蔽

I/O保护的机制包括两部分:一部分是图2.11中FLAGS寄存器有2位I/O特权级指示位IOPL;另一部分是图9.5所示TSS段中的I/O地址位屏蔽。

当CPU的运行状态为CPL≤IOPL时,即正在执行的代码段的特权级比I/O特权级相等或更高时,各种输入输出指令都可执行。输入输出指令有:IN、OUT、INS(字符串输入)、OUTS(字符串输出)、REPINS(重复字符串输入)和REPOUTS(重复字符串输出)。如果不满足上述条件,而是CPL>IOPL,执行输入输出指令将引起异常中断13。此外,还将检查当前任务TSS中的I/O地址位屏蔽状态信息,以决定I/O指令是否允许被执行或引起异常中断13。

TSS中的I/O地址位屏蔽区共有8K字节65536位,从位0开始每一位对应一个I/O端口地址,共有216=65536个端口。如果某一位被置1,意味着该位对应的I/O端口地址处于屏蔽状态;被复位为0的位所对应的I/O端口地址处于未屏蔽状态。当CPL>IOPL时,允许对未屏蔽的I/O地址执行I/O指令,但是,如果对处于屏蔽状态的I/O端口地址执行I/O指令,将引起异常中断13。9.4.2段类型保护和段界限保护

要修改段寄存器的选择符,除了其中的两位RPL之外,14位的索引号应该保证从GDT或LDT中选择正确的段描述符。选择符不正确,就不能从描述符表中选择正确的描述符,应该有保护机制保护。

在段描述符的属性(或访问权)字节中,除了DPL字段之外,类型(TYPE)字段提供了访问段的条件,应该提供不违背这些条件的保护。

段描述符中有段界限字段,应该提供保证不能越界访问的保护。此外,段描述符中的P位,指明对应的段是否存在于物理存储器中,当试图把不在物理存储器的段选择符装入段寄存器时,也要引起异常中断,以便把指定的段从磁盘中装入内存。

CPU的硬件与选择符、段描述符这些字段提供的信息相配合提供了这些保护功能。当不合理操作要求出现时,不仅不执行操作,而且会产生异常中断。

1.段选择符中索引号值的限制条件

选择符中的14位索引号的值必须保证所指的描述符在描述符表段的界限之内。为此,必须满足关系式:

索引号值×8 + 7 ≤ 描述符表的界限值

而且对于DS、ES、FS和GS,允许装入的选择符的值为0;但对于CS和SS,装入的选择符的值不能为0。

如果这些条件不能同时满足,将不执行装入操作,进入异常中断13。

2.描述符装入的限制条件

向段寄存器装入选择符时,不仅要求满足选择符的数值条件,还要检查选择符对应的在描述符表里的描述符类型是否合法。如

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论