1、8.1 概述概述8.2 80486 微处理器的逻辑结构微处理器的逻辑结构8.3 虚拟存储器的实现机制虚拟存储器的实现机制8.4 多任务系统的实现机制多任务系统的实现机制8.5 保护功能保护功能8.6 8086 微处理器家族其它成员指令介绍微处理器家族其它成员指令介绍8.7 存储器管理技术存储器管理技术第第 8 章章 高高 档微机的某些新技术档微机的某些新技术返回主目录第第 8 章章 高档微机的某些新技术高档微机的某些新技术 8.1 概述概述 目前世界上有许多种型号的微型计算机系统在运行。其中大多数微型计算机系统的微处理器属于Intel公司的 8086 微处理器家族。各种微机系统的兼容性,即可以
2、运行同一目标代码的可执行程序,且得到相同的结果,都是建立在 8086 微处理器家族成员具有相同的基本体系结构基础之上的。8086 家族成员相同的基本体系结构部分就是由 8086 微处理器和 8087 数学协处理器组成的体系结构。这就是说,Intel 8086 家族的其它成员在体系结构上可以有许多新发展,但必须包括 8086 和 8087 微处理器的基本体系结构的功能,这就是兼容性的基础。由微处理器 8086 和 8087 组成的最早微机系统是IBM PC系列机中的PC/XT机。本书前面各章的讨论主要是以PC/XT为背景的,从中可以学习到计算机系统,特别是微型计算机系统的基本组成和工作原理。但是
3、,从Intel公司的8086、8087 微处理器和IBM PC/XT微机系统问世以来近 20年时间里,与计算机相关的各个技术领域,集成电路技术、计算机体系结构、系统软件技术等,都经历了飞速的发展。就微处理器而言,Intel公司的产品已形成了 8086 微处理器家族。家族成员,除 8086 和 8087 之外,包括 80186、80286、80287、80386、80387、80486、奔腾Pentium(80586)和Pentium、等。8086 微处理器是以Intel公司的 8 位微处理器 8080 的体系结构为基础开发出来的真正 16 位微处理器。如前已经讨论的那样,8086的内部寄存器均
4、为 16 位宽,其中有些寄存器还可以当作两个8位寄存器独立访问。16 位的寄存器结构很容易构成访问216=65 536个地址空间的存储器方案。但这样容量的存储空间太小了,是就选择了能扩大存储空间容量又以 16 位寻址为基础的寻址机制。8086(包括 8088)的寻址空间为 220 B=1 MB地址。为了实现由 20 位决定的 1 MB的地址空间能被由 16 位(因为寄存器为 16 位)的地址码来访问,整个地址空间划分成段,每段216=64 KB地址。CPU可以在任何时候直接访问 4个这样的段,这 4 个段的地址分别由 4 个专用的段寄存器的内容给出。段寄存器是这样指明在 1 MB地址空间中的地
5、址的:段寄存器内容乘以16(即左移 4 位)就是这个段的开始地址。这样,一个段内的一个字节单元的地址由这个段的开始地址和相对于开始地址的16 位偏移量两部分给出。在不修改段寄存器内容的情况下,CPU可以直接访问 4 个段的地址范围,每段为 64 KB;为了访问 1 MB的全部地址空间,段寄存器的内容必须加以改变。这样的分段的编址和寻址体系结构是 8086 微处理器家族的存储器管理的核心内容。由于 8086 芯片开发时,芯片封装对引脚数量有所限制,最多只能有 40 个引脚,所以数据总线和地址总线分时复用共用的芯片引脚。这样虽然节省了芯片的引脚,但使逻辑变得复杂,速度也降低了。8086 微处理器开
6、始开发时就准备与辅助处理器协同工作,以达到在某些特殊的应用时有更好的性能。最早就考虑到同时开发专用于数学计算的协处理器 8087,把它加到 8086 的微机系统中,使浮点运算得到了专用硬件的支持。当时把整数运算和浮点运算分配在两个芯片里完成,这是由于早期集成电路技术和经济原因造成的,直到家族成员 80486 问世才结束了两个芯片分立的状态,集成到了一个芯片里。其它家族成员组成的微机系统中,也有高效率高精度的浮点运算能力,这是依靠每个系统机的主板上都有一个插座可以插入相应协处理器而实现的。Intel公司的微处理器家族的最早成员是 8086 和 8088。随着在一个芯片内集成更多电路并具有更多的功
7、能成为可能,Intel 8086 体系结构沿着两个方向发展:一个方向发展的结果是开发出 80186(和80188);另一方向发展的结果是开发出 80286 和后来的 80386、80486 等等。开发 80186、80188 的指导思想是在一个微处理器芯片里同时集成更多的把处理器组合成一个计算机系统所必需的辅助电路,成为一个单片计算机,并且增加某些指令和改善指令的功能。80286 及以后的微处理器是沿着另一个指导思想开发出来的,其着眼点是扩大CPU(中央处理单元)本身的功能,从而使体系结构发生了很大变化,使整机的功能大大增强。开发 80286 时就提出了几个设计目标,解决 8086 存在的问题
8、。首先,1 MB的存储器地址空间在很多应用中显得太小了(当然DOS的早期版本也是限制存储器地址空间的因素)应该扩大。其次,8086 的硬件不适合在系统中同时运行多道程序、执行多个任务。但是,由于技术的发展,微处理器的硬件能像小型计算机、甚至大型计算机那样,用于多任务也是可能的。所以要求新开发的 8086 后继者能适应多任务的要求。第三,由于已经存在相当数量的软件在 8086 系统机上运行,为了不遗弃这些软件资源,要求开发的后继者与 8086 兼容。8086 的分段寻址结构不能直接扩大存储器地址空间,也不适应多任务的要求。为了达到上述设计目标,80286 被设计成能在两种不同的工作模式下工作的混
9、合型微处理器。这两种模式是:实地址模式和保护的虚地址模式,简称保护模式。80286 工作在实模式时,对于程序员来说,只相当于工作速度快的 8086,寄存器结构和寻址方式与 8086 相同。不同的是 20 位地址总线和 16 位数据总线不再分时复用芯片的引脚,并且增加了某些新指令。但原来在 8086 上运行的程序都可在 80286 的系统上运行。速度的提高有几个因素:取指令特别是指令译码操作与前面指令执行的操作有相当程度的并行是因素之一;许多指令的执行达到最佳是另一因素;当然,地址总线与数据总线在芯片引脚上分开,使得地址码和数据码可以同时出现,也对提高速度有益。80286 的另一工作模式,即保护
10、模式提供了许多新的功能。与实模式相比,最明显的差别是存储器空间扩大到 16 MB,对应于 24 位地址总线。从CPU内部来看,这么大的存储器空间显然仍由段寄存器来控制,但段寄存器的作用已经改变。段寄存器的内容不再是段开始地址的指针,而是用作由“虚拟段”组成的表的指针。80286 CPU内还包括很多硬件逻辑支持保护功能和多任务功能。虚拟的编址寻址机制、支持保护功能机制和多任务功能机制,是 80286 与 8086 的主要差别,也是其先进之处。但是,8086 的分段寻址体系结构中,段内用 16 位偏移量编址,在 80286 中保持不变。与 80286 配合使用的数学协处理器是 80287,它基本与
11、 8087 相同,但适应 80286 的两种工作模式。由于 80287 与存储器之间交换数据时需要 80286 来控制,使得 80286 效率稍有降低。Intel公司 8086 微处理器家族成员中,第一个属于真正的 32 位微处理器,是继 80286 之后开发的 80386。微处理器 32 位意味着数据总线和内部寄存器都是 32 位结构。从原理上,8086(和80286)中原始的分段编址方案,以 16 位码对段内偏移编址,在 80386中已经没有必要。因 80386 中的 32 位寄存器自然能形成 32 位偏移地址,而 32 位地址直接编址的空间为 232 B=4 GB。但是,与 8086 家
12、族早期成员 8086 和 80286的兼密性是必须保证的。按照这种指导思想开发出来的 80386 有 3 种工作模式:实模式。复位后自动进入这一模式,其工作模式与 8086 相同,地址总线仍为 20 位,数据总线为 32 位不与地址总线分时复用,内部寄存器主要作为 16 位使用,也可以按 32 位使用。保护模式又分两种:一种为 286 模式,即与 80286 的保护模式相同,尤其指操作数和段内偏移地址保持为 16 位;另一种是 386 的保护模式,操作数和段内的偏移地址都是 32 位,地址总线也是 32 位,物理地址空间为 232 B=4 GB。对于 80386,在保护模式下的分段寻址体系,与
13、操作系统相配合可以组成虚拟存储器系统,而且虚拟地址(即逻辑地址编程使用的地址)空间远远大于物理空间,一个任务的最大虚拟空间可达246=64 TB(1TB=1024 GB)。与 80286 相比,在实现虚拟存储器系统方面,80386的另一进步是包括支持分页功能的硬件。分页功能使组成的虚拟存储器系统更完善。与 80386 相配合的数学协处理器为 80387。从程序设计的角度看,它与 8087、80287 相似,但速度快得多且增加一些新指令。80486 微处理器可以看作是速度更快的 80386。这就是说,从逻辑功能上看它的工作模式与 80386 相同,速度更快的原因之一是数学协处理器已经集成于 80
14、486 芯片内部,所以没有“80487”。速度更快的其它重要原因是CPU逻辑设计时采用了许多RISC(Reduced Instruction Set Computer)技术,其中包括流水线技术和CPU片内集成高速缓冲存储器(Cache,80486内有8K Cache)。8086 微处理器家族中,80486 的后继成员为 80586。由于部分厂商担心 80X86 的品牌会为Intel公司一家所独有,而逼得Intel公司将 80586 改名为Pentium,译为“奔腾”。Pentium与 8086 家族的其它成员完全兼容,这是Intel公司推出新微处理器的首要特点。与 80386、80486 相比
15、较,除了64 位数据线宽度之外,Pentium的主要特点是速度快。这是由于采用了以下新技术:(1)采用全新设计的增强型浮点运算器,浮点运算速度比 80486DX要快 3 至 5 倍。(2)利用超标量流水线(Super Scaler Pipeline)结构理论,组成两条流水线:U指令流水线和V指令流水线。在最佳状态下,Pentium可在一个时钟周期内执行两条指令。而 80486 只有一条指令流水线,最佳状态只能一个时钟周期执行完一条指令。(3)采用双重分离式高速缓冲存储器(Dual On Board Caches),把指令高速缓存和数据高速缓存分离,各自拥有 8 KB的高速缓存,使其同时工作,减
16、少等待时间和数据搬移的次数。(4)采用了转移目的缓冲器(Branch Target Buffer)预测转移指令。在指令流水线技术中,重要的问题是如何处理转移指令。假设在 80486 的指令流水线中,如果一条指令已经执行到第一阶段(解码阶段),发现这是一条转移指令,但此时相邻的下一条指令已进入取指令阶段,那么这条指令必须取消而更改到转移的目的指令。这样的过程会使整个流水线混乱而停顿。Pentium中采用转移目的缓冲器,在转移指令进入流水线之前,预先安排指令的顺序,不致使流水线的运行混乱或停顿。在Pentium之后,Intel公司又推出了高能奔腾处理器Pentium。它的数据总线和寄存器宽度与Pe
17、ntium一样,分别是 64 位和 32 位。地址总线宽度又增宽了 4 位,成为 36 位,物理地址空间也增大了 16 倍为 64 GB。它还采用了一些新技术,这里不介绍了。以上我们介绍了Intel公司推出的 8086 微处理器家族以及后续各成员的基本情况。本书作为微型计算机原理与应用课的教材,没必要也不应该对 80286 及以后的微处理器及系统逐个详细讨论。我们把这些微处理器及其组成的系统的几个先进的方面,着眼于其逻辑功能,进行综合后在本章讨论。这些先进方面是:以 80486 为代表的逻辑结构、虚拟存储器的实现机制、多任务系统的实现机制和保护功能的实现机制。在介绍了一些新指令的功能之后,我们
18、还介绍了内存管理技术,目的在于理解系统设置时经常遇到的关于扩充内存和扩展内存的概念。8.2 80486 微处理器的逻辑结构微处理器的逻辑结构 微处理器的逻辑结构是微处理器功能和性能的基础。在计算机系统中,硬件和软件具有互相支持关系。有些功能既可以通过软件来完成,又可以通过硬件来完成。这就存在一个问题,在系统总的功能目标下如何合理地把功能分配给硬件和软件,使它们的互相支持达到最佳程度。80286及以后的微处理器与 8086 相比,最基本的特点是支持多任务。为了支持多任务就必须有大的存储器空间,必须支持虚拟存储器系统;为了支持多任务就必须有保护功能。多任务要求操作系统是多任务的操作系统。同时,也就
19、要求微处理器以特殊的硬件逻辑支持多任务操作系统。本节以 80486 为代表,介绍其逻辑结构。以后各节,实际上是对逻辑结构的进一步分析,看看它们是如何支持多任务的。8.2.1 80486 的寄存器组织的寄存器组织 要理解微处理器的工作原理,首先要了解微处理器内的寄存器功能。80486 内寄存器可分为以下几组。基本体系结构寄存器组:包括通用寄存器、指令指针、标志寄存器和段寄存器。可以看出,8086 中也有这些寄存器,它们是任何微处理器不可缺少的。还将看到 80486 中的这些寄存器与 8086 中的还是有些不同。系统级寄存器组:包括控制寄存器和系统地址寄存器。这些寄存器是实现保护模式功能的基础,控
20、制着新的存储器管理方式、多任务切换等功能的实现。浮点寄存器组:包括数据寄存器、标志字寄存器、状态字寄存器、指令和数据指针、控制字寄存器。80486 微处理器内包括数学计算协处理器(相当于 80387),这组寄存器用于实现协处理器功能。调试和测试寄存器:这些寄存器用于测试芯片逻辑、高速缓冲存储器及页面翻译缓存,和用于调试微码执行、数据访问的断点自陷。图 8.1 给出了80486CPU内的属于基本体系结构的寄存器。它和 8086 的寄存器相比较有以下差别:(1)8个通用寄存器的位数扩展为 32 位。前 4 个寄存器中的每一个在编程时可按位数不同分离为 4 个寄存器。以第 1 个为例,寄存器AL是指
21、 32 位中的位 0位 7,寄存器AH是指 32 位中的位 8位 15,寄存器AX是指 32 位中的位 0位15,而寄存器EAX则指 32 位的全部。与此相似,SI、DI、BP和SP是指 32 位的低 16 位部分,分别扩展成的ESI、EDI、EBP和ESP为 32 位的全部。(2)指令指针EIP为 32 位寄存器,存放下一条要执行指令的地址的偏移值,这个偏移值总是相对于代码段的基地址值而言的。EIP的低 16 位称为IP,用于偏移值为 16 位的情况。(3)标志寄存器也从 8086 的标志寄存器(FLAGS)16 位扩展为 32 位,称为EFLAGS。其中包括CF、PF、AF、ZF、SF、T
22、F、IF、DF、OF状态标志和控制标志位。此外,还定义了一些新的状态标志和控制标志,是高档微处理器特有的,在以后的有关讨论中介绍。(4)段寄存器增加为 6 个,除原来的CS、DS、ES和SS外,增加了FS和GS段寄存器也是用于定义数据段。它们都是 16 位。段寄存器在CPU处于保护模式时寄存的内容称为选择符,所以有时也称段寄存器为选择器。选择符的值不再是段地址的基值,而是获得关于段地址基值和段的其它信息的指针。这就是说,沿着选择符的指引可以从存储器中取出 8 个字节的数据,其中包括段的基地址和段的长度等有关信息。在实模式下,与 8086 相同,段的最大长度为 64 KB。在保护模式下,段的最大
23、长度可达整个机器的物理地址空间4GB。显然,段寄存器仍然是存储器划分为段和按段访问存储器的硬件基础。(5)段描述符高速缓冲寄存器。如图 8.2 所示,段描述符高速缓冲寄存器可以看作是段寄存器的延伸,每个段寄存器“配”有一个这样的缓冲寄存器 64 位,(8 个字节)。值得说明的是这组寄存器是“隐蔽”的,没有指令能直接访问它们。那么,它们的内容是如何装入和更新的呢?前面已经说过,沿着段寄存器内的选择符的指引,可以从存储器中取出 8 个字节的数据,其中包括段的基地址和段的长度等信息。这 8 个字节一组的数据称为一个段的描述符(Descriptor)。在存储器里,若干个段的描述符汇集在一起就可以组成一
24、个描述符表,用汇编语言的数据定义伪指令很容易建立这样的表。表中的每一项 8 个字节,每一项的开始地址对应一个选择符。请特别注意,当把一个选择符用指令或其它操作装入某个段寄存器(如DS)时,这个选择符所对应的在描述符表里的一个描述符 8 个字节就会自动地(硬件逻辑有此功能)被装入这个段寄存器对应的段描述符高速缓冲寄存器。硬件逻辑中有描述符高速缓冲寄存器的优点是使访问存储器的速度更快。2.系统级寄存器系统级寄存器 图 8.3 给出了系统级寄存器的基本结构。这组寄存器包括 3 个控制寄存器和 4 个段基址寄存器。1)控制寄存器 3 个控制寄存器分别为CR0、CR2和CR3(CR1 留给后代CPU使用
25、),这是 8086 中所没有的。CR2、CR3 的控制功能以后介绍,这里只介绍CR0 的功能。CR0 的低 16 位又称机器状态字,可以用指令装入内容。其中控制位的功能还可以分为 5 类:(1)对CPU工作方式进行控制的有两位:PE(位 0)为保护模式允许位,该位置 1,使CPU转移到保护模式;该位为0时,为实模式。PG(位 31)为分页功能允许位。分页是在保护模式下对存储器管理的一种方式(以后详细说明),可以利用这种方式,也可以不用这种方式。该位置 1,表示利用这种方式,使CPU的有关逻辑按分页方式连接。(2)对CPU内高速缓冲存储器Cache操作方式进行控制的有两位:CD(位 30)为高速
26、缓存禁止(即不允许)位。该位置 1,表示片内高速缓冲的功能处于不允许状态,不把主存内容拷贝到高速缓存器。只有该位复位为 0,高速缓存功能才处于允许状NW(位 29)为高速缓存通写方式禁止(即不允许)位。为了保持高速缓存的内容与它对应的主存储器部分内容相同,在改变了高速缓存中的数据后,有两种方法修改主存中的数据。一种方法为写回(write back)法,另一种称为通写(write through)法。NW位置 1,意味着不用通写法;NW位为 0,用通写法。(3)与协处理器或浮点运算部件有关的控制位有TS、EM、MP和NE,这里不介绍。(4)对界屏蔽位AM。对界是指访问存储器时数据类型与在存储器内
27、起始地址的关系:如果访问存储器中字型数据时其起始地址为奇地址,或访问双字型数据时,起始地址不是 4 的倍数的地址,或者访问 4 字型数据时起始地址不是 8 的倍数的地址,都是未对准界限,或简称未对界。在前面介绍的标志寄存器EFLAGS中,有一个控制标志位AC(位 18),称为对界检查标志。该位设置为 1,意味着要进行对界检查,并且当检查出未对界发生时,CPU将产生一类型号为 17 的异常中断;AC位 0 时,意味着访问内存时不进行对界检查。CR0 中的AM位对FLAGS中的AC位进行控制:如果AM位置 1,使AC位具有所指定的控制作用;AM为 0,表示AC位不再起控制作用,也就不会有类型号为
28、17 的异常中断产生。(5)写保护控制位WP。在对存储器管理采用分页方式时,WP对只读页面提供保护控制功能。如果设定WP位为 1,在管理程序中出现了对只读页面写操作时将自动产生故障中断(类型号 14);当WP为 0 时,允许有条件地对只读页面写操作。2)系统地址寄存器 为了实现保护模式的功能,系统软件(操作系统)需要在存储器内定义 4 种表或段。它们是:全局描述符表GDT,只有一个。中断描述符表IDT,只有一个。局部描述符表LDT,每个任务一个。任务状态段TSS,每个任务一个。在CPU芯片内,支持这种机制的 4 个寄存器分别为全局描述符表寄存器GDTR、中断描述符表寄存器IDTR、局部描述符表
29、寄存器LDTR和任务状态段寄存器TR,如图 8.3 所示。其中GDTR和IDTR有相同的结构,分为两个字段:32 位线性基地址部分,直接指明GDT表段和IDT表段在存储器的开始地址,和 16 位表段的长度。LDTR和TR也是唯一的,但LDT和TSS却有多个。从另一意义上说,每个LDT和TSS都是由软件定义的段,也有自己的选择符和描述符。这就要求从概念上把一个LDT本身的描述符(描述LDT)和它(作为存储器中的表)内部包含的描述符区别开来。所以LDTR和TR的结构与段寄存器(CS、DS等)相似,可以由指令访问的只有 16 位,即选择器部分,用以寄存正在执行任务的LDT描述符(局部描述符表的描述符
30、)的16位选择符和正在执行任务的TSS描述符(任务状态段的描述符)的 16 位选择符。LDTR和TR也有相应的描述符高速缓冲寄存器部分。当某个LDT(或TSS)的选择符装入LDTR(或TR)的选择器部分时,将自动地把这个LDT(或TSS)的描述符部分装入相应的描述符高速缓冲寄存器部分。关于浮点寄存器组和测试调试寄存器组本书不讨论。8.2.2 RISC介绍介绍 在 80486CPU芯片里包含有相当于 80387 的浮点协处理器,包含有 8 K字节的数据和指令混合型的高速缓存器(Cache),以及采用了某些RISC技术,这是 80486 速度提高的最重要的三项技术措施。关于协处理器和Cache的概
31、念已经介绍过。这里介绍RISC技术的基本原理。RISC是Reduced Instruction Set Computer(精简指令系统计算机)的缩写。CISC是Complex Instruction Set Computer(复杂指令系统计算机)的缩写。CISC和RISC是促进处理器体系结构发展的两种不同的理论或指导思想。CISC理论比RISC理论的历史要悠久。80286 以前的微处理器是按CISC理论设计的。CISC理论的要点如下:(1)增强单条指令的功能,使指令系统中不仅有许多常用指令,还包括功能很强的特殊指令。微处理器功能和性能的提高,依赖于增加指令系统中指令的条数和指令的功能。这样做的
32、结果虽然可以缩减程序的长度以提高效率,但对于功能复杂指令的执行却加重了微处理器的负担,倒成了降低效率的因素。(2)具有种类多且复杂的存储器寻址方式。其结果一方面增加了寻址功能,但另一方面使操作数有效地址的计算变得复杂。(3)采用微程序结构。微程序控制的概念可简要说明如下:在CPU中,任何一条指令的功能都分若干步完成,每一步又包括若干个基本操作,这些基本操作称为微操作。在采用微程序控制的CPU结构中,把同时(即同一步)发出的控制信号所执行的一组微操作称为微指令。也就是说,把一条指令分解成若干条微指令,按顺序执行这些微指令,就可以实现这条指令的功能。计算机的程序由指令序列构成,而每条指令的功能又由
33、微指令序列解释完成,这些微指令序列的集合称为微程序。微程序控制器的组成和操作过程可用图 8.4 来说明。图 8.4 表示微程序控制器由指令寄存器IR、操作译码器、控制存储器和微指令寄存器组成。从存储器取来的指令码寄存于指令寄存器IR中。操作译码器只对指令的操作码部分译码。由于控制存储器中每个地址存储着一条微指令的控制信号字段和下址字段(即相邻下一条微指令在控制存储器的地址),所以操作译码器只需译出指令的首条微指令在控制存储器的地址,这样便可相继取出一条指令的所有微指令到微指令寄存器执行。微指令的控制字段的每一位都是完成特定操作控制信号的控制位。该位设置为 1,将控制对应信号产生。操作译码器和控
34、制存储器都用只读存储器实现。80386 及以后的微处理器的设计逐渐接受了RISC的指导思想。RISC理论的要点如下:(1)减少指令系统中的指令条数,只使用应用频率高的简单指令;指令长度固定,指令格式种类少,寻址方式种类少。这样可以简化指令的存取,缩短指令码译码及执行的时间。显然这是针对CISC的缺点想出的办法。当然,这样设计指令系统必将使程序包含的指令条数增多。这个问题由下面所说的技术克服。(2)采用指令流水线技术,扩大并行处理范围。在CISC技术中,指令的执行是逐条相继完成的,一条指令所包括的所有步(即所有微指令序列)执行之后才能取下条指令并开始执行。RISC技术虽然也把一条指令分成若干步,
35、例如分为取指令(F1)、译码(D)、取操作数(FO)、执行(E)和写结果(W)5 步。但由于采用并行处理,指令的执行时间就可如图8.5 所示那样,一条指令的各步操作在不同的部件中完成,同一时间(如同一时钟)各部件执行着不同指令的操作,平均下来,一条指令占用的时间就大大缩短了。80486CPU采用了指令流水线技术,在最佳状态下,一条指令平均一个时钟周期完成。(3)增加CPU内通用寄存器的数量,这样就可以实现,除从存储器取数和向存储器存数两条指令访问存储器之外,其余指令的操作都只在寄存器之间进行,大部分指令都可在一个机器周期内完成。(4)以硬布线控制逻辑为主,不用或少用如CISC中介绍的微程序控制
36、所需的用只读存储器方式实现的译码器和控制存储器。以上是RISC技术的要点,80386 及以后的CPU已利用了其中的某些技术,从而大大提高了运行速度。8.3 虚拟存储器的实现机制虚拟存储器的实现机制 虚拟存储器是通过管理把主存储器(常称为内存)和辅助存储器(常称为外存,例如磁盘)有机的结合起来,使得程序员可以按比主存储器容量大得多的空间编制程序。这时,把程序员编程可用的空间称为虚拟空间,把主存储器的实际空间称为物理空间。虚拟存储器的实现,允许同一程序的一部分在主存储器中,其它部分在辅助存储器里。运行时,可能频繁地进行着辅存部分装入主存,主存部分传至辅存。这就要有一套技术进行管理。根据主存和辅存之
37、间传送信息的基本单位不同,可以把虚拟存储器的管理分为分段管理、分页管理和分段分页相结合三种管理方式。虚拟存储器的管理是依靠软件和硬件互相支持共同实现的。如果在CPU内有专门适用于虚拟存储器管理的硬件,就可减轻软件的负担,使存储器的访问速度大大加快。这是改善整机系统性能的重要因素。80486CPU有存储器的分段管理模块和分页管理模块。在保护模式下,可以采用分段管理方式,也可采用分段分页结合方式实现虚拟存储器的管理。所以在保护模式下,虚拟存储空间最大可达 246B(64 TB),是物理存储空间232B(4GB)的214倍。8.3.1 虚拟地址、虚拟地址、物理地址和线性地址物理地址和线性地址 对于8
38、0486CPU的保护模式,有虚拟地址、线性地址和物理地址三种存储器地址空间。虚拟地址(即逻辑地址)和物理地址的概念在第 3 章已经介绍过了。在实模式下,和8086CPU相同,一个虚拟地址,即逻辑地址,是用它的段地址和段内偏移地址两部分表示的。由于任何由程序访问内存的操作,总是要指明段地址和段内偏移地址,所以也可以这样理解虚拟地址:虚拟地址是程序访问存储器时由程序指明的地址。物理存储器是CPU可以访问的存储器。物理存储器空间的大小由CPU具有的地址总线的位数决定。对于8086CPU,地址总线为20位,其物理存储空间为 220 B,即 1 MB地址。由8086CPU内部逻辑决定的由虚拟地址变换成物
39、理地址的规则是,16 位段地址(在段寄存器中)左移 4 位与 16 位偏移地址相加,得到20 位地址,即是物理地址。80486CPU保护模式下,虚拟地址仍由程序指明段的基地址(即段地址)和偏移地址两部分表示,也就是说任何由程序指明的访问存储器操作,必须指明一个段的基地址和一个偏移地址。80486 与 8086 的逻辑地址相比较,有以下不同之处:(1)段的基地址和偏移地址不再是 16 位,而是32 位。(2)段的基地址不直接由 16 位的段寄存器(CS,DS,ES,SS)提供,而是含在段的描述符(Descriptor)中。每个段描述符由 8 个字节组成,其中 32 位是这个段的基地址。段的描述符
40、存储于称为描述符表的专门定义的存储区内。(3)16 位的段寄存器,在保护模式下称为段选择器,其中寄存的内容称为段的选择符。16 位段选择符中的14 位用作索引号,依据索引号可以找到在描述符表中对应的段描述符,进而在段描述符中获得段的基地址。这就形成了一个(存于段寄存器的)段选择符与(存储于描述符表的)段描述符及段基地址的一一对应关系。可见,原来的实模式下直接寄存段地址的 16 位段寄存器,在保护模式下仍然是存储器分段管理的基础。图 8.6 是80486CPU在保护模式下访问存储器的基本寻址关系。从图中可以看出,要访问存储器时,程序或指令按指令寻址方式的规则,总能产生 32 位(也允许 16 位
41、)段内偏移地址和 16 位的段选择符。由选择符中的 14 位索引(Index)值指向由操作系统定义的段描述表中的某一个描述符,取出该段描述符中的 32 位段基地址,这就得到了构成一个虚拟地址的两部分:段基地址和段内偏移地址。由于虚拟地址是由程序或指令指明的,所以虚拟地址空间的大小也是由程序决定的。一个程序能占用的最大的虚拟存储器空间是这样计算出来的:由于段选择符中有 14 位索引号(Index),就说明它最多可以定义 214个段。80486CPU的地址总线为 32 位,决定了物理存储器地址空间为 232 B(4 GB)。一个程序要占用的虚拟存储器空间大于CPU可以直接访问的物理存储器空间,这就
42、出现了矛盾,这个矛盾的解决是虚拟存储器空间可以扩展到磁盘上。这就是说,虚拟存储器空间是由磁盘等外部存储器支持实现的。一个占用虚拟存储器空间大于物理存储器空间的程序,先存储于磁盘上,在执行时不能一次全部装入物理存储器中,而是根据需要动态地部分装入内存或写回磁盘。这种存储器管理或存储器分配一般是由操作系统进行的,但CPU内部结构必须支持存储器管理功能。80486CPU内的分段存储管理机制和分页管理机制为操作系统的虚拟存储器管理提供了必要的硬件支持。线性地址的定义是:段的基地址与偏移地址之和称为线性地址。由于段基地址和偏移地址都是 32 位,所以线性地址也是 32 位。80486 CPU中,对于存储
43、器管理除分段机制外,还有分页机制。在前节介绍的控制寄存器CR0 中的PE位就是分页机制控制位,该位设置为 1,意味着分页机制被使用;该位设置为0,表示分页机制不使用。在分页机制不被使用的方式下,段基地址与偏移地址相加产生的线性地址就是访问存储器的物理地址。在分页机制被使用的情况下,有一个线性地址变换成物理地址的过程,将在后面讨论。8.3.2 存储器的分段管理存储器的分段管理 对于程序而言,80486 系统的任何信息(包括程序本身)都是分段存储的。概括地说,存储分段管理就是:任何信息都定义在某一段中;任何段都有说明本段情况的描述符;描述符定义在描述符表中,描述符表是特殊的段;在描述符表中的每一描
44、述符,有一个选择符与其相对应。这就是说,通过选择符,可以找到它对应的段描述符,从段描述符中可取出该段的基地址、段的长度和关于该段的其它信息。支持这些操作的硬件,大部分是不可见(不是程序员编程直接控制)的逻辑,可见的逻辑主要是一组系统地址寄存器:GDTR、LDTR、IDTR和TR。为了理解分段管理,必须讨论段的种类、段描述符、描述符表、描述符的选择符,以及系统地址寄存器。1.段的种类和段描述符段的种类和段描述符 在 8086 系统中,信息也是按段存储的,但段的种类很少,只有代码段、数据段和堆栈段。而在 80486系统中,保护模式下段的种类增多了,可用表 8.1 来概括。代码段、一般数据段和堆栈段
45、的意义与 8086 系统相同,不再说明。在系统段中,全局描述符表GDT、局部描述符表LDT和中断描述符表IDT是这样特殊的段:它们具有表的结构特点,表的每一项为一个描述符,每个描述符有 8 个字节。所以表的长度是所包含的描述符数乘以 8。GDT和IDT在全系统中只能各有一个,而LDT则可能有多个。描述符不是 8 位代码的字符,只是由于它的英文为Descriptor,以or结尾,很多人把它翻译成描述符。实际上描述符是一组 8 个字节的信息。描述符的分类有两种方法:一种分类方法是把描述符分为段描述符和门描述符两大类。这两大类描述符的主要区别是,在 8 个字节的描述符格式中,段描述符有 32 位段的
46、基地址,门描述符中有 16 位的指向其它描述符的选择符。这是合理的,段描述符描述段的特征,其中最重要的两个特征是段的基地址和段的长度,它们为访问段内信息提供了基础。如获取代码段内的指令码、访问数据段内的数据、从描述符表(描述符表也是段)中获取另一描述符等,都必须知道段的基地址。门描述符也简称门,用于间接地控制转移或任务切换。这里的“间接”意味着多一次从选择符找到描述符的过程。所以门描述符中包含一个 16 位的段描述符的选择符。图 8.7 是这两类描述符的简化格式。图 8.7中(a)、(b)的共同点是字节 5 都是访问权字节。图 8.7(a)的段描述符中字节 2、3、4、7 组成了 32 位段的
47、基地址。字节 0、1 和字节 6 的低 4 位,共 20 位给出段的界限,即段的长度。字节 6 的位 7(G位)是界限的辅助说明位,若G=0,则界限值的单位为字节,此时段的长度最大值为 220,即1MB;若G=1,则界限值的单位为 4 KB,此时段的长度的最大值 为 232,即4 GB。字节 6 的位 6(D位)用于指明操作数和有效地址的长度:D=1,采用 32 位操作数和 32 位寻址方式;D=0,采用 16 位操作数和 16 位寻址方式。在80286 系统产生的代码段在 80486 上运行时,D取 0。图 8.7(b)中字节 2、3 是 16 位的选择符,用于选择一个段的描述符,进而获得段
48、的基地址。字节 0、1、6、7 的 32 位偏移值与获得的段的基地址相结合,形成一个将要访问的逻辑地址。另一种描述符分类方法是按描述符访问权字节(字节 5)和字节 6 的高 4 位中有关字段分类的。字节 5 位 4 标为S位,它的两个状态把描述符分为两大类:S=1 为代码段、数据段和堆栈段描述符;S=0,则是系统段和门描述符。按S位把描述符分为两大类后,访问权的TYPE字段(3 位或 4 位)又把它们区分开具体类型。图 8.8 是两大类访问权字节的格式。S=1 时TYPE字段的 3 位(位 3位 1)组合指明代码段、数据段和堆栈段的不同类型。表 8.2 给出了位组合与类型关系。位 3 标以E,
49、用于区别代码段和数据段。在表 8.2 代码段(E=1)时,位 2、位 1 标以C和R,用于保护控制。在数据段(E=0)时,位 2 标以ED,用以区别一般数据段(ED=0)和堆栈段(ED=1),位 1 标以W,也用于保护控制。关于保护功能在 8.5 节讨论。S=0 时TYPE字段为 4 位(位 3位 0)组合。这4 位组合代表的描述符又分为两类:系统段系统段(LDT、TSS)描述符和门,如表 8.3 所示。图 8.8 中访问权字节的P位,对于段描述符和门意义不同。在段描述符中的P位,指明该段当前是否在内存中,P位为 1 表示该段在内存中;P位为 0,表示该段不在内存,而在辅助存储器(磁盘)中。访
50、问权字节的DPL(位 6、位 5)字段指明描述符特权级,用于系统保护,将在 8.5 节讨论。图 8.8(a)中访问权字节位 0 标以A,借助对A位的操作,可以统计出近期该段被访问的频繁程度。每当这个代码段或数据段描述符被访问时,这个描述符(在描述符表中)的A位被置1。操作系统按一定周期查看记录A位的状态并使A位复位为 0。在一段时间内(当然要大于查看A位的周期)对A位状态的统计,就可以知道近期内该段被访问的频度。在虚拟存储器系统中,随着程序的运行,把存于磁盘上的段装入内存是常有的操作,自然也有从内存中删除某些段操作。根据什么原则从内存中删除某些段?一般的原则是删除近期访问频度低的段。这就是A位