微型计算机原理与接口技术 (第2版) 赵宏伟 于秀峰 黄永平 秦贵和 北京:科学出版社 出版 吉林大学计算机科学与技术学院 制作
第1章 Pentium保护模式存储管理 1.1 虚拟存储器及其工作原理 1.1 虚拟存储器及其工作原理 虚拟存储器又称为虚拟存储系统。虚拟存储器是为满足用户对存储空间不断扩大的要求而提出的,随着用户程序复杂性的增加,占用存储空间越来越大。其解决办法是,可扩大主存,但是造价高,空间利用率很低,并不是好的途径。采用虚拟存储器,可较好地解决这个问题。 虚拟存储器这个概念是1961年由英国曼彻斯特大学的Kilburn等人提出的,并于20世纪70年代广泛应用于大中型计算机之中,现在的微型计算机也都采用了这种技术。 虚拟存储器是由主存储器、辅助存储器、辅助硬件和操作系统管理软件组成的一种存储体系。它把辅助存储器作为主存储器的扩充,对应用程序员来说,好像计算机系统有一个容量很大的主存。虚拟存储系统的目标是为了增加存储器的存储容量,它的速度接近于主存,单位造价接近于辅存,因此性能价格比很高。
表1.1.1 虚拟存储器和Cache存储器的比较
1.1.1 地址空间及地址 在虚拟存储器中有3种地址空间及对应的3种地址。 3种地址空间分别是虚拟地址空间、主存地址空间、辅存地址空间。 1.1.1 地址空间及地址 在虚拟存储器中有3种地址空间及对应的3种地址。 3种地址空间分别是虚拟地址空间、主存地址空间、辅存地址空间。 虚拟地址空间:又称为虚存地址空间,是应用程序员用来编写程序的地址空间,与此相对应的地址称为虚地址或逻辑地址。 主存地址空间:又称为实存地址空间,是存储、运行程序的空间,其相应的地址称为主存物理地址或实地址。 辅存地址空间:也就是磁盘存储器的地址空间,是用来存放程序的空间,相应的地址称为辅存地址或磁盘地址。
1.1.2 虚拟存储器工作原理
存贮管理方式 由于采用的存贮映象算法不同,就形成了不同的存贮管理方式,其中主要有段式、页式和段页式3种。 Pentium支持分段存储管理、分页存储管理和段页式存储管理。Pentium微处理器片内存储管理部件负责对物理存储器实施安全可靠且行之有效的存储管理操作。当存储管理部件正常运转时,程序是不能直接对物理存储器进行寻址操作的,只能对一个被称之为虚拟存储器的存储器模型进行寻址操作。 Pentium微处理机的存储管理部件由分段部件和分页部件组成。分段部件可以提供多个各自独立的地址空间,而分页部件可以使用少量的随机存储器(RAM)和磁盘存储器去支持一个很大的地址空间模型。由程序提供的地址叫做逻辑地址。分段部件的功能之一就是将逻辑地址转换成一个连续的不分段的地址空间,这个地址空间的地址叫做线性地址。而分页部件的主要功能就是将线性地址转换成物理地址。
1.2 分段存储管理 1.2.1 分段存储管理的基本思想 通常,一个程序由多个模块组成,特别是在结构化程序设计思想提出之后,程序的模块性就更强了。一个复杂的大程序总可以分解成多个在逻辑上相对独立的模块,模块间的界面和调用关系是可以清楚定义的。这些模块可以是主程序、各种能赋于名称的子程序或过程,也可以是表格、数组、树、向量等某类数据元素的集合。模块的大小可以各不相同,有的甚至事先无法确定。但每一个模块都是一个特定功能的独立的程序段,都是以该段的起点为0相对编址。 把主存按段分配的存储管理方式就称为段式管理。程序进入内存时,各程序段要求占据相对独立的内存区间。因此,现代微机系统把物理空间分成相对独立的许多内存段,每个内存段放置一个程序段,至此内存段与程序段统一,统称为段。一个程序拥有多个段、不同程序占据不完全相同的几个段。而且管理系统所需要的信息放置在属于系统所有的段中。
1.分段存储管理工作过程
2.虚拟地址和虚拟地址空间 Pentium微处理机在保护模式下的存储器管理单元使用48位的存储器指针。 它分为段选择符(或简称为选择符)和偏移量两部分。该48位存储器指针称为虚拟地址,它在程序中用以规定指令或数据的存储器位置。段选择符16位,偏移量32位。 段选择符可放在Pentium微处理机段寄存器中。若要访问存储器中的代码,则段选择符应放在CS中。若要访问存储器中的数据,则段选择符应放在DS、ES、FS、GS、SS中的任意一个。 偏移量放在Pentium微处理机的用户可访问的寄存器中。若要访问存储器中的代码,则偏移量放在EIP寄存器中。若要访问存储器中的数据,则偏移量放在EAX、EBX、ECX、EDX、ESI、EDI等寄存器中。由于偏移量是32位长,所以段大小可达4G字节。我们说段大小可达4G字节是因为段大小实际上可变的,它可从1个字节到4G字节。
保护模式下的存储器指针及段选择符格式
3.虚实地址转换 Pentium微处理机的分段存储管理机制允许将46位虚拟地址映射到硬件所需的32位物理地址。 首先由虚拟地址(也称逻辑地址)段选择符部分的13位索引字段确定段描述符在段表(也称段描述符表)的位置。 然后取出段描述符中的32位基地址并与偏移量相加,得到32位的线性地址。如果不启用分页功能,则线性地址就直接作为物理地址。
虚实地址转换示意图
1.2.2 段描述符 段描述符是Pentium微处理机存储管理部件用以管理64T字节虚拟存储地址空间分段的基本元素。一个段描述符对应于虚拟地址空间中的一个存储器段。 段描述符是位于主存中的一种数据结构,由系统程序创建,它为处理机提供段的基本信息。所有段描述符均由8个字节组成。段描述符内保存着供处理机使用的有关段的属性、段的大小、段在存储器中的位置以及控制和状态信息。一般说来,各段描述符都是由各种编译程序、各种连接程序、各种装入程序或者是操作系统产生的,而不是由各种应用程序生成的。 段描述符按段的性质可分为程序段描述符、系统段描述符和门描述符,如图1.2.4所示。对于不同的描述符,其格式存在差异。
段描述符的分类
1.程序段描述符 程序段描述符的格式: (1)基地址字段 Pentium微处理机用这个字段来规定某一个段在4GB物理地址空间中的起始位置。段描述符的第2~4和第7字节组成了32位的基址字段,这个基址可以访问4G(232)字节的主存空间。 (2)段界限字段 段描述符中的段界限字段是用来定义段的大小规模。段描述符的第0、1字节和第6字节的低4位是20位的段界限字段,该字段的值决定了段的长度,而该字段的值的单位由“G”位决定。“G”位称作粒度位,用来确定段界限所使用的长度单位。 (3)粒位G字段 段描述符中的这个字段是用来确定段界限所使用的长度单位。段描述符的第6字节的D7位是粒度位G字段。G=0时,段的长度以一个字节为单位。G=1时,段的长度以4K(212)字节为单位。当G=0时,段界限字段值的范围可从1B到1MB(因为段界限为20位)范围。在这种情况下,段界限字段的值可在1B的基础上,每次增值1B。当G=1时,段界限字段值的范围可从4KB到4GB范围。在这种情况下,段界限字段的值可在4KB的基础上,每次增值4KB。
(4)分类S字段 段描述符中的第5字节的D4位“S”字段是用来区分是系统段描述符还是非系统段描述符。当S=0时,是系统段描述符。当S=1时,是非系统段描述符。 (5)段存在位P字段 P字段表示该段是否在内存中。段描述符的第5字节的D7位是P字段。当P=1时,表示该段在内存中。当P=0时,表示该段不在内存中。 (6)系统可用位AVL字段 表示系统软件是否可用本段。段描述符的第6字节的D4位是AVL字段。当AVL=1时,表示系统软件可用本段。当AVL=0时,表示系统软件不能用本段。 (7)特权级DPL字段 这个字段用来定义段的特权级。段描述符的第5字节的D6、D5位是DPL字段。DPL字段占有2位,故有4个特权级:00、01、10、11,称作0级、1级、2级、3级。0级的特权最高,1级次之,3级的特权最低。借助于保护机构,用这个字段定义的特权级去控制对这个段的访问。其访问原则是高特权级的程序段可以访问低特权级程序的数据段,反之则不行。
(8)类型TYPE字段 段描述符的第5字节的低4位是类型TYPE字段。类型TYPE字段在不同的段描述符中有不同的格式。 1)数据段或堆栈段描述符中的类型TYPE字段。数据段或堆栈段描述符中的类型TYPE字段的格式如表1.2.2所示。 ① E可执行位。当E=0时,是数据段或堆栈段。 ② ED扩展方向位。 当ED=0时,向上扩展(地址增加方向),通常用于数据段。它指明段的地址范围是从基地址向高位地址方向扩展,可以一直扩展到该数据段的上界,上界的界限值是最大值。在数据段内,段界限字段规定了该数据段的上界,使用时,段的偏移量值必须小于等于界限值。 当ED=1时,向下扩展(地址减小方向),通常用于堆栈段。它指明从段的最大偏移量处向低位地址方向扩展,可以一直扩展到该堆栈段的下界,下界的界限值是最小值。在向下扩展的堆栈段内,段界限字段规定了该堆栈段的下界,使用时,偏移量的值必须大于界限。在80X86系统中,堆栈向小地址方向生成,堆栈底部的地址最大,随着压入堆栈的数据增多,栈顶的地址越来越小,这就是“向下扩展”的含义,为此,要规定一个界限,使栈顶的偏移量不能小于这个值。
③ W可写位。当W=0时,不允许写入。当W=1时,允许写入。 ④ A访问位。当A=0时,该段尚未被访问。当A=1时,该段已被访问。 2)代码段描述符中的类型TYPE字段 代码段描述符中的类型TYPE字段的格式如表1.2.3所示。 ① E可执行位。当E=1时,是代码段。 ② C一致性位。所谓一致性检查,就是采用特权级进行控制。当C=0时,表示非一致性代码段,此时忽视段描述符的特权值。当C=1时,表示一致性代码段,需要进行特权级检查。 ③ R可读位。当R=0时,不允许读。当R=1时,允许读。当然,对程序段来说,通常都是“可执行的”。R位取0可防止用户程序对存储器里的“目标程序代码”做手脚。R位为0的描述符只能加载到CS的描述符寄存器,而R位为1的描述符可加载到CS、DS、ES、FS及GS的描述符寄存器,此时,可以读取段内的数据(程序代码)。 ④ A访问位。当A=0时,该段尚未被访问;当A=1时,该段已被访问。
(9)D位/B位字段 段描述符的第6字节的D6位是D位/B位字段。这个字段在代码段描述符中叫做D位字段,而在数据段和堆栈段描述符中叫做B位字段。该字段可分为下述三种情况。 1)在代码段描述符中,用来指示代码段中缺省的操作数的长度和有效地址长度。当D=1时,说明采用的是32位操作数和32位有效地址的寻址方式。D=0时,则说明采用的是16位操作数和16位有效地址的寻址方式。 2)在堆栈段描述符中,用来指示堆栈指针寄存器的大小。当B=1时,使用的是32位的堆栈指针寄存器ESP。当B=0时,使用的是16位的堆栈指针寄存器SP。堆栈段的上界是一个各位均为1的地址。当B=1时,上界地址值为0FFFFFFFFH。当B=0时,上界地址值为0FFFFH。 3)在数据段描述符中,用来指示数据段中操作数的长度。当B=1时,使用的是32位的操作数。当B=0时,使用的是16位的操作数。 (10)兼容位字段 段描述符的第6字节的D5位必须是0,以便与将来的处理器兼容。
程序段描述符的格式
2.系统段描述符
系统段描述符中的类型TYPE字段的格式
3.门描述符 门描述符用来控制访问的目标代码段的入口点。所谓门是一种关卡,用来控制从一段程序到另一段程序或从一个任务到另一个任务的转移。在转移过程中自动进行保护检查,并控制转移到目的程序的入口。 门描述符包括调用门、任务门、中断门和陷阱门。这些门为控制转移提供了一个间接的办法,这一办法允许处理器自动地完成保护检查。它也允许系统设计者控制操作系统的入口点。调用门用于改变特权级别,任务门用于任务切换,中断门和陷阱门用于确定中断服务程序。 门描述符的第0、1、6、7字节是一个32位的偏移地址,第4字节是一个字计数,第2、3字节是一个段选择符,第5字节是门描述符的属性。 32位的偏移地址指向中断服务程序或其他程序的入口。
门描述符的格式
1.2.3 全局描述符表及寄存器 全局描述符表由段描述符组成。全局描述符表和段描述符都由系统程序产生。描述符表就是描述符的一个阵列,是存放在主存中的一种数据结构。 在Pentium微处理机中,全局描述符表寄存器GDTR指定了全局描述符表GDT在内存中的起始地址。全局描述符表是Pentium微处理机进入保护方式后存储器管理系统中的一个重要组成部分。 GDTR是Pentium微处理机中的48位寄存器。该寄存器的低2个字节标识为16位界限,它规定了GDT按字节进行计算的地址范围的大小。GDTR的高4个字节标为32位基地址,指示GDT在存储器中开始的物理地址。用装全局描述符表寄存器指令LGDT和存全局描述符表寄存器指令SGDT,可以对全局描述符表寄存器GDTR的内容进行装入和保存的操作。
由GDTR确定GDT存储位置和界限
1.2.4 局部描述符表及寄存器 局部描述符表寄存器LDTR也是Pentium微处理机存储器管理部件的一部分,每个任务除了可访问全局描述符表外还可访问它自己的描述符表,这个描述符表称为局部描述符表LDT,它由LDTR定义某个任务用到的局部存储器地址空间。 Pentium微处理机中的局部描述符表寄存器LDTR由16位选择符、32位基址、20位界限和12位属性组成。基址、界限和属性不可访问,属于程序不可见的部分,程序只能对16位的段选择符进行访问。 局部描述符表寄存器LDTR中的段选择符是一个指向全局描述符表GDT中LDT描述符的选择符,它还不能直接确定局部描述符表LDT的位置。如果LDTR中装入了段选择符,Pentium微处理机自动地将相应的LDT描述符从全局描述符表GDT中读出来,并装入LDTR中程序不可见部分。也就是说,全局描述符表GDT中的LDT描述符才确定了局部描述符表。
由LDTR确定LDT存储位置和界限
1.2.5 中断描述符表及寄存器 同全局描述符表寄存器一样,Pentium微处理机通过中断描述符表寄存器IDTR在内存中定义了一个中断描述符表IDT,中断描述符表是Pentium微处理机进入保护方式后存储器管理系统中的又一个重要组成部分。 同GDTR一样,IDTR是Pentium微处理机中的48位寄存器。该寄存器的低2个字节标识为16位界限,它规定了IDT按字节计算的大小,IDT最大可达64KB(但是Pentium微处理机只能够支持256个中断和异常,最多占用2KB)。IDTR的高4个字节标为32位基地址,指示IDT在存储器中开始的物理地址。 中断描述符表IDT中存放的描述符类型均是门描述符。门提供了一种将程序控制转移到中断服务程序入口的手段。每个门8个字节,包含服务程序的属性和起始地址。
由IDTR确定IDT存储位置和界限
1.2.6 任务状态段及寄存器 在多任务系统中,多个任务可以并行执行。当然,这种并行是宏观上的并行。为了实现多个任务同时工作,就要求每个任务都有自己的虚拟存储空间,都有自己的一个局部描述符表LDT,存放该任务私有的描述符。 任务间的转移必然会引起任务切换。任务切换操作要保存现有任务的机器状态(指处理器的工作环境,比如各个寄存器的状态),装入新任务的机器状态。这时的机器状态就是通常操作系统的任务控制块,对于Pentium微处理机,称之为任务状态段TSS(Task State Segment)。 任务状态段TSS如同每个任务有自己的一个LDT一样,各个任务都有自己的TSS。
TSS的格式
由TR确定TSS存储位置和界限
任务寄存器TR中的32位基址值标识任务状态段在内存中的起始物理地址,20位界限值定义段的大小。 虽然任务状态段TSS描述符和其他任何描述符一样,包含了任务状态段TSS的位置、大小和优先级别。但它们之间的区别在于TSS描述符所描述的TSS段不包含数据和代码,它包含了任务状态和任务间的关联信息,以使任务可以被嵌套(第一个任务可以调用第二个任务,而第二个任务又可以调用第三个任务,依此类推)。 TSS描述符由任务寄存器TR寻址。TR的内容由装任务寄存器指令LTR和存任务寄存器指令STR进行装入和保存。TR的内容也可由保护模式下运行程序中的远转移JMP或远调用CALL指令来改变。 LTR指令通常用于系统初始化过程中装入第一个任务的选择符。在初始化之后,远调用CALL或远转移JMP指令通常对任务进行切换。
1.2.7 段选择符及寄存器 在实模式下,段寄存器的16位值是基地址。而在保护模式下,为了加快对存储器的访问,每个段寄存器都有一个程序员不可见的段描述符高速缓冲寄存器与之对应。这样,每一个段寄存器就由两部分组成,一部分为16位的可见部分,另一部分为64位的不可见部分(或称段描述符高速缓冲寄存器)。 对段寄存器的可见部分来说,可用传送指令MOV装入,而不可见部分则只能由处理机装入,用户是不能也不可能进行干预和操作的。段寄存器的可见部分装入的是16位的段选择符。段选择符用于识别(选择)在全局描述符表GDT或局部描述符表LDT内被逐一登记的段描述符。在8字节段描述符中包含有定义段所用的32位的基地址、20位的段界限、12位的属性(其中包括段类型、访问控制以及其他一些信息)。
1.段选择符 选择符分为3个字段:13位索引字段INDEX,1位描述符表选择字段TI和2位的请求特权级字段RPL。 段选择符中的D2位(TI)是描述符表选择字段,这个字段用来说明使用的是全局描述符表GDT,还是局部描述符表LDT。当TI=0时,选择的是全局描述符表GDT。当TI=1时,选择的是局部描述符表LDT。 (2)索引字段INDEX 段选择符中的D15~D3位是索引字段,共13位,这就意味着,利用索引字段可以从拥有213=8192个段描述符的描述符表中选出任何一个段描述符来。索引值乘以8就是相对于GDT或LDT首址的偏移量,处理机用这个偏移量再加上描述符表的基地址(来自全局描述符表寄存器GDTR,或者局部描述符表寄存器LDTR)就是段描述符在描述符表中的地址。 (3)请求特权级字段RPL 段选择符中的D1、D0位是请求特权级字段。RPL字段占有2位,故有4个特权级,00、01、10、11,称作0级、1级、2级、3级。0级的特权最高,1级次之,3级的特权最低。
2.段选择符装入段寄存器的操作 段选择符装入段寄存器的操作是通过应用程序中的指令完成的。装段寄存器的指令有2类,即直接的装段寄存器指令和隐含的装段寄存器指令。 (1)直接的装段寄存器指令:可使用传送指令MOV、弹出堆栈指令POP、加载段寄存器指令LDS、LSS、LGS、LFS。这些指令都是显式地访问段寄存器。 (2)隐含的装段寄存器指令:可使用调用一个过程指令CALL、远转移指令JMP。这种指令更改代码段寄存器CS的内容。 由于绝大多数指令都要涉及段,所以段选择符总是被装在段寄存器内备用。
1.3 保护模式下的访问操作与保护机制 1.3.1 保护机制的分类 1.任务间存储空间的保护 1.3 保护模式下的访问操作与保护机制 1.3.1 保护机制的分类 1.任务间存储空间的保护 任务间的保护是通过每一个任务所专用的LDT描述符实现的。根据LDT描述符,每个任务都有它特定的虚拟空间,因而避免各任务之间的干扰,起到隔离、保护的作用。 2.段属性和界限的保护 当段寄存器进行加载时,需要进行段存在性检查(属性字节的P位)以及段限检查。 在段描述符中给出了20位的段界限值,每当产生一个逻辑地址时,都要比较偏移量和段限值。一旦偏移地址大于段限值,CPU就终止执行命令,并发出越限异常。由此限制每个程序段只在自己的程序、数据段内运行,不相互干扰。 最后,还要对该段的读写权限进行检查。 3.特权级与特权级保护 特权级与特权保护是为了支持多用户多任务操作系统,使系统程序和用户的任务程序之间、各任务程序之间互不干扰而采取的保护措施。Pentium微处理机系统提供了一个4级特权管理系统,也就是4级保护系统,如图1.3.1所示。这样可为不同程序规定一个权限,控制特权指令和I/O指令的使用,控制对段和段描述符的访问,从而有效地防止不同程序执行时的相互干扰或非法访问、非法改写GDT和LDT。
3种形式的特权管理 在实施管理中使用了3种形式的特权管理:当前任务特权CPL、选择符特权RPL和描述符特权DPL。并且规定:特权级为P的段中存储的数据,只能由特权级高于或等于P的段中运行的程序使用;特权级为P的代码段/过程,只能由在低于或等于P的特权级下执行的任务调用。 (1)当前特权级CPL CPL是当前正在执行的代码段所具有的访问特权级,存放在CS段寄存器的最低两位。 每一项任务都是在其代码段描述符所确定的特权级中运行。当前特权级就是任务执行时所处的特权级。例如,一个正在运行的任务的CPL,就是其描述符中访问权限字节的DPL。当前特权级的值一般就是代码段描述符中的DPL。任务执行时当前特权级一般不能改变,如果必须改变,只能通过代码段的门描述符的控制转换才能实现。一般高一级的任务可以访问同级或低级GDT和LDT中定义的数据,显然在第3特权级执行的任务对数据的访问受到的限制最大。 (2)描述符特权级DPL DPL是段被访问的特权级,保存在该段的段描述符的特权级DPL位。 (3)请求特权级RPL RPL是新装入段寄存器的段选择符的特权级,存放在段选择符的最低两位。
1.3.2 数据段访问及其特权级检查
数据段访问的特权级检查
1.3.3 任务内的段间转移及其特权级检查 程序控制转移有2种类型:NEAR类型的段内转移和FAR类型的段间转移。 1.3.3 任务内的段间转移及其特权级检查 程序控制转移有2种类型:NEAR类型的段内转移和FAR类型的段间转移。 段内转移发生在同一个代码段内,段的基址不变,所以不需要重新访问段描述符。转移发生时,只需要进行段限保护检查,即比较偏移量和段限值。 段间转移发生在不同的代码段之间,不同的代码段,其基址也不同,因此,转移发生时,需要重新访问目标段的段描述符,以便确定目标段的基址。在保护机制方面,除了要进行段限保护检查外,还要进行特权级检查。 段间转移有2种方法:段间直接控制转移、段间间接控制转移。下面将对这2种方法的实现过程和特权级检查保护进行说明。
段间转移方法小结 (1)任务内的控制转移可分为同一特权级间的控制转移和不同特权级间的控制转移。 (2)用JMP指令通过代码段描述符,可实现同一特权级间的直接控制转移。 (3)用CALL指令通过代码段描述符,可实现同一特权级间的直接控制转移,通过调用门,可实现同一特权级间或更高特权级的间接控制转移。 (4)用INT指令(包括异常中断和外部中断)通过中断门/陷阱门,可实现同一特权级间或更高特权级的间接控制转移。 (5)将程序控制转移给同一代码段中的另一条指令,只须使用转移或调用指令即可,此时,只需要检查段长界限,以确保转移或调用的目标不会超过当前代码段的边界。
任务内段间控制转移的描述符访问规则
段间直接转移过程及目标线性地址的生成
通过代码段的段描述符实现段间直接转移的特权检查
用调用门实现段间间接转移的过程
1.3.4 任务切换及其特权级检查 所谓任务切换,是指从执行某一个任务转换到执行另外一个任务的过程。任务切换是多任务/多用户系统的一个非常重要的属性。Pentium微处理器支持多任务,允许多个任务之间通过硬件进行快速切换。任务切换的过程是:保存机器的整个状态(比如所有的寄存器、地址空间、到原来任务的链接等),装入新的执行状态,进行保护检查,开始新任务的执行,执行完毕后回到原来的任务继续执行。 1.任务的设定 在执行某任务以前,必须在存储器中定义GDT、IDT、LDT和TSS,在GDT中登记(写入)所需要的段描述符、门描述符、LDT描述符、TSS描述符,在IDT中登记(写入)所需要的中断门、陷阱门、任务门等,并且还必须对GDTR、IDTR、LDTR、TR设置适当的数值。TR给出TSS段的基址。 2.TSS描述符和任务门 在任务切换中,通常用到任务状态段TSS和任务门。TSS描述符和任务门在前面已有说明。 每一个任务必须有一个任务状态段TSS与其关联。TSS描述符属于系统描述符类(属性字节中S=0),该描述符包含了TSS在内存中的基址和界限。TSS描述符位于GDT中,所以指向TSS描述符的段选择符的TI位应该为0。
用调用门实现段间间接转移的特权级检查
3.任务切换的方法 在进行任务切换时,要把新任务的TSS描述符的选择符传送到TR的选择符字段,对TR的选择符字段有两种修改方法: (1)直接任务切换:直接访问新任务的TSS描述符,从而得到新任务的TSS。在直接任务切换中,段间JMP/CALL指令的操作数的段选择符就是新任务的TSS描述符的选择符,它被直接加载到TR的选择符字段,对于执行IRET指令的情况(必须NT=1),则是把曾经压入到当前执行任务的TSS中的返回链(返回链就是前一个任务的TSS描述符的段选择符,即原来TR中的16位可见部分内容),作为TR选择符字段的修改值。 (2)间接任务切换:新任务的TSS描述符的选择符由任务门加载。通过任务门间接访问新任务的TSS描述符,从而得到新任务的TSS。在间接任务切换中,段间JMP/CALL指令的操作数的段选择符是任务门的选择符,而任务门的内容包含新任务的TSS描述符的选择符,所以,新任务的TSS描述符的选择符将由任务门间接加载到TR的选择符字段,
3.任务切换的方法 这样,对任务的切换,可以采用以下方法: (1)段间JMP/CALL指令:进行直接任务切换或间接任务切换。 (2)INT指令(包括异常中断和外部中断):只能进行间接任务切换。访问IDT中的任务门,新任务的TSS描述符的选择符由任务门加载。当中断/异常发生时,如果IDT的目标项是中断门或陷阱门,则执行中断处理程序。如果目标项是任务门,则进行任务切换。 (3)IRET指令(当NT=1时):只能进行直接任务切换。EFLAGS寄存器的NT位必须为1,表明是处于任务嵌套。NT为0时,执行IRET指令与正常中断处理程序最后执行IRET指令的结果相同,即只完成正常的中断返回,不进行任务切换。
任务间的切换过程示意图
1.4 向保护模式的转换 下面的步骤将完成从实地址方式到保护模式的切换: 1.4 向保护模式的转换 下面的步骤将完成从实地址方式到保护模式的切换: (1)初始化中断描述符表IDT,使其包含至少前32种中断类型有效的中断门描述符。 (2)初始化全局描述符表GDT,使其第0项为一个空描述符,并且使其至少包含一个数据段描述符、一个代码段描述符、一个堆栈段描述符。 (3)进入保护模式的实际方法是通过指令MOV CR0,R/M 使CR0寄存器中的PE位置1。这就使Pentium置为保护模式。 (4)进入保护模式后,执行一条段内近JMP指令清除内部指令队列并把TSS描述符基址装入到TR中。 (5)将初始数据段选择符的值装入到所有的数据段寄存器中。 (6)现在Pentium已运行在保护模式下,正在使用GDT和IDT中定义的段描述符。
另一种适合多任务操作系统进入保护模式的方法是为装载所有的寄存器而建立任务切换。对于多任务操作系统利用任务切换来使Pentium进入到保护模式所需的步骤如下: (1)初始化中断描述符表IDT,以便它用IDT中的至少32个描述符提供有效的中断描述符。 (2)初始化全局描述符表GDT,以便使其最少有两个任务状态段TSS描述符和初始任务所需要的原始代码段及数据段描述符。 (3)初始化任务寄存器TR,使它指向一个TSS,当初始任务发生切换并访问新的TSS时,当前寄存器值将保存在这个原始的TSS中。 (4)进入保护模式后,执行一条段内近JMP指令清除内部指令队列,切换到保护模式下。将当前的TSS选择符装入到TR寄存器中。 (5)用一条远转移指令装载TR寄存器,以便访问新的TSS并保存当前状态。 (6)现在Pentium已运行在保护模式下。
1.5 分页存储管理 分页是虚拟存储器多任务操作系统另一种存储器管理方法。段的长度是可变的,而页的长度是固定的,比如每页4KB。 1.5 分页存储管理 分页是虚拟存储器多任务操作系统另一种存储器管理方法。段的长度是可变的,而页的长度是固定的,比如每页4KB。 分页方法将程序分成若干个大小相同的页,各页与程序的逻辑结构没有直接的关系。分页存储器的这种固定大小页有一个缺点,就是存储管理程序每次分配最少是一个页(即使它们并不全用)。一页中未用的存储器区域称为碎片,碎片导致存储器使用效率降低,但是分页大大简化了存储管理程序的实现。 Pentium微处理器采用二级页表方法对页面进行管理,第1级页表称作页目录,页目录中的页目录项指明第2级页表中各页表的基址。
1.5.1 页目录与页表 1.页目录基地址寄存器 页目录存储在内存中,并通过页目录基地址寄存器CR3来访问。控制寄存器CR3保存着页目录的基地址,该基地址起始于任意4KB的边界。指令MOV CR3,reg用来对CR3寄存器进行初始化。CR2是页故障线性地址寄存器,它保存着检测到的最后引起故障的32位线性地址。 2.页目录 页目录由页目录项组成,页目录项包含下一级页表的基址和有关页表的信息。Pentium微处理器中,页目录最多包含1024个页目录项,每个页目录项为4个字节,所以,页目录自身占用一个4KB的页面(存储页)。 32位线性地址的最高10位(A31-A22)是页目录的索引,用于在页目录中查找不同的页目录项,而页目录项中保存着下一级所对应的页表的基地址。 3.页表 页表由页表项组成,页表项包含页面(存储页)的基址和有关页面的信息。Pentium微处理器中,页表最多包含1024个页表项,每个页表项为4个字节,所以,页表自身也占用一个4KB的页面(存储页)。 32位线性地址的10位(A21-A12)是页表的索引,用于在页表中查找不同的页表项,而页表项中保存着所对应的页面(存储页)的基地址,即页面(存储页)的起始地址。
页目录项格式
页表项格式
1.5.2 分页转换机制 1.分页转换的工作过程 在分页转换机制中,当要访问一个操作单元时,32位线性地址转换为32位物理地址是通过两级查表来实现的。图1.5.3展示了Pentium微处理器的分页机制。这里,程序中产生的线性地址00C02098H经过分页机构被转换成物理地址00160098H。 分页机制的工作过程如下: (1)4KB长的页目录存储在由CR3寄存器所指定的物理地址。此地址常称为根地址。假设要寻址单元的线性地址为:0000000011 0000000010 000010011000B (2)用线性地址中的最高10位(A31-A22)页目录索引,即0000000011B(3号页目录项),乘以4(每个页目录项占4个字节)得到页目录中页目录项的偏移量00CH,从1024个页目录项中确定所访问的页目录项3。图中此页目录项包含着所指向的页表3的起始地址01010000H。 (3)用线性地址中的A21-A12这10位页表索引,即0000000010B(2号页表项),乘以4(每个页表项占4个字节)得到页表3中页表项的偏移量008H,从1024个页表项中确定所访问的页表项2,图中此页表项包含了所要访问的物理页的起始地址00160000H。 (4)以物理页的起始地址00160000H为基址,再加上线性地址的最低12位(A11-A0)页内偏移量,即000010011000B,就确定了所寻址的物理单元00160098H。
分页转换机制示意图
1.5.3 转换旁视缓冲存储器TLB 页目录和页表都存放在主存中,当进行地址变换时,处理器要对主存访问两次,这样将极大地降低微机的性能。为了提高由线性地址向物理地址的转换速度,Pentium微处理器设有一个高速转换旁视缓冲存储器TLB。它由4组高速缓冲寄存器组成,每组8个寄存器,每个寄存器可存放一个线性地址(高20位,即A31-A12)和与之对应的页表项,如图1.5.5所示。TLB按照最近频繁使用的原则可存放32项。当32项存满后而又有新的页表项产生时,按照最近最少使用的原则置换其中最少使用的项。 TLB中的内容是页表中部分内容的副本。TLB技术采用高速硬件进行地址变换,因而地址变换非常快,所以又称TLB为快表,相对而言,存于主存中的页表称作慢表。
4MB分页转换机制示意图
通过TLB进行地址转换的示意图
1.6 段页式存储管理的寻址过程 在段页式存储管理中,要使用到段式存储管理部件和页式存储管理部件。在段页式存储管理的寻址过程中,首先将虚地址通过段式存储管理部件转换为线性地址,然后将线性地址通过页式存储管理部件转换为物理地址。 在保护模式下,存储器的管理具有分段管理模式、分页管理模式、段页式管理模式等3种,这3种模式的特点如下: (1)分段不分页。此时,一个任务拥有的最大空间是64T,由分段管理部件将二维虚地址(段选择符,偏移量)转换成一维的32位线性地址,这个线性地址就是物理地址。不分页的好处是:不用访问页目录和页表,地址转换速度快。缺点是:大容量的段调入调出,比较耗时,不够灵活。 (2)分段分页。由分段管理部件和分页管理部件共同管理。 (3)不分段分页。此时分段管理部件不工作,分页管理部件工作。程序不提供段选择符,只用32位寄存器地址(作为线性地址)。
段页式存储管理的寻址过程
1.7 虚拟8086模式 虚拟8086模式是一个特殊运行模式。这种特殊运行模式的设计,使得多个8086实模式的应用软件可以同时运行。 1.7 虚拟8086模式 虚拟8086模式是一个特殊运行模式。这种特殊运行模式的设计,使得多个8086实模式的应用软件可以同时运行。 Pentium保护模式和虚拟8086模式之间的主要区别在于微处理器对段寄存器的解释方式不同。在虚拟8086模式下,段寄存器与在实模式下的使用方式相同,能寻址从00000H到0FFFFFH的1MB存储空间。程序访问的是1MB以内的存储器,而微处理器可以访问存储系统中4GB范围内的任意物理存储单元。 启动虚拟8086模式有两种方式: (1)通过任务切换给标志寄存器赋值。 (2)通过中断返回。在这种情况下标志寄存器的内容从堆栈中重新装入。
第1章 结 束