第3章 80486系统原理
像与80386完全兼容的整数部件(Integer Unit), 3.1 80486的体系结构 80486微处理机是由提高了效率的80386微处理机、增强了性能的80387数值协同处理器、一个完整的片内Cache及其控制器组合而成。所以,80486芯片内的部件,都是经过优化处理的、集成度更高的部件。 像与80386完全兼容的整数部件(Integer Unit), 与80387完全兼容的浮点部件PFU、 一整套虚拟存储管理与保护系统、 一个标准统一的规模大小为8K字节的程序和数据共用的统一的高速缓冲存储器Cache、总线监视以及一些多重处理支持设施等。为提高某些性能指标和增强功能。又新增了一些局部部件和6条80386没有的指令。 是什么
3.1.1 寄存器组 Intel为了在代码级向上兼容,80486微处理机在硬件设计上,在许多地方与80386微处理机都保持兼容。 3.1.1 寄存器组 Intel为了在代码级向上兼容,80486微处理机在硬件设计上,在许多地方与80386微处理机都保持兼容。 80486微处理机所具有的寄存器种类和数量都非常多。它的寄存器既有80386微处理机中使用的全部寄存器,又有80387数值协同处理器中使用的各种寄存器。80486微处理机的寄存器种类可分为以下几种:
(1)基本体系结构寄存器。其中包括以下4种: ① 通用寄存器。 ② 指令指针寄存器。 ③ 标志寄存器。 ④ 段寄存器。 (2)系统级寄存器。其中包括以下2种: ① 控制寄存器。 ② 系统地址寄存器。 (3)浮点寄存器。其中包括以下5种: ① 数据寄存器。 ② 标记字寄存器。 ③ 状态字寄存器。 ④ 指令和数据指针寄存器。 ⑤ 控制字寄存器。 (4)调试和测试寄存器
1.通用寄存器 80486共配置了8个32位的通用寄存器,如图3.1所示,这8个通用寄存器与80386的完全一样,它们的名字和用途分别为: EAX 用来作累加寄存器(Accumulator) EBX 用来作基址寄存器(Base) ECX 用来作计数寄存器(Count) EDX 用来作存放数据寄存器(Data) ESP 用来作堆栈指针(Stack pointer) EBP 用来作基址指针(Base pointer) EDI 用来作目标变址寄存器(Destination index) ESI 用来作源变址寄存器(Source index)
80486的通用寄存器 AX BX CX DX SI DI BP SP AH AL BH BL CH CL DH DL EAX EBX ECX EDX ESI EDI EBI ESP 16 15 31 8 7
2.指令指针寄存器EIP 指令时针寄存器是一个32位寄存器。 在指令指针寄存器内存放的是下一条要执行指令的偏移量。这个偏移量是相对于目前正在运行的代码段寄存器CS而言。偏移量加上当前段的地址,形成了下一条指令的地址。 当80486在 32位操作方式下进行时,就采用32位的指令指针寄存器。若80486工作在实模式、虚拟8086模式,或保护模式 286 兼容方式下时,就用16位指令指针寄存器,用于16位寻址操作。
3.标志寄存器EFLAGS 80486的标志寄存器是一个32位寄存器,如图3.3所示。它的作用是用来存放有关80486微处理机的状态标志信息、控制标志信息以及系统标志信息。 80486的状态标志信息报告的是算术运算类指令在执行完之后的机器状态。控制标志仅有一个即DF标志,用来控制串操作过程中执行方向问题,即是给目标变址寄存器EDI、源变址寄存器EDI、源变址寄存器 ESI增值还是增负值(减值)问题。系统标志信息用来控制输入/输出、屏幕中断、调试、任务转换和控制保护模式与虚拟8086模式间的转换等操作。 对绝大多数系统来说,若通过应用程序改变系统标志寄存器中的标志状态,都将引起一个异常事故出现。 拿80486的标志寄存器与 80386的标志寄器进行比较后会发现,二者几乎完全一样。
80486的标志寄存器 CF: 进位标志(S) AF: 辅助进位标志(S) PF: 奇偶校验标志(S) ZF: 零标志(S) SF: 符号标志(S) TF: 自陷标志(X) IF: 允许中断标志(X) DF: 方向标志(C) OF: 溢出标志(S) IOPL: I/O特权级标志(X) NT:嵌套任务标志(X) RF:恢复标志(X) VM:虚拟8086模式(X) 17 16 15 14 1 2 3 4 5 6 7 8 9 10 12 13 31 ………. C F P Z A S T I D O N R V M IO L AC 对准校验
惟一差别是80486又新定义了一个AC 标志位(即标志寄存器的位18),也就是对准校验标志(Alignment Checkout Flag)。 若AC位为1时,80486就允许对没有对准的数据进行对准检查,既可以是对字对准进行检查,也可以对双字甚至四字的对准进行检查。若80486发现在进行存储器操作时出现没有按边界对准情况,就发生数据访问异常事故,并把这种异常事故编号为异常事故17。若AC位为0则不检查。 如果对存储器进行读写操作时,使用的是一个未对准的地址,80486就允许产生异常事故信号。若AC=1,若出现了单字存储操作时使用的是奇地址,双字存储操作使用的不是双字边界内地址,或者在进行四字(8个字节)存储操作时使用的不是四字边界内地址,就会出现数据访问不对准异常。
标志寄存器中的位17是虚拟8086方式位VM 标志寄存器中的位16是恢复标志位RF 标志寄存器中的位14是嵌套任务标志NT 标志寄存器中的位13、位12是输入/输出特权级标志位IOPL 溢出标志位11F
标志寄存器中的位10是定向标志DF位 标志寄存器中的位9是允许中断标志位IF 标志寄存器中的位8是自陷标志位TF 标志寄存器中的位7是符号标志位SF 标志寄存器中的位6是零标志位ZF 标志寄存器中的位4是辅助进位标志AF 标志寄存器中的位2是奇偶校验标志位PF。 标志寄存器中的位0是进位标志位CF。
4.段寄存器 80486 配备有6个16位的段寄存器,段寄存器也叫选择符 (Selector)。它们的名字和用途与80386 的一样,其名称分别是: 代码段寄存器 CS 数据段寄存器 DS 堆栈段寄存器 SS 附加数据段寄存器 ES 附加数据段寄存器 FS 附加数据段寄存器 GS
3.1.2 80486 CPU系统原理 80486微处理机是由提高了效率的80386微处理机、增强了性能的80387数值协同处理器、一个完整的片内Cache及其控制器组合而成。所以,80486芯片内的部件,都是经过优化处理的、集成度更高的部件。像与80386完全兼容的整数部件(Integer Unit),与80387完全兼容的浮点部件FPU(Floating Point Unit)、一整套虚拟存储管理与保护系统、一个标准统一的规模大小为8K字节的程序和数据共用的统一的高速缓冲存储器Cache、总线监视以及一些多重处理支持设施等。为提高某些性能指标和增强功能。又新增了一些局部部件和6条80386没有的指令。
在设计80486微处理时,围绕以下4个目标展开工作: (1)保证与80386微处理机及80387数值协同处理器软件完全兼容。 (2)在相同时钟频率下,要比由80386和80387组成的系统的性能高2~3倍。 (3)扩充IBM PC 80386体系结构标准,使80486带有小型计算机的某些特征。 (4)增加整个系统的集成度。
图3.4示出80486微处理机CPU的逻辑框图。 图中的Cache部件、8K字节的统一Cache、以及浮点部件FPU和EP寄存器组在以80386为基础的系统内属于不同的独立芯件,并不在80386 CPU芯片之内,而在80486中这些部件变成了80486 CPU的一个组成部分。 这两个新集成到80486 CPU内的部件,一个是浮点部件FPU,它有效地提高了浮点操作性能;另一个是指令和数据共用的高速缓冲存储器Cache。
图3.4 80486结构逻辑图 32位线性地址总线 32位位移总线 微指令总线 已译码指令 页属性 20位物 理地址 32位读 数据 图3.4 80486结构逻辑图 32位线性地址总线 32位位移总线 微指令总线 已译码指令 页属性 20位物 理地址 32位读 数据 32位写 数据 32位系 统地址 桶形移位器 寄存器组 ALU 分段部件 描述符 寄存器 段界和属性PLA 分页部件 TLB Cache 部件 8KB一体 的Cache 指令 预取部件 32字节 代码队列 浮点部件 控制和 保护部件 控制ROM 总线大小 控制 奇偶控制 和产生 地址驱 动器 写缓存 数据总线 收发器 总线控制 请求序列 发生器 成组控制 Cache控制 系统接口 24位代码流 32位 基址/ 变址 总线 32位数据总线 64位部件数据传送总线 指令译码
初看起来,剩下来的逻辑部件与80386 CPU相应逻辑部件非常相似,但实际上还是有所差异。Intel把预取部件、指令译码部件,以及控制逻辑部件都进行了修订调整。同时把高速缓冲存储器Cache都集中到指令执行流水线中,使这些部件达到了最佳状态。经过改进之后,这几个关键部件能使一些最常用、最简单的指令在一个时钟周期完成。指令执行速度达到了小型计算机水平。
图3.4示出的80486逻辑框图与前面的80386逻辑框图进行比较后我们会发现: 80486芯片内较之80386又新添了三个新的子部件 它们分别是浮点部件FPU、 控制和保护部件和Cache部件。 把浮点部件FPU也按排在80486的芯片之内,其目的就是要尽可能发挥片内Cache及其控制部件的作用,使存储器与CPU之间的接口操作速度提高了很多。与以前分立的80387浮点部件相比,把80387集成到80486芯片之内,的确增强了80486芯片的整体性能。不可小看控制和保护部件的作用,它可是整个芯片的控制中心。它的作用之一就是协助分段部件开展工作。它的主要功能是把已经译好码的指令的微代码取到执行部件上去执行,以便最大限度地发挥指令流水线的作用。
预取部件的作用是;负责从高速缓冲存储器Cache内取后面一部分指令用于执行。如果在高速缓冲存储器Cache内没有找到所需的这批指令,它就到主存储器去取这部分内容,与此同时还会把Cache充满。 控制和保护部件的作用是把指令转换成微代码指令,这些微代码指令越过内部总线直接进入各执行部件去执行。
3.1.3 80486微体系结构 80486微处理机的微体系结构包括有9个功能部件,它们分别是: ①总线接口部件。 3.1.3 80486微体系结构 80486微处理机的微体系结构包括有9个功能部件,它们分别是: ①总线接口部件。 ②片内高速缓冲存储器Cache。 ③指令预取部件。 ④指令译码部件。 ⑤控制部件。 ⑥整数运算和数据通路。 ⑦浮点部件。 ⑧分段部件。 ⑨分页部件。
3.1.3.1 总线接口部件 总线接口部件与片内Cache外部总线接口实行的是逻辑接口连接。当访问Cache出现没命中时,或当需更改系统存储器内容时,或当需向Cache写某些信息时,就要通过总线接口从外部存储器系统中取出一批数据。 总线接口对填充Cache时使用的成组传送方式以及为了遮掩向缓冲存储器写数据时出现的等待时间,总线接口都能提供技术细节上的支持。80486的总线接口还配备有包括总线监视功能设施。 总线接口部件根据优先级高低协调数据的传送、指令的预取操作,并在处理机的内部部件和外部系统间提供控制。80486微处理机的总线接口部件拥有如下结构特征:
80486微处理机的总线接口部件拥有如下结构特征: 1.地址收发器和驱动器 在地址总线上,驱动器不仅驱动地址总线上的A2~A31地址信号,同时也要驱动与地址信号相对应的字节允许信号BE0#~BE3#。在A2~A31这30个地址信号中的高序28个地址信号还是双向信号,这样就允许芯片外逻辑将Cache的无效地址驱动到处理机内。 2.数据总线收发器 数据信号D0~D31被驱动到微处理机的总线上,而接收数据信号也是从微处理机的总线上进行接收。 3.总线规模大小控制 在80486微处理机上,外部数据总线规模大小一共有三种可供选用,它们分别是32位宽、16位宽和8位宽的数据总线。用外部逻辑的两个输入端来说明所使用的数据总线的宽度。在一个时钟周期挨着一个时钟周期的基础上,总线规模大小是可以变化的。
4.写缓冲 总线接口部件最多可允许四个写请求可以采用缓冲技术。由于采用了这项技术,可使多个芯片内部操作在不必等待写周期情况下,可以继续去完成它们在总线上的操作。 5.总线周期和总线控制 总线接口部件的这一特征对总线周期的广泛选择和控制功能都给以支持。像成组传送、非成组传送(单个周期或多个周期的传送),总线的仲裁(其中包括总线请求、总线保持、总线保持确认、总线锁存、总线的伪锁存以及总线退出(Bus Backoff)等操作),像浮点运算出错信号的发送、中断和复位等操作都给以支持。 6.奇偶校验的生成和控制 在向微处理机写时生成偶校验,而在进行读操作时则进行校验。而错误信号表示的是读奇偶校验错。 7.Cache控制 总线接口部件的Cache控制特征对Cache操作的控制和一致性操作提供支持。三个输入端允许外部系统对存放在片内的数据的一致性实施控制。两个专用的总线周期允许处理机对片外Cache的一致性实施控制。
3.1.3.2 Cache部件 80486片内Cache中存放的是CPU最近要使用的,在主存储器中保存着指令、操作数以及其他一些数据的副本。若微处理机需用的信息正在Cache中,则称之为Cache命中。 在Cache命中情况下,根本就不用总线读周期,直接到Cache读即可。若微处理机所需用的信息此时不在Cache内,则称之为Cache不命中。 这时微处理机就会一次传送16个字节,经一次或多次传送将微处理机所需用的信息从主存储器读到Cache中去,这种操作就是Cache行的填充(Cache Line Fills)。当出现了向Cache某些存储单元的内部写请求,实际上进行的是两项操作。一是Cache内容被修改,二是把写到Cache中的内容经由Cache同时也写到了主存储器中,这种写操作就是Cache的写贯穿(Cache Write - Throngh)。
3.1.3.3 指令预取部件 当总线接口部件不执行总线周期时就去执行一个取指令周期,指令预取部件就利用总线接口去预取指令。微处理机总是提前把指令预取到预取部件,很少出现微处理机在总线上等待指令预取周期的现象。 在指令预取周期读的是16个字节的指令模块,其起始地址比最后一次取指令所用地址在数值上是大的。起始地址是由预取部件生成的,其实,预取部件与分页部件之间是直接连接的。
3.1.3.4 指令译码部件 80486微处理机的指令译码部件的作用是,对由预取部件提供的指令流给以译码。80486采用的是两步流水线译码方案。这种方案在每一时钟周期都能提供一个译好码的指令。这种指令译码部件还提供了许多硬连线的微指令,在把第一个微代码从控制存储部件读出来之前,用这些微指令启动并控制相应操作。因此,在微代码控制之前就已开始执行译好码的指令。
3.1.3.5 控制部件 控制部件的作用是负责解释来自指令译码部件的指令字和微代码。控制部件的输出控制着整数部件和浮点部件。又由于对存储器段的选择可以由指令给以定义,所以控制部件还控制着分段部件。 控制部件内拥有微处理机的微代码。由于有许多指令都有惟一的一行微代码,80486微处理机平均起来每一个时钟就能执行一条指令。后面还会详细讨论怎样将指令装入流水线和怎样执行的。
3.1.3.6 整数部件 80486微处理机的主数据通路包括算术与逻辑运算部件ALU、桶形移位器、寄存器组以及标志寄存器等部件。 为了支持流水线操作,可以用三个读端口和一个写端口来访问通用寄存器。80486微处理机芯片还配备有一专用逻辑,用来检测总线的争用情况,同时适时激励总线短程部件(Bus Shorters)。 在一个时钟周期内完成对数据的写操作,与此同时,在同一个时钟周期还可以作其他操作。这一点非常重要,像在执行完装入之后,紧接就要在下一个时钟周期执行后继操作那样,这种情况在80386、80486微处理机内经常发现。
3.1.3.7 浮点部件 80486微处理机配置的浮点部件执行的指令系统,与80387数值协同处理器所执行的是同一个指令系统。 二者不同之处在于,80486的浮点部件还配备有一个下推寄存器堆栈,以及一个用来解释依据IEEE标准规定的32位、64位和80位数据格式的专用硬件。 浮点部件的经由微处理机总线传送给外部系统的输出信号,可用来表示浮点部件所出现的错误信息。外部系统本身也能对微处理机的这种输入信号加以确认,并可以表示微处理机将对浮点部件出现的错误不予理睬,继续它的正常的操作。
3.1.3.8 分段部件 80486微处理机的分段管理部件是片内整个存储管理功能的一个组成部分。其内配备有一个段描述符Cache以及用来计算有效地址和线性地址所必需的电路。 分段部件还配备了一种叫做面向分段的执行逻辑,进行例行保护规则测试。为了加快分段装入操作,在一个时钟周期时间内可以从Cache传送出64位数据。 所谓段,就是一个被保护的、独立的80486存储器内的存储地址空间。分段的目的就是在各应用程序间实行强制性的隔离、去调用恢复的过程、并对在程序设计中所出现的错误实行隔离提供物质基础。 分段部件的功能是把由程序提供的逻辑地址,转换成一种线性地址。
3.1.3.9 分页部件 80486的分页管理部件,在整个存储管理系统内采用的是二级分页管理机制。分页部件配备了一种包含有32个登记项的转换旁视缓冲存储器TLB。分页部件也需要一种面向分页的执行逻辑,用来对分页规则给以检测。 使用分页部件可以使程序能够访问比实际可用的存储空间大很多的数据结构,所采用的手段就是将这种大的数据结构的一部分保存在主存储器之内,而另一部分则保存在磁盘上。 分页部件将线性地址空间,分成其大小规模为4K的若干页,也就是说80486微处理机将4K字节定义为一页,分页部件使用保存在存储器中的名为页表的这种数据结构,将线性地址转换成物理地址。
3.2 流水线操作 在执行指令时,80486使用的指令流水线按每一个时钟周期执行一条指令的速度连续不断地执行。 之所以有如此高的速率, 其一是:Cache和流水线集成在一起了; 其二是:流水线操作指令的译码也分两步完成。 在进行整体设计时,力图实现使有的程序不仅能执行,而且还要很好地执行。并不需用编译程序来掩盖流水线中的任何低效现象。
译码的两个步骤是: 第一步对指令进行分类。选择微程序ROM的入口点,并确定是否需要访问存储器。然后将操作数地址发送给地址计算部件。同时操作码则被发送给二级译码器和微代码ROM。 第二步把宏指令扩展成一个或多个已全部译码的微指令。在第4个流水线操作步骤中,由算术运算和逻辑运算部件ALU执行扩展了的微指令。在第5个流水线操作步骤中,则把计算结果存放到寄存器组上。 第一个译码步骤可以检测出任何一种转移指令,并且进行一次目标操作码的预取。转移操作码在执行步骤之前是不会被进一步解释的。即使出现转移时,也会出现两个时钟周期的流水线延迟。若取出的不是条件转移,则指令仍从原来的预取点继续执行,当然也就不会招致附加延迟问题。
3.2.1 成组传送 访问主存储器时,80386和80486主要不同点在于流水线与成组传送两个问题。当然不可避免也会涉及到80486片内Cache。 为支持80486的成组方式,系统的运算要快,存储器的存取速度也要快。因此,选用何种存储器结构是令人关注的问题。当存储器向外传送数据(或从外向存储器传送数据)时,给定的标准是一个时钟时间,则首选存储器件应是DRAM;它的速度虽低,但价格比较便宜。需要说明的是,80486片内Cache用的是SRAM。
下面说明80486用64位宽的数据总线构成的DRAM的运行步骤: 时钟周期1:CPU开始访问。 时钟周期2:存储器尚未准备好,增加一个等待状态。 时钟周期3:传送第一个字,发出80486“成组传送准备好”信号,开始下一页64位的访问。 时钟周期4:传送所存的存储器内容(也就是第2个字),发出成组传送准备就绪信号。 时钟周期5:传送第3个字(按页),发出成组传送准备就绪信号。 时钟周期6:传送第4个字(按页),发出成组传送准备就绪信号。
3.2.2 流水线和性能 一个微处理机系统对于给定的任务或指令集,在执行时其速度到底有多快是衡量系统性能的一个很重要标志。由于80486微处理机的执行速度和信息流量都大大增加,所以80486微处理机整体系统性能都得以很大提高。其中最重要的一点是得益于80486的指令流水线操作。 由于在80486微处理机系统内部,还存在着高速运行的80486 CPU以及CPU的总线周期与对CPU总线响应速度比较慢的设备之间的矛盾,所以80486整个系统所表现出来的性能总比80486所能提供的潜在的性能稍低一些。
3.2.3 流水线操作 设计80486时扩展了流水线技术,把主执行部件EU 的流水线扩至5个步骤, 即预取PF (PreFetch)、 两级译码D1和D2、 执行Ex (Execution) 和寄存器组的写回WB 。 在典型的RISC流水线中,仅仅锁住指令流动对流水线的影响并不严重,因为在某种情况下前面的步骤被锁住时,后续步骤可继续操作。
并不是80486微处理机的每条指令都要用到全部九个功能部件。当一条指令需要用到几个功能部件参于操作时,每个功能部件都以并行方式与其他功能部件一起,在指令执行的不同阶段实施并行操作。虽然每条指令都是按步骤顺序执行地,但在任何给定时间内,都会有若干条指令在处理机的不同阶段并行操作着,这种操作方式就叫做指令流水线。 像指令的预取、指令译码、微代码的执行、整数操作、浮点操作、分段操作、分页操作、Cache管理以及总线接口操作等,所有操作都是同时执行。
图3.5中展示出的是指令流水线中单条指令操作的各个步骤:它们分别是取指令步骤、译码步骤1、译码步骤2、执行步骤和把执行结果寄存器写回步骤。流水线中的每一操作步骤都要占用一个时钟周期时间。 80486 CPU流水线5个操作步骤 取 D1 D2 Ex WB 时钟
3.2.3.1 流水线操作步骤 1.预取步骤(prefetch stage) 在80486执行的5步骤流水线操作中,第一个操作步骤就是预取步骤。CPU总是从Cache内取出一个完整的Cache行,在一次16字节的Cache访问操作中,这个Cache行包括5条左右的指令。 具体操作就是先从Cache或片外存储器预取出一批指令代码。然后将其存放到由两个大小均为16个字节组成的预取缓冲部件的其中一个之内。指令译码部件一旦将上一次填入的指令代码用完,就要用新的一批指令代码填充预取缓冲部件,以备指令译码部件使用。 由于386或486体系结构决定的其指令长度是可变的,致使预取部件随着指令与指令之间的差异,在流水线各操作步骤中的状态也不尽相同。一般说来,预取部件操作与流水线中的其他一些操作步骤都是相互独立的。但是,出于对两级译码部件的支持,可以将预取缓冲部件中的内容读到两个独立的端口之上,每个端口都由指令译码部件单独给以控制。
2.D1步骤 流水线中的第二个操作步骤和第三个操作步骤均是译码操作步骤,分别称之为D1操作步骤和D2操作步骤。 所有操作码和生成的地址信息码都是先由D1操作步骤分解。当开始处理一条预取指令时,D1逻辑首先检查它的操作码,然后再确定指令属哪一类。例如,对一个简单的单周期指令,由D1步骤确定在以后的执行步骤中它进行什么操作。D1步骤还要找出微指令ROM内,存有第一个执行周期控制字的入口点,并检索出计算地址所需的信息且送给分段部件。
3.D2步骤 D2步骤把每一80486的宏指令扩展成算术和逻辑运算部件ALU的控制信号。对单周期宏指令,这只是几位操作码的功能。 在每个时钟周期内,它可以对1~4个字节的存储器位移字段进行译码。或者对1~4个字节的立即常数地址进行译码。 在D2步骤内,还要用译完码的位移量或立即常数,以并行方式计算出存储器地址。在第一个D2周期内,若有位移则译码,若有基址则把它加到基址寄存器上。若有变址,则在第二个D2周期进行变址计算。没有变址时,在一个D2步骤内即可完成地址的计算。据统计,大概仅有5%的指令需用两个D2步骤。
4.Ex步骤 第4个流水线操作步骤是指令的执行步骤。在这个操作步骤内,不仅包括有算术运算和逻辑运算,还包括有对Cache的访问操作以及对寄存器的修改等操作。一旦进入执行阶段,所有用户可见的变化都能实现。 在执行Ex步骤期间,整数部件IU中的算术逻辑运算部件ALU执行指令规定的计算。80486与传统的RISC流水线不同之处在于: 80486可以用几十个执行时钟周期执行一个复杂的宏指令,或者是处理复杂的数据结构。在这种情况下,总是用传统的微代码机控制算术和逻辑运算部件ALU。而在其他情况下,比如像存储器的装入和存储等操作,ALU总是处于空闲状态。
5.WB步骤 流水线中的第五个操作步骤是写回(Write Back)步骤,这个操作步骤允许最后修改寄存器操作与下一条指令的执行步骤重叠执行。 在写回操作步骤内,像LOAD、STORE以及寄存器与寄存器之间的操作等许多经常使用的指令,只用一个执行时钟周期即可完成其操作。
3.3 工作模式 80486微处理机完全可以做到与8086、80286、80386系列机在目标代码级上完全兼容。也就是说,为8086、80286、80386微处理机编写的软件不用修改即可以在80486微处理机上运行。 80486微处理机与80386微处理机一样,它也有两种操作方式: 一种是实模式(也就是实地址方式,简称实方式), 另一种就是保护模式(也就是通常所说的保护的虚拟地址模式,简称保护模式)。
3.3.1 实模式 当80486微处理机复位时,或者在加电时总是被初始化成实模式。这种操作模式与8086微处理机一样拥有同样的基本结构。 在这种模式下,其寻址机构最大寻址范围为1M字节,其中断处理又与80286的实模式下的中断处理一样。在这种操作方式下,几乎所有的80486微处理机的指令都可以使用。 80486之所以要采用实模式这种操作方式,是因为它还需要建立并使用保护模式这种操作方式。 在实模式下,80486微处理机就像是一个高速运行的8086微处理机。在建立微处理机保护模式操作时需要实模式。在实模式下还可以直接访问由存储管理部件的分页机构管理的页和给微处理机提供特权的能力。
3.3.2 保护摸式 保护模式也被称之为保护的虚拟地址方式。当各种应用程序在80486的保护模式下运行时,80486微处理机的各种能力都可以淋漓尽致地表现出来。 在保护模式下,分段部件不仅要完成逻辑地址向线性地址的转换,而且还要在总线周期内完成多种保护性的检查。在保护模式下,除了可以实施分段保护之外,还可以任意选用分页保护。 在保护模式下,由分页部件完成存储器管理的分页操作,它配备有一个转换旁视缓冲存储器TLB,用来存放近期使用的页目录和页表项。 80486微处理机的线性地址空间为4GB(4吉字节),而虚拟的存储空间可达64TB(64太字节)。目前所有的为8086、80286、80386编写的软件都可以在80486微处理机的保护模式下运行。 在保护模式下,其寻址机制比起在实模式下的寻址机制来显得更加完美,其技术也更加先进。
3.3.3 虚拟8086模式 虚拟8086模式只不过是80486微处理机保护模式下的一种子方式。 它的最突出的特点是,8086程序可以使用80486微处理机保护方式下的分段和分页保护机制运行。所以,这种操作方式比起在实模式下运行的8086程序来说,其灵活性表现的更加充分。 在保护模式下,软件可以把一项任务转换到指定的虚拟8086的模式下运行。每一项虚拟8086的任务就像8086任务一样,都可以由8086软件(像应用程序、整个8086操作系统)执行。
3.3.4 操作模式间的转换 1.向保护方式的转换 在向保护方式转换之前,必须建立一个系统数据结构最小集,并且把全局描述符描述符表GDT寄存器、中断描述符表IDT寄存器以及任务寄存器TR进行初始化处理。这些表一旦创建,系统软件就可以按步就班地转换成保护方式。 保护方式的进入是通过将控制寄存器CR0中的PE位置成1实现的。可以用MOV CR0这种指令达到将PE位置成1的目的。 进入保护方式之后,在段寄存器内继续保存着在实方式下的拥有的内容,软件将会重装所有段寄存器的内容。在保护方式下开始执行时的CPL的值为0。
2.转换回实地址方式 如果软件用MOV CR0这种指令将控制寄存器CR0中的PE位置成1,则Pentium微处理机就又再次进入实地址方式。再次进入实地址方式的过程如下: (1)如果允许分页,则执行几个操作步骤: (2)将控制转移到其段界限值是64K(即0FFFFH)的一个段,这次把段界限装入代码段寄存器需在实方式下,以确保全局描述符表和局部描述符表位于实地址存储器之内。 (3)用描述符内拥有下列适用于实方式下的值,装载堆栈段寄存器SS、数据段寄存器DS、附加数据段寄存器ES、FS和GS各寄存器。 (4)在禁止中断期间,禁止用CALL指令调用INTR中断,使用外部电路的NMI中断也属于被禁止之列。 (5)将控制寄存器CR0中的PE位清0 (6)刷新指令队列,并且将一适当的访问权限值放入代码段寄存器。 (7)用LIDT指令装载实方式下的中断向量表的基地址和段界限。 (8)允许中断 (9)用实方式所需的代码装载段寄存器。
3.4 存储管理 80486微处理机是一种全32位体系结构微处理机,其内不仅配备有一个片内存储管理部件,一个数值协同处理部件,而且还配备了一个规模为8K字节的高速缓冲存储器 Cache。80486不仅拥有80386的全部32位微处理机的特征,更重要的是它的性能在 80386的基础上得以全面地、大幅度地提高。80486的片内存储管理部件MMU与 80386的存储管理部件完全兼容。
3.4.1 分段存储管理 分段存储管理方式是建立在可靠性和性能的基础之上一项管理技术。 3.4.1 分段存储管理 分段存储管理方式是建立在可靠性和性能的基础之上一项管理技术。 在80486微处理机系统内,系统给出的地址以及程序给定的地址都是逻辑地址。而逻辑地址又是由用来指示这个段的一个16位的段选择符和一个能直入这个段的32位的偏移量组成。 在分段部件内,通过把这个32位的偏移量与这个段的基地址相加,就是将逻辑地址转换成了一个线性地址,段的基地址可从这个段的段描述符中得到。 其实,段描述符是保存在存储器中的一种数据结构,其内不仅包括有段地址,而且还可以提供诸如像段的大小规模、段在存储器中的位置以及访问这个段的控制信息等。而段描述符又是保存在段描述表中的信息。 而段描述符表又被进一步分成两个表, 一个叫全局描述符表GDT, 另一个叫局部描述符表LDT。 全局描述符表是供系统中所有程序使用的,而局部描述符表则是供各自独立运行的程序使用的。。
在80486微处理机的各种段寄存器内不仅保存着要访问的存储器内各种段的类型,比如说要访问的是代码段、数据段还是堆栈段等。而且在段寄存器内还保存着目前正在使用的段的选择符。若欲访问其他各种段,首先要用传送指令MOV装欲被访问段的段寄存器。 在80486微处理机内同时可以使用: 四个数据段,一个是数据段,另三个则是附加数据段。 再加一个代码段和一个堆段,所以80486微处理机总共配备有6个段寄存器。
图3.9 由TI位选择的描述符表 Ti RPL 段界 基地址 访问控制 全局描述符表 局部描述符表 Ti=0 Ti=1 段选择符 全局描述符表 局部描述符表 Ti=0 Ti=1 段选择符 15 2 1 0
段选择符内有一个13位的索引字段,如图3. 9所示。根据它的内容被索引进全局描述符表GDT或局部描述符表LDT。 而基地址既可以是来自全局描述符表寄存器GDTR,也可以是来自局部描述表寄存器LDTR。在这两种寄存器中保存着描述符表的开始的线性地址。图3.9中示出了怎样用段选择符中的Ti位说明使用的是全局描述符表还是局部描述符表。
逻辑地址经段转换后所形成的地址就是线性地址,如图3.10所示。 若没有使用分页机构,这时的线性地址就是物理地址。如果使用了分页机构,二级地址转换机构(即分页机构)所生成地址就是物理地址。
图3.10 段的转换 48位逻辑地址 15 0 31 0 16位段选择符 32位的偏移量 描述符表 段描述符 32位基地址 图3.10 段的转换 16位段选择符 32位的偏移量 段描述符 页目录 页表 偏移量 48位逻辑地址 15 0 31 0 描述符表 32位基地址 32位线性地址 31 22 21 12 11 0
每个段都是一个独立的地址空间。虽然这些段在物理存储器中可以是相邻的存储器模块,但分段机构能阻止越段进行访问。在每次存储器读/写操作时,都要对使用段的段界限进行检验。任何一种欲对超出段界限的存储器访问操作都会产生一个一般保护异常事故。 分段机构要求在段描述符中一定要把段的地址范围说清楚,给每一个段指定各自独立的地址空间是操作系统的义务和责任。 通常,可以把80486的程序分成许多个段,且一个程序至少也要有一个代码段和一个数据段。因为代码段不能被修改,数据段不能执行,所以能很容易检测出程序中一般类型的错误。因段是有界的,越界去访问代码或数据都是被禁止的行为。
3.4.1.1 段寄存器 对每一种存储器段的访问都要涉及到一个段寄存器。在每次访问代码、段数据段或堆栈段时,都要用段寄存器的内容来说明使用的是哪一个段。在程序执行期间,通过把它们的段选择符装到段寄存器内,可以使用更多的段。 每一个段寄存器又是由两部分组成,一部分为可见部分,另一部分为不可见部分。 对段寄存器的可见部分来说,可用传送指令MOV装入,而不可见部分只能由处理机装入,用户是不能也不可能进行干预操作的。
3.4.1.2 段选择符 段选择符指示着段的描述符,在段描述符中包含有定义段所用的全部信息。其实,一个程序可以拥有比6个段寄存器指示的段还要多的段。若某个程序使用的段多于6个,当程序需要去访问一个新段时就要使用传送类指令MOV,去改变这些寄存器中的内容。 由段选择符(Segment Selector)识别段描述符(Segment Descriptor),而段描述符在段描述符表内被逐一登记造册,对应用程序来说,段选择符作为一个指针变量的一个组成部分是可见的。但段选择符的值通常是由连接编辑程序(Link Editor)或连接装配程序 (Linking Loader)指定或修改的,而不是由应用程序指定,更不能由应用程序对其实施修改操作。
图3.12中展示出了段选择符的格式。从图中可以看出,段选择符是由16位信息组成的,这16位信息又被进一步细分成三个字段。这三个字段分别是13位的索引字段,一位的指示符字段以及两位的请求特权级字段。 注:1.位2 (TI)字段是指示符字段 当TI=0 指向全局描述符表 TI=1 指向局部描述符表 2.位1位0(RPL)请求特权级字段, 其中 00 表示最高特权级 11 表示最低特权级 索引字段 TI RPL 15 3 2 1
段描述符,说到底是位于存储器内的一种数据结构,段描述符内保存着供微处理机使用的有关段的大小规模、段在存储器中的位置以及控制和状态信息。 3.4.1.3 段描述符 段描述符,说到底是位于存储器内的一种数据结构,段描述符内保存着供微处理机使用的有关段的大小规模、段在存储器中的位置以及控制和状态信息。 各段描述符都是由各种编译程序、各种连接程序、各种装入程序,或者是操作系统产生的而不是由各应用程序生成的。 图3.13中展示出了通常使用的描述符格式。 添加
(只在代码段描述符中识别:0=16位的段 1=32位的段) 符号说明:1. AVL 通过系统软件可以使用 2. DPL 描述符特权级 3. S 描述符类型 (0=系统用,1=应用程序) 4. G 粒位 5. P 段存在位 6. O 缺省操作大小规模 (只在代码段描述符中识别:0=16位的段 1=32位的段) V L 段描述符 A D P G S 基地址 31:24 23:16 基地址15:00 段界限 15:00 段界限 19:16 类 型 31 24 23 22 16 21 20 19 15 14 13 12 11 8 7
1.基址字段 80486微处理机用这个字段来规定某一个段在4GB物理地址空间中的位置。从图中可以看出,基址字段又是用基地址15~0、基地址23~16和基地址31~24这三个互相独立的部分表示的。 80486微处理机是把这三个基地址字段按序组合在一起,从而形成一个惟一的32位的值,来表示这个段的基地址。 另外,段的基地址值应该与16字节的边界对准,通过对准16字节代码段或数据段的边界可使程序最大限度地发挥其性能。
2.粒位(Granularity Bit)G字段 是用来解释段的界限所用长度单位大小的一个字段。且以4096倍数为段界定标。 若这一位被清成0,则段的界限以一个字节为单位进行说明。 若这一位被置成1,段的界限则以4K字节(即一个页)为单位给以说明。 若使用了定标就不再测试最低12位地址。例如,若段的界限值是0,但由于粒位字段被置成1,就形成从0至4095这么大范围的有效偏移量。值得说明的是,只有段的界限字段会受影响,而段的基地址仍然是以字节为单位说明。
3.段界限字段 段描述符中的这个字段是用来定义段的大小规模的。从图3.13中可以看出,段界限是用段界限15~0和段界限19~16两部分表示的。但80486微处理机在用到段界限时,是把这两部分段界限组合在一起,从而形成了一个20位的段界限值。80486微处理机用下述两种方法中的一种来解释段界限,这要根据粒位字段的设置情况而定。 (1)如果粒位字段被清成0,段界限字段值的范围可以是从1个字节到1M字节(因为段界限为20位,220=1048576)范围。 (2)如果粒位字段被置成1,段界限字段的值可以是从4KB到4GB这么大范围。段界限字段的值在4K字节的基础上每次可增值4K字节。
4.S位字段 由这一位来确定给定的段是一个系统段呢? 还是一个代码段或一个数据段? 如果S位被置成1,这时这个段不是代码段就是数据段。 如果S位被清成0,那么这个段就一定是一个系统段。 5.D位字段 这个D位字段只能在代码段描述符中使用。是用来指示代码段中的缺席的操作数的长度和有效地址长度的。 若代码段中描述符中的D位被置成1 则说明采用的是32位操作数和32位的有效地址这种寻址方式。 如果D位被清成0,则说明使用的是16位的操作数,采用的是16位寻址方式。
6.类型字段 对这个字段的解释要根据是应用程序段的描述符?还是系统段的段描述符分别给以不同解释。系统段的段描述符格式与这里的段描述符的格式稍有不同。 存储器描述符中的类型字段还要说明被访问段的种类以及增大的方向,表3.3中列出了在存储器描述符中说明的被访问的应用程序段的类型。
7.描述符特权级DPL字段 用这个字段来定义特权级。借助于保护机构用这个字段定义的特权级去控制对这个段的访问。 8.段存在位P字段 当一个段描述符的选择符装到段寄存器时,若段存在位被清成0,此时80486微处理机就会产生一个段不存在的异常事故。也就是说,可以用这个段存在位字段去检测要访问的段中的哪一个段是不能用。
3.4.1.4 段描述符表 段描述符表就是段描述符的一个阵列。其实,段描述符表一共两类,它们分别是: (1)全局描述符表GDT。 (2)局部描述符表LDT。 全局描述符表GDT是供所有任务使用的描述符表,而局部描述符表LDT是为每一项任务运行时使用的描述符表。 段描述符表实际上是段描述符的一个阵列,如图3.15所示。描述符表在长度上是可变的,最多可容纳8192(213)个描述符。80486微处理机并不使用全局描述符表GDT中的第一个描述符,因为它是一个“空描述符”(Null Descriptor)。当把这个空描述符的段选择符装到段寄存器时也不产生异常事故。但当试图去访问用这个描述符定义的存储器空间时,那就必定会产生一个异常事故。通过用这个段选择符对段寄存器的初始化处理,即使偶而一次访问未被使用的段寄存器,也要产生一个异常事故。
图3.15 描述符表 全局描述符表 局部描述符表 +38 +30 +28 +20 +18 +10 + 8 + 0 第一个不用 界限 图3.15 描述符表 +38 +30 +28 +20 +18 +10 + 8 + 0 第一个不用 界限 访问控制 界限 基地址 全局描述符表 局部描述符表
3.4.2 分页存储管理 80486微处理机配备有32位内部和外部地址总线,具有32位的寻址能力。所以,物理存储器的最大容量达4GB。 物理存储器又被均分成大小为4KB的页,这些页以4KB地址为界按顺序排列。因此,可以把物理存储器想象成是由物理上的零地址开始的页阵列。无论如何,这些页也不会与应用程序结构建立起联系。 通常,把实际存储器的页叫做物理页,或叫做页框。 例如,若PC机的物理存储容量为2MB,那它就会有512个物理页。分配给程序的页叫虚拟页。当虚拟和物理存储标量均为4GB时,虚拟和物理页的最大数量均为1048576个。
图3.18示出详细的页转换过程。 从图中可以看出,20位的虚拟页号由两个10位字段构成。 其中一个是10位的页目录索引, 另一个是10位的页表索引。而由虚拟存储系统负责管理一个页目录和多个页表。页目录和页表的大小容量均为4KB,而每一个页目录和页表都是由1024个32位的项组成。而页目录中的每一项都有一个页表的物理地址。同时,页表中的每一项也都有一个物理页的地址。所以,页转换逻辑用页目录索引获得页表地址,而用页表索引去查寻物理页的地址。
图3.18 页转换过程逻辑 页转换 32位线性地址 31 22 21 12 11 0 页目录 页表 偏移量 ┇ 页表项 31 12 11 0 图3.18 页转换过程逻辑 页目录 页表 偏移量 ┇ 页目录项 页表项 物理页框地址 偏移量 页转换 32位线性地址 31 22 21 12 11 0 31 12 11 0 32位物理地址 页表 页目录
分页机构把32位的线性地址分成三个部分, 其中高端两个10位字段是进入页表的索引,而剩下的那个12位的字段,则是经页表进入页的地址,由于不管是线性地址空间内的虚拟页,还是实际存储器中的物理页,都要与4KB的页边界对准,所以,这个32位线性地址中的最低12位地址就不必再进行修正便可直接使用。 不论分页部件允许分页还是不允许分页,都是将这12位地址直接传送给分页硬件。另外,由分段部件分的段可以从任何一个字节地址开始,而分页部件则不能从任何一个字节地址开始分页,这也是分段与分页不一样的地方。
分页和分段是不一样的,页是大小固定的空间比较小的存储单位,像80486微处理机就把页规定成4KB。在存储器页内保存的通常是大小一样的数据结构。如果仅使用了分段这种地址转换形式,这时在物理存储器中的数据结构的各个部分就都驻留在存储器内。如果使用了分页机构,此时的数据结构就可以是部分驻留在存储器内,部分驻留在磁盘上。
1.允许分页位 如前所述,80486微处理机的控制寄存器CRO的位31——PG位是允许分页控制位,若将位31置成1,则表示分页机构允许分页。 这一位通常是在软件初始化阶段由操作系统给以设置。如果在虚拟8086模式下,操作系统进行了两个以上的程序,就必须将允许分页位31置成1。或者若使用了请求分页的虚拟存储器,也同样必须将允许分页位31置成1。 如果允许分页,就用地址转换的第二步骤将线性地址转换成物理地址。如果不允许分页,此时就把这个线性地址当成物理地址使用。
2.线性地址 而图3.28中所展示出的是80486微处理机怎样用两级页表,将线性地址字段中的页目录索引字段、页表索引字段以及偏移量字段转换成物理地址的。 操作数 页目录项 页表项 页目录索引 页表索引 偏移量 32位线性地址 31 22 21 12 11 0 页表 页框 页目录
3.页表 所谓页表实际上是由若干32位的页表项组成的一个阵列。 页表本身就是一个页,其规模大小也是一个由4096个字节组成的存储空间,所以其内最多可保存1K个32位的页表项。不论是页表所占用的页,页目录所占用的页,还是其他所有各类页,都要与4K字节的页边界对准。
4.页表项 两级页表中,虽页表项的内容不同,但页表项的格式却是一样的(页目录内缺少脏位这种情况除外)。 图3.22中示出了页表项的格式。页目录中的脏位D (Dirty)位保留供将来用。现将页表项中各字段意义分述如下。
4.页表项 两级页表中,虽页表项的内容不同,但页表项的格式却是一样的(页目录内缺少脏位这种情况除外)。图3.22中示出了页表项的格式。页目录中的脏位D (Dirty)位保留供将来用。 系统设计人员可用 保留 脏位 被访问位 页Cache控制 页透明写 用户/管理程序位 读/写位 存在位 P R/W U/S PWT PCD A D AVAIL 页框地址31…12 1 2 3 4 5 6 7 8 9 11 31 12 系统设计人员可用 保留 脏位 被访问位 页Cache控制 页透明写 用户/管理程序位 读/写位 存在位 P R/W U/S PWT PCD A D AVAIL 页框地址31…12 1 2 3 4 5 6 7 8 9 11 31 12
(1)页框地址:所谓页框地址,实际上就是一个页的基地址。在一个页表项内,从位31~位12这高端20位就是用来说明一个页框地址的,而从位11~位0这低端12位,是用来说明页的控制和状态的。 (2)存在位(页表项中位0):页表项中的存在位P,是用来说明页表项中的页框地址是不是已映射到物理存储器中的一个页内。 (3)被访问位和脏位(页表项中的位5和位6):由这两位提供两级页表内有关页的使用情况。被访问位常被用来报告对一个页或二级页表进行读或写操作时情况,而脏位常被用来报告对某一页的写操作情况。
(4)读/写位和用户/管理程序位(页表项中的位1和位2):页表项中的读/写位(位1)和用户/管理程序位(位2)是用来对页进行保护校验的,当在进行地址转换而微处理机又执行其他操作时,就必须进行保护校验。 (5)页级Cache控制位: 页表项中的位3—页透明写PWT、 位4——页Cache禁止PCD, 这两位都是用来对页级Cache实施管理的位。软件使用这两位就可以对各个页的高速缓冲处理或二级页表的高速缓冲处理进行控制。