n3wFake3

计算机组成原理(02318) 第四章 中央处理器

课程内容

  1. 程序执行概述
  2. 数据通路基本结构和定时
  3. 数据通路基本工作原理
  4. 流水线方式下指令的执行
  5. 控制器设计基本原理
  6. 指令流水线中的冒险处理
  7. 高级流水线基本原理
  8. 异常和中断

考核知识点及考核要求

  1. 程序执行概述
  • 指令周期, 数据通路, 控制部件, 指令寄存器, 程序计数器(指令指针寄存器), 指令译码器, 总线接口部件, 存储器数据寄存器(MDR), 存储器地址寄存器(MAR), 脉冲源, 时钟脉冲
  • 程序与指令之间的关系, 指令执行过程, 指令执行过程中的异常和中断事件
  1. 数据通路基本结构和定时
  • 功能部件(执行部件), 操作元件, 状态元件, 时钟信号, 时钟周期, 节拍
  • 数据通路基本功能部件, 数据通路中功能不见如何互连及定时, 基本操作元件有什么, 基本状态元件有什么, 基本状态元件D触发器的定时
  1. 数据通路基本工作原理
  • 指令和控制信号的关系, 控制信号与数据通路的关系, CPU如何控制存储器操作, 单总线数据通路的基本结构和基本工作原理, 单周期数据通路的基本结构和基本工作原理
  1. 流水线方式下指令的执行
  • 指令流水线, 流水段(功能段), 流水线数据通路, 流水段寄存器
  • 如何将指令执行过程划分成流水段, 理想流水线处理器的CPU为1, 流水线方式下程序执行比单周期方式快, RISC风格指令集更适合流水线方式
  • 对于具体情况能够进行指令流水段的合理划分, 能够计算流水线方式下指令吞吐率
  1. 控制器设计基本原理
  • 控制器, 控制信号, 硬连线控制器, 微程序控制器, 微程序, 微指令, 微命令
  • 硬连线控制器的设计过程和基本特点, 微程序控制器的基本原理和基本特点
  1. 指令流水线中的冒险处理
  • 流水线停顿(阻塞), 流水线冒险, 结构冒险(硬件资源冲突), 数据冒险, 数据相关, 转发(旁路), Load-use数据冒险, 控制冒险, 分支冒险
  1. 高级流水线基本原理
  • 指令级并行, 超流水线, IPC, 静态多发射, VLIW处理器, 动态多发射, 超标量, 动态流水线调度, 乱序执行
  1. 异常和中断
  • 内部异常, 外部中断, 异常处理程序, 中断服务程序, 故障, 陷阱, 终止
  • 内部异常的分类, 外部中断的分类, 内部异常和外部中断的不同点和相同点, 发现异常后硬件的响应过程

重点难点

  • 程序与指令的关系, 指令执行过程, 异常和中断的基本概念, 数据通路的功能和基本结构, 数据通路的定时, 指令流水线的基本概念, 控制器的功能和设计过程
  • 数据通路的定时, 指令流水线, 控制器的设计过程, 指令流水线中的冒险处理, 高级流水线基本原理

序言

  • 计算机所有功能都通过执行程序完成, 程序代码部分由指令序列构成.
  • 现代计算机最突出的特点之一就是采用 存储程序 的工作方式, 所以能自动读取指令并执行
  • 数据通路在控制器产生的控制信号控制下完成特定指令功能
  • 数据通路和控制器时CPU最基本的部件

4.1 程序执行概述

4.1.1 程序及指令的执行过程

  • CPU取出一条指令并执行的时间称为 指令周期, 不同指令的指令周期可能不同
某程序循环代码段P:
    for (i=0;i<N;i++){
        sum+=A[i];
    }
假定在MIPS系统中编译时, 变量sum和i分别分配在通用寄存器$17和$18中, 常量N存放在$22中, 数组A首地址存放在$19中,对应MIPS指令序列如下

行号  存储地址      机器码                汇编表示
1    08048100:    0012A080    loop:    sll    $20,$18,2    # 含义: 在存储地址0x08048100开始的4个字节中存放着00H/12H/A0H/80H四个字节, 这32位0/1序列是汇编指令 "sll $20,$18,2"的机器码
2    08048104:    0293A020             add    $20,$20,$19
3    08048108:    8E950000             lw     $21,0($20)
4    0804810C:    02358820             add    $17,$17,$21
5    08048110:    22520001             addi   $18,$18,1
6    08048114:    1656FFFA             bne    $18,$22,loop

MIPS采用定长指令字格式, 每条指令都是32位,且要求按字边界对齐存放(以上每条指令长度都是4字节,相邻指令地址相差都是4,每条指令地址都是4的倍数)

指令 sll $20,$18,2的机器代码展开后如下
31--26 25-21 20-16 15-11 10-6  5-0
000000 00000 10010 10100 00010 000000
OP     rs    rt    rd    shamt funct

其中, 31-26位(高6位)为OP字段, 当OP=000000时说明为R-型格式指令
R-型格式指令, 具体运算类型由5-0位(低6位)的funct字段确定, 当funct=000000时说明是左移指令sll,
左移的源操作数寄存器由rt字段给出, 目的寄存器由rd字段给出, 移位位数由shamt给出

此指令的执行顺序是
    1-6行指令顺序执行
    第6行的bne指令将对通用寄存器$18和$22内容进行比较, 不等则跳转到loop处第一条指令执行,否则执行第6行后的指令
  • CPU能完成指令序列执行, 必须解决以下问题

    • 如何判定每条指令长度
    • 如何确定每条指令的操作类型
    • 如何确定哪些位是寄存器编号, 移位位数或立即数
    • 如何确定操作数是在寄存器中还是在存储器中
  • CPU执行一条指令分为以下步骤(取指令/指令译码/计算源操作数地址并取操作数/执行数据操作/计算目的操作数地址并存结果/计算下条指令地址)

  • 指令执行过程

    • 取指令 : 即将执行的指令地址总是在 程序计数器(PC) 中, 取指令的操作就是从PC所指出的存储单元中取出指令送到 指令寄存器(IR) 中. (根据地址取机器码)
    • 对指令译码 : 不同指令有不同功能, 所以需要不同的操作控制信号, CPU根据不同指令操作码译出不同的控制信号. (对高6位译码判断是什么格式指令, 再根据该格式指令对不同位进行译码, 得到相应控制信号)
    • 计算源操作数地址并取操作数 :
      • 若操作数是寄存器中的数据则从寄存器取数后转到下一步数据操作. (根据控制信号取到相应的数据送到数据操作)
      • 若是存储器操作数, 则需要访问存储器. 访存前需根据寻址方式确定源操作数地址计算方式. (根据操作码字段译码后是访存指令, 其源操作数就是存储器数据, 在取数前先要计算存储单元地址, 然后根据该地址读取源操作数)
      • 当源操作数所寻址方式为间接寻址, 或两个源操作数都在存储器时, 需要多次访存
    • 数据操作 : 在 ALU或加法器 等运算部件对取出的源操作数进行运算. 对于非运算类指令, 则没有这一步操作
    • 目的操作数地址计算并存结果 :
      • 若运算结果要被储存到存储单元中, 则需要一次或多次访存(间接寻址时)
      • 若运算结果要被存到寄存器, 则在进行数据操作时直接存结果到寄存器
      • 若是串操作或向量运算指令, 则可能会并行执行或循环执行第3-第5步多次
    • 指令地址计算并将其送PC : 顺序执行时, 下条指令的地址计算比较简单, 只要将PC加上当前指令长度即可. (定长指令字)

4.1.2 CPU的基本功能和基本组成

  • CPU的基本职能就是周而复始地执行指令(控制器控制执行)
  • CPU最基本的部件
    • 数据通路(datapath)
    • 控制部件(control unit) : 根据指令功能的不同生成对 数据同居 的控制信号, 并正确控制指令的执行流程
    • 随着超大规模集成电路技术发展, 更多功能逻辑被集成到CPU芯片中
      • cache
      • MMU
      • 浮点运算逻辑
      • 异常和中断处理逻辑
      • 甚至在CPU芯片中集成多个处理器核 CPU基本组成原理图
  • 上图中的 地址线/控制线/数据线 并不属于CPU, 构成系统总线的这三组线主要用来使CPU与CPU外部部件(主要是主存)交换信息, 交换的信息包括
    • 地址(通过地址线传送)
    • 数据(通过数据线传送) : 包含指令, 即数据和指令都看成是数据, 因为对总线和存储器来说, 指令和数据在形式上没有区别, 且数据和指令的访存过程完全一样
    • 控制(通过控制线传送)
  • 除了地址和数据(包括指令)以外的所有信息都属于控制信息
  • 地址线是单向的, 由CPU送出, 用于指定需要访问的指令或数据所在的存储单元地址
  • 上图所示的 数据通路(datapath) 非常简单, 只包括了最基本的 执行部件(ALU,通用寄存器和状态寄存器), 其余都是控制逻辑或其密切相关的逻辑, 主要包括
    1. 程序计数器(PC) : 又称 指令计数器/指令指针寄存器(IP), 用于存放即将执行指令的地址, 取指令时总是先把PC内容送到地址线. 正常情况下指令地址形成有两种方式
      • 顺序执行时, PC+1形成下条指令地址(这里的1指的是一条指令的字节数). 有的机器中PC本身具有+1计数功能, 也有的机器借用运算部件完成PC+1
      • 需要改变程序执行顺序时, 通常根据转移类指令提供的信息生成转移目标指令地址, 并将其作为下条指令地址送PC.
      • // 每个程序开始执行前, 都把程序第一条指令地址送到PC中
    2. 指令寄存器(IR) : 存放现行指令. 指令取出后存放在指令寄存器以便送指令译码器进行译码
    3. 指令译码器(ID) : 对指令寄存器中操作码部分进行分析解释, 产生相应译码信号提供给操作控制信号形成不见, 以产生控制信号
    4. 启停控制逻辑 : 脉冲源会产生一定频率的脉冲信号作为整个机器的时钟脉冲, 是 CPU时序的基准信号.
      • 启停控制逻辑在需要时能保证可靠地开放或封锁时钟脉冲, 控制时序信号地发生与停止, 并实现对机器地启动与停机
    5. 时序信号产生部件 : 以时钟脉冲为基础, 产生不同指令对应的 周期/节拍/工作脉冲时序信号, 实现机器指令执行过程的时序控制
    6. 操作控制信号形成部件 : 该部件综合时序信号/指令译码信号和执行部件反馈的条件标志(CF,SF,ZF,OF)等, 形成不同指令的操作所需的控制信号
    7. 总线控制逻辑 : 实现对总线传输的控制.
      • 包括对数据和地址信息的缓冲和控制, 其中包括用于缓存数据信息的存储器寄存器MDR和用来缓存地址信息的存储器地址寄存器MAR.
      • CPU对存储器的访问通过总线进行, CPU将存储访问命令(读写控制信号)送到控制线, 将要访问的存储单元地址送到地址线, 并通过数据线取指令或者与存储器交换数据信息
    8. 中断机构 : 实现对异常情况和外部中断请求的处理

4.1.3 打断程序正常执行的事件

  • 从开机后CPU被加电开始到断电为止, CPU自始至终就一直重复做一件事 : 读出PC所指存储单元的指令并执行.
    • 每条指令的执行都会改变PC中的值, 所以CPU能够不断地执行新的指令
  • 正常情况下CPU按部就班按照程序规定的顺序一条条指令执行或者按顺序执行或者跳转到转移类指令设定的转移目标指令执行, 这几种情况都属于正常执行顺序
  • CPU遇到以下特殊情况会无法继续执行当前程序
    • 对指令操作码进行译码时, 发现是不存在的"非法操作码", 因此CPU不知道如何执行当前指令而无法继续执行下去
    • 访问指令或数据时发现读取的指令和数据不在主存中, 因此CPU无法继续执行当前指令
    • 在ALU中运算结果发生溢出, 或者整数除法指令的除数为0, 因此CPU发现运算结果不正确而无法继续执行程序
    • 执行过程中, CPU外部发生了采样计时时间到/网络数据包到达网络适配器/磁盘完成数据读写等外部事件, 要求CPU中止当前程序的执行, 转去执行专门的外部事件处理程序
  • CPU除了能正常执行指令外, 还必须具备程序正常执行被打断时的处理机制, 该机制被称为 异常控制/中断机制.
    • CPU中相应的异常和中断处理逻辑称为 中断机构
  • 计算机中很多事件的发生都会中断当前程序的正常执行, 使CPU转到操作系统中预先设定的与所发生事件相关的处理程序执行;
    • 有些事件处理完后可回到被中断的程序继续执行, 此时相当于执行了一次过程调用
    • 有些事件处理完后则不能回到被中断的程序继续执行
  • 打断程序正常执行的事件分成两大类
    • 异常(Exception) : 由CPU内部异常引起的意外事件. 分为 硬故障中断程序性异常.
      • 硬故障中断 : 由于硬连线路出现异常引起(电源掉电,校验线路错误)
      • 程序性异常 : CPU执行某条执行引起的发生在CPU内部的异常事件(除数为0,溢出,断点,单步跟踪,寻址错误,访问超市,非法操作码,栈溢出,缺页,地址越界(段错误))
    • 中断(Interrupt) : 程序执行过程中, 若外设完成任务或发生某些特殊事件
      • (采样计时时间到, 打印机缺纸,从网络中接受到一个信息包,从磁盘读入一块数据等), 设备控制器会向CPU发中断请求, 要求CPU对这些情况处理
      • 每条指令执行完后,CPU都会主动去查询有无中断请求, 有的话则将下条指令作为 断点 保存, 然后转到用来处理相应中断事件的 中断服务程序 执行, 结束后回到断点继续执行
      • 这类事件与执行的指令无关, 由CPU外部的IO硬件发出, 称为 外部中断(Interrupt), 需要通过外部中断请求线向CPU请求

4.2 数据通路基本结构和定时

  • 机器指令的执行是在数据通路中完成的, 通常将指令执行过程干红数据所经路径包括路径上的部件称为 : “数据通路”
    • ALU/通用寄存器/状态寄存器/浮点运算逻辑/异常和中断处理逻辑等都是指令执行过程中数据流经的部件, 都属于数据通路一部分
  • 数据通路中专门进行数据运算的部件称为 执行部件(execution unit)/功能部件(function unit), 数据通路由控制部件发出的控制信号进行控制

4.2.1 数据通路基本结构

  • 指令执行所用元件有
    • 组合逻辑元件(操作元件)
    • 时序逻辑元件(状态元件/存储元件)
  • 连接上述元件的方式
    • 总线方式
    • 分散连接方式
  • 数据通路是由 组合逻辑元件和时序逻辑元件通过总线/分散方式连接而成的进行数据存储/处理/传送的路径
  1. 组合逻辑元件
  • 组合逻辑元件的输出只取决于当前的输入. (输入一样则输出也一样)
  • 组合电路的定时不受时钟信号控制, 所有输入信号到达后经过一定的逻辑门延迟,输出端的值被改变,并一致保持其值不变,直到输入信号改变.
  • 常用的组合逻辑元件(虚线表示控制信号)
    • 多路选择器(MUX) : 需要控制信号 Select 确定选择哪个输入被输出
    • 加法器(Adder) : 不需要 控制信号控制, 因为它的操作是确定的
    • 算术逻辑部件(ALU) : 需有 操作控制信号OP, 由它确定ALU进行什么操作
    • 译码器(Decoder) : 通过对 指令操作码 译码, 输出译码后得到控制信号 “out0/out1/out2…/out7”, 无需控制信号进行控制
  • 数据通路中常用的组合逻辑元件
  1. 时序逻辑元件
  • 时序逻辑元件即 状态元件, 具有 存储功能, 输入状态在 时钟控制 下被写入到电路中并保持电路的输出值不变, 直到下一个时钟送达.
    • 输入端状态由时钟决定何时被写入, 输出端状态随时可读出.
  • 最简单的状态单元是 D触发器, 有时钟输入Clk,状态输入端D和状态输出端Q
    • D触发器采用 时钟下降沿(负跳变)触发, 要使输出状态能正确随着输入状态改变, 必须满足以下时间约束
      1. 在时钟下降沿到来前的一定时间内输入端D的状态必须稳定有效, 这段时间被称为 建立时间(Setup Time)
      2. 在时钟下降沿到来后的一定时间内输入端D的状态必须继续保持稳定不变, 这段时间被称为 保持时间(Hold Time)
    • 满足上述约束条情况下, 经过时钟下降沿到来后的一段 延迟时间, 输出端Q的状态改变为输入端D的状态并一直保持不变直到下个时钟到来.
  • 通常将触发边沿开始到输出端Q的状态该百年为止的时间称为 Clock-To-Q时间, 也称为触发器的 锁存延迟(Latch Prop), 这段时间 永远小于 保持时间
  • 数据通路中的寄存器是一种典型的 状态存储元件, 由n个D触发器可构成一个n位寄存器
  • 根据功能和实现方式不同, 有不同类型的寄存器
  • D触发器定时示意图

4.2.2 数据通路的时序控制

  • 指令执行过程的每个步骤都有先后顺序, 计算机要正确执行指令CPU必须按正确时序产生操作控制信号
    • 由于不同指令对应操作序列长短不一, 序列中各操作的执行时间也不同, 所以需要考虑用怎样的时序方式来控制
  1. 早期计算机的定时方式
  • 通常采用 机器周期/节拍和脉冲 三级时序对数据通路操作进行定时控制
    • 一个 指令周期 分为 取指令/读操作数/执行并写结果 等多个基本工作周期, 这些基本工作周期称为 机器周期
    • 因此一个指令周期由多个机器周期组成, 机器周期类型通常有 取指令/存储器读/存储器写/中断响应
  • 存储器读机器周期或存储器写机器周期需要访问存储器, 所以这两种机器周期通常比CPU的操作时间(寄存器传送/ALU运算等)长得多
  • 机器周期得宽度通常以主存工作周期为基础来确定
  • 一个机器周期内要进行多步动作
    • 存储器读周期 : 发送地址, 发送读命令, 检测数据有无准备好, 取数据等
  • 有必要将一个机器周期划分成若干节拍, 每个动作在一个节拍内完成
  • 为了产生操作控制信号并使某些操作能在一个节拍时间内配合工作, 常在一个节拍内再设置一个或多个工作脉冲
  1. 现代计算机的定时方式
  • 现代计算机不再采用三级时序系统, 机器周期的概念也不再使用.
  • 整个数据通路中的定时信号就是 时钟信号, 一个 时钟周期 就是一个 节拍, CPU主频就是时钟信号的频率.
  • 数据通路和时钟周期
  • 只有状态元件能存储信息, 所有操作原件都须从状态元件接受输入并将输出写入状态元件中
  • 所有状态元件在同一时钟信号下控制下写入信息
  • 假定使用下降沿触发方式, 则所有状态元在时钟下降沿到来时开始写入信息, 经过触发器的锁存延迟(Clk-to-Q时间)后输出开始有效
  • 假定每个时钟下降沿是一个时钟周期的开始时刻, 则一个时钟周期内整个处理过程如下
    • 经过Clk-to-Q时间, 前一个时钟周期内生成的信号被写入状态元件并输出到随后的操作元件进行处理,
    • 经过若干级门延迟, 得到的处理结果被送到下一级状态元件的输入端, 稳定一段时间(建立时间)才能开始下个时钟周期
    • 并在新的时钟信号到达后还要保持一段时间(保持时间)
  • 假定所有各级操作原减中最长延迟时间为 Longest Delay, 考虑 时钟偏移(Clock Skew), 根据上述分析可知, 数据通路时钟周期为:
  • Cycle Time = Clk-to-Q时间 + Longest Delay + 建立时间 + 时钟偏移

4.3 数据通路基本工作原理

4.3.1 总线结构数据通路(大致略过,P117页开始)

  • 现代奉若依曼结构通用计算机的原型是ISA计算机.
    • 数据通路主要包含累加器AC,乘商寄存器MQ,指令寄存器IR,程序计数器PC
    • 采用累加器型指令系统, 数据通路简单, 部件之间用 分散连接方式(通过专用的连接线互连), 也可用总线方式连接
  1. 通用寄存器之间传送数据
  2. 完成算术或逻辑运算
  3. 从内存单元读取一个字
  4. 把一个字写入内存单元

4.3.2 单周期数据通路

  • 最简单的非总线结构处理器是单周期处理器
    • 指所有指令的指令周期都为一个时钟周期, 单周期数据通路即是单周期处理器中的数据通路
    • 取指令/译码/取操作数/执行运算/存结果/更新PC都需要在一个时钟周期内完成
  • MIPS指令系统中lw指令为例
  1. 取指令并执行PC加4
  2. 指令译码并取操作数
  3. 计算操作数地址
  4. 读出操作数
  5. 写结果

4.4 流水线方式下指令的执行

4.4.1 指令流水线的基本原理

  • 一条指令执行可被分成多个阶段. 每个阶段都在相应功能部件完成.
    • 将各阶段看成相应的流水段, 则指令执行过程就构成了一条 指令流水线

4.4.2 MIPS指令流水线

  • MIPS指令系统中最复杂的指令需要5个阶段完成操作, MIPS指令流水线数据通路通常用一个5段流水线实现
    • 取指(Ifetch) : 取指令并PC加4
    • 译码/取数(Reg/Dec) : 读取寄存器内容对指令译码
    • 执行(Exec) : 进行算术运算或逻辑运算(包括传送操作)
    • 访存(Mem) : 存储器读数据或写数据
    • 写回(Write) : 选择存入寄存器的结果并将其在寄存器输入端保持稳定一段建立时间

4.4.3 适合流水线的指令集特征

  • 首先指令长度尽量一致, 有利于简化取指令和指令译码操作
  • 其次指令格式尽量规整, 尽量保证源寄存器的位置相同, 有利于指令未译码时就可取寄存器操作数
  • 第三, 采用Load/Store型指令风格. 是指指令集中只有Load和Store指令能访问存储器,其他一律不能访问
  • 第四,方便以流水线方式执行指令, 数据和指令在存储器中要"对齐"存放. 有利于减少存放次数, 使所需数据在一个流水段内就能从存储器得到
  • 总之, 指令集体系结构的规整,简单和一致等特性 有利于指令流水线执行

4.5 控制器设计基本原理

  • 控制器 是整个CPU的控制中心, 也称为 控制部件/控制逻辑/控制单元, 作用是 对指令译码, 将 译码结果和状态/标志信号/时序信号 进行组合, 产生指令执行过程所需的控制信号
  • 控制信号 被送到CPU内部或通过系统总线送到主存或I/O模块,
    • 送到CPU内部用于控制CPU内部数据通路的执行
    • 送到主存或I/O模块控制CPU和主存或I/O模块之间的信息交换
  • 指令的执行过程就是数据通路中信息的流动过程.
    • 数据通路的信息流动受控制信号控制.
  • 根据不同的控制描述方式, 可以有 硬连线控制微程序控制器 两种实现方式

4.5.1 硬连线控制器

  • 基本实现思路
    • 指令执行过程中每个时钟周期所包含的控制信号取值看成一个状态
    • 每来一个时钟, 控制信号会有一组新的取值(新的状态), 指令的执行过程就可用一个有限状态转换图进行描述
    • 实现时, 用一组逻辑电路(PLA电路)生成控制信号, 用一个状态寄存器记录状态之间的转换, 控制器实际上就是一个有限状态机
  • 单周期数据通路, 每条指令执行都在一个时钟周期内完成, 每条指令只有一个状态, 则控制器功能无需有限状态转换图描述, 只用一个真值表描述
    • 真值表的输入就是指令操作码,输出时控制信号的取值
    • MIPS指令系统对应的单周期控制器, 输入的是6位操作码op(R-型指令还包括功能码funct), 输出的是控制信号
  • 理论上说,控制器设计的过程主要步骤
    1. 根据每条指令功能, 确定指令执行步骤, 画出指令执行流程图
    2. 给出每条指令在每个步骤中各个控制信号的取值, 在表中列出
    3. 根据指令和控制信号的关系, 写出每个控制信号的逻辑表达式
    4. 根据逻辑表达式, 呼出控制器的逻辑电路
  • 总线结构数据通路需要多个时钟周期才能完成一条指令执行, 通常把这种一个指令周期包含多个时钟周期的数据通路称为 多周期数据通路, 对应的控制器是一个有限状态机

4.5.2 微程序控制器

  • 基本实现思路
    • 仿照程序设计方法, 将指令执行过程用一个 微程序 表示
    • 指令执行过程中每个时钟周期包含的控制信号取值看成多个微命令组成的一条 微指令(实际上是一个0/1序列)
    • 一个微程序由多微指令组成, 每个控制信号对应一个 微命令
    • 控制信号取不同的值就发出不同的微命令
    • 指令执行时先找到第一条伪指令, 按照特定顺序取出后续的伪指令执行
    • 每来一个时钟, 执行一条伪指令
  • 每条指令对应的微程序实现存放在一个只读存储器中, 称为 控制存储器(Control Storage,CS), 简称 控存
    • 用一个PLA电路或ROM来生成每条指令对应的微程序的第一条微指令地址
    • 微指令所在存储单元的地址称为 微地址, 微程序定序器根据不同实现方式生成微地址
    • 根据微地址到控制存储器中取出微指令执行
  • 微程序定序器实现有计数器法和断定法(下址字段法)
  1. 计数器法
    • 主要思想 :
    1. 用专门的微程序计数器 μPC, 将下条微指令地址隐含存放在μPC中.
    2. 顺序执行时根据μPC+1->μPC得到下条微指令地址
    3. 转移地址时, 在当前微指令后添加一条"转移微指令", 并在微指令中添加专门的"转移控制字段", 将其中的控制信息送到微指令地址发生器, 与相应的指令操作码以及条件码组合, 生成转移微地址送μPC
    • 缺点是必须在不连续执行的微指令之间加入"转移微指令", 增加微指令条数的同时还影响指令执行速度
  2. 断定法
    • 断定法 在为指令中增加一个下地址字段, 在该字段中直接给出下条微指令地址, 也成为 下址字段法. 相当于每条都是转移微指令, 不连续执行也没关系
  • 硬连线控制器速度快, 适合于实现简单规整的指令系统(MIPS指令系统).
    • 多输入/多输出的复杂巨大的网状逻辑
  • 微程序控制器采用软件设计思想, 不管指令多复杂,只需实现将其包含的操作所用的控制信号存储在控存中, 就可在指令执行时将控制信号取出, 以控制指令执行.
    • CISC大多用微程序控制器实现, 因为微程序控制每个时钟周期都要访存, 所以指令执行速度较慢

4.6 指令流水线中的冒险处理

  • 指令序列在流水线中执行时遇到某些情况使流水线无法正确按时执行后续指令, 引起 流水线阻塞或停顿(stall), 这种现象称为 流水线冒险(hazard)
  1. 结构冒险(structural hazards)
  • 也称为 硬件资源冲突(hardware resource conflicts). 引起原因在于同一个部件同时被不同指令所用(由硬件资源竞争造成)
  • 解决策略
    1. 规定一个部件每条指令只能使用一次, 且只能在特定阶段使用
    2. 通过设置多个独立部件来避免资源冲突
  • 例如, 访存冲突时可把指令存储器和数据存储器分开, 即组合逻辑A中由一个独立的指令存储器, 组合逻辑D中有一个独立的数据存储器, 并且指令存储器只能在Ifetch阶段使用, 数据存储器只能在Mem阶段使用
  • 事实上, 现代计算机都引入了高速缓冲存储器(cache), 且一级cache(L1 cache)中采用了数据cache和代码cache分开设置的方式就避免了访存冲突引起的结构冒险
  1. 数据冒险(data hazards)
  • 也称为 数据相关(data dependencies). 原因在于后面指令需要读取前面指令的运算结果时,前面指令的结果还没写入寄存器中
  • 解决数据冒险策略
    1. 最简单的是由编译器在数据相关的指令之间加若干nop指令(空操作指令,除修改PC外其他什么操作都不做). 简化了硬件, 但增加时间开销(执行nop指令的时间)和空间开销(nop指令所占空间)
    2. 采用 **数据转发(forwarding)**技术, 在数据通路中一旦产生运算结果或一旦存储器读出数据, 就把它们通过一条 旁路(bypassing) 直接送到相关后续指令的Exec阶段的ALU输入端, 后续指令无需再等待前面指令将结果送到寄存器
    3. 在load指令后面加一条nop指令; 也可通过硬件阻塞方式(插入气泡)来延迟load指令后续指令的执行, 此时流水线将阻塞一个时钟周期, 从而导致程序执行时间延长一个时钟周期
    4. 通过对通用寄存器的读写操作进行特殊处理
  1. 控制冒险
  • 正常情况下指令在流水线中总是按顺序执行, 当遇到改变指令执行顺序的情况时, 流水线中指令的正常执行会被阻塞.
    • 各类转移指令(条件转移/无条件转移/调用/返回指令)以及异常和中断等事件都会改变指令执行顺序, 因而引发控制冒险
  • 把由于流水线阻塞带来的延迟执行周期数称为 延迟损失时间片C
  • 由于分支指令引起的控制冒险称为 分支冒险(branch hazards)
    • 可采用硬件阻塞方式(插入气泡)或软件阻塞方式(插入空操作指令)

4.7 高级流水线基本原理

  • 高级流水线技术充分利用 **指令级并行(Instruction-Level Parallelism,ILP)**来提高流水线性能. 有两种增加指令级并行的策略
  1. 超流水线(supter-pipelining)技术
    • 增加流水线级数使更多指令同时在流水线中重叠执行.
    • 超流水线并没有改变CPI的值, 依然是1.
    • 柳树段越多时钟周期越短指令吞吐率越高,因此超流水线性能比普通流水线好
    • 但读写流水段寄存器的开销就大, 所以流水线级数也是有限制的,不可能无限增加
  2. 多发射流水线(multiple issue pipelining)
    • 同时启动多条指令独立运行提高指令并行性
    • 要实现多发射流水线, 前提是数据通路中有多个执行部件
    • 多发射流水线的CPI能达到小于1
    • IPC(Instruction Per Cycle)指的是每个时钟周期内完成的指令条数

4.8 异常和中断

4.8.1 中断和异常的基本概念

  • 早期Intel 8086/8088微处理器中不区分异常和中断, 两者统称为中断.
    • CPU内部产生的意外事件称为 内中断
    • CPU的中断请求引脚INTR和NMI从CPU外部发出的中断请求为 外中断
  • 从80286开始, Intel统一把内中断称为异常, 外中断称为中断
    • 处理器提供了异常和中断两种打断程序正常执行的机制
  • 中断(外部中断)是一种典型由I/O设备触发的, 与当前正在执行的指令无关的异步事件
  • 异常(内部异常)是处理器执行一条指令时, 由处理器在其内部检测到的,与正在执行指令相关的同步事件
  • 异常和中断的处理过程和实现机制基本上是相同的. 大致过程如下
    • CPU执行当前程序(用户进程)的第i条指令时检测到一个异常事件或在执行第i条指令后有一个中断请求信号, 则CPU会中断当前用户进程, 转到响应异常或中断处理程序去执行
    • 若异常或中断处理程序能够解决当前问题, 则在异常或中断处理程序最后, CPU通过执行"异常/中断返回指令"回到被打断的用户进程的第i条指令或第i+1条指令继续执行
    • 若异常或中断处理程序无法解决当前问题, 则终止用户进程
  • 通常情况下, 异常和中断事件的具体处理过程全部由操作系统(包括驱动程序)来完成
  • 处理异常事件的程序称为 异常处理程序
  • 处理中断事件的程序称为 中断服务程序
  • 两者合在一起称为 异常或中断处理程序

4.8.2 异常的分类

  • Intel将内部异常分为
    1. 故障(fault)
    2. 陷阱(trap)
    3. 终止(abort)
  1. 故障(fault) : 是在引起故障的指令被启动后但未执行结束时CPU检测到的一类指令执行相关的意外事件
    • 指令译码出现非法操作码/取指令或数据时发生页故障/除法指令发现除数为0
  2. 陷阱(trap) : 也成为 自陷或陷入, 是预先安排的一种"异常"事件
    • 当执行到 陷阱指令时, CPU就调出特定程序进行象应处理, 处理结束后返回到陷阱指令的下一条指令继续执行.
    • 重要作用之一是在用户程序和内核之间提供一个像过程一样的接口, 称为 系统调用, 用户程序利用该接口可方便调用操作系统内核提供的服务.
      • 操作系统给每个服务一个编号,称为 系统调用号, 通过一个对应的 系统调用服务例程 提供
      • 如Linux系统中的创建子进程(fork),读文件(read),加载并运行新程序(execve)
      • 利用陷阱机制还可实现程序调试功能(断点和单步跟踪)
  3. 终止(abort) : 在执行指令过程中发生严重错误(控制器出现问题,访存发生校验错等)导致程序无法继续执行, 只好调用 abort例程, 以终止发生问题的进程
    • 有些严重的情况甚至要重启系统
    • 这种异常是随即发生的, 无法确定发生异常的是哪条指令

4.8.3 中断的分类

  • 中断 是由外部IO设备请求处理器进行处理的一种信号, 不是由当前执行的指令引起的
  • 外部IO设备通过特定的 中断请求信号线 向CPU提出中断申请
  • CPU在执行指令过程中, 执行完一条就查看中断请求引脚, 如果信号有效,则进入中断响应周期
    • 中断响应周期中, CPU将当前PC值(断点)和当前机器状态保存到栈中, 设置成 关中断 状态, 从数据总线读取 中断类型号
    • 根据中断类型号跳转到对应的中断服务程序执行
    • 中断响应过程由硬件完成, 而中断服务程序执行具体的中断处理工作, 处理完成后, 再回到被打断的断点处继续执行
  • Intel将外部中断分成 可屏蔽中断(maskable interrupt)不可屏蔽中断(nonmaskable interrupt,NMI)
  1. 可屏蔽中断
    • 通过 可屏蔽中断请求线INTR 向CPU进行请求的中断, 主要来自IO设备的中断请求
    • CPU可通过在中断控制器中设置响应的屏蔽字来屏蔽或不屏蔽
    • 若一个IO设备的中断请求被屏蔽, 则它的中断请求信号将不会被送到CPU
  2. 不可屏蔽中断
    • 通常是非常紧急的硬件故障, 通过专门的 不可屏蔽中断请求线NMI 向CPU发出中断请求
      • 电源掉电,硬件线路故障
    • 这类中断请求信号一旦产生, 任何情况都不可以被屏蔽, 因此一定会被送到CPU, 以便让CPU快速处理这类紧急事件
    • 这种情况下, 中断服务程序会尽快保存系统重要信息, 然后在屏幕上显示相应消息或直接重启系统

4.8.4 异常和中断的响应

  • CPU执行指令过程中, 发生了异常事件或中断请求, CPU必须进行相应的处理
  • CPU从检测到异常事件或中断请求信号, 到调出相应异常或中断处理程序开始执行, 整个过程称为 异常和中断的响应
  • CPU对异常和中断的响应过程可分为三步骤:
    • 保护断点和程序状态
    • 关中断
    • 识别异常和中断事件并转响应处理程序执行
  1. 保护断点和程序状态
  • 不同异常事件, 返回地址(断点)不同
    • 缺页故障异常的断点是发生故障的当前指令的地址
    • 陷阱异常的断点则是陷阱指令后面一条指令的地址
  • 断点于异常类型有关. 为了能异常处理后正确返回到原被中断的程序继续执行,数据通路必须能正确计算断点处地址
  • 假定计算出的断电地址存放在PC中则保护断电时只要将PC送到栈或特定寄存器中即可
  • 异常处理后可能还要回到被中断的程序继续执行所以被中断时程序的状态(标志信息/允许自陷标志等)都必须保存起来
  • 通常每个正运行程序的状态信息都放在一个专门的寄存器中, 称为 程序状态字寄存器(PSWR), 存在PSWR的信息称为 程序状态字(Program Status Word,PSW)
  1. 关中断
  • 假定在执行异常或中断处理程序时再次发生新的异常或中断请求, 会导致原被打断程序的现场以及已保存的断点和程序状态等破坏掉,
  • 所以需要有一种机制来进制这种情况.
  • 通常通过设置 中断允许位(中断允许触发器) 来实现
    • 中断允许为1, 则为 开中断 : 允许响应中断或异常
    • 中断允许为0, 则为 关中断 : 不允许响应中断或异常
  1. 识别异常和中断事件并转响应处理程序执行
  • 调出异常和中断处理程序前需直到发生了什么异常或哪个IO设备发出中断请求
    • 一般来说内部异常事件和外部中断源的识别方式不同, 大多数处理器会将两者分开处理
  • 内部异常事件识别简单, 只要CPU在执行指令时把检测到的事件对应的异常类型号或标识异常类型的信息记录到特定的内部寄存器即可
  • 外部中断源识别比较复杂,
    • 因为外部中断的发生与CPU正执行得指令没有逼然联系, 相对于指令来说, 外部中断是随机的,与当前执行指令无关
    • 对于外部中断, 只能在每条指令执行完成后取下条指令前取查询是否有中断请求
  • 通常CPU通过采样对应的中断请求引脚来查询.
    • 如果引脚有效则有中断请求
  • 通常由CPU外部的中断控制器根据IO设备的中断请求和中断屏蔽情况, 结合中断响应优先级来识别请求的中断类型号
  • 并通过数据总线将终端类型号送到CPU
comments powered by Disqus