简单的计算机体系模型。
现代计算机微观体系结构
CPU
中央处理器(central processing unit, CPU)负责提取程序指令,并对指令译码,之后按程序规定的顺序对正确的数据执行操作。CPU可分为两部分,第一部分为数据通道(datapath),是一种由存储单元(寄存器)和算术逻辑单元组成的网络,这些组件通过总线连接,并利用时钟控制时间。第二部分是控制单元(control unit),负责对各种操作进行排序并保证各种正确的数据适时地出现在所需的地方。
- 寄存器(register)位于CPU内部,用于存储二进制数据,前章介绍的D存储器可以用来构建寄存器,一个多位寄存器是一组D触发器的组合。通用寄存器大小为16位,32位,64位。某些寄存器会被赋予专门的用途,如只能存放地址、只用于存储控制信息等。寄存器的编址与存储器不同,每一存储器字都有一个唯一的二进制地址,这些地址从0开始编码,而仅存次则由CPU内部控制单元进行编址。
- 算术逻辑单元(arithmetic logic unit,ALU)在程序执行过程中用于进行逻辑运算和算术运算。一般情况为两个数据输入和一个数据输出。ALU中的各种操作常常影响状态寄存器(status register)的某些数据位的数值。控制单元发出的信号控制ALU执行运算。
- 控制单元(control unit)监视所有指令的执行和各种信息的传送过程。控制单元负责从内存提取指令,对指令译码,确保数据适时的出现在正确的地方,同时负责通知ALU应当使用哪一个寄存器,执行哪些中断服务程序。其使用一个程序计数器(program counter)的寄存器来寻找下一条要执行的指令的位置,并用状态寄存器存放某些特殊操作状态。
总线
总线(bus)是一组导电线路的组合,作为一个共享和公用的数据通道把系统内的各个子系统连接在一起,由多条线路构成,允许多位数据并行传递。
- 在任何时刻只能有一个设备(如寄存器、ALU、内存或其他某个设备)使用总线。这种共享总线的方式可能引起通信上的瓶颈。总线的速度受到总线长度和共享总线的设备数目的影响。更通常的情况:各种设备分为主设备(master)和从设备(slave),主设备为最初启动的设备,从设备为响应主设备请求的设备。
- 总线可以实现以点对点(point-to-point)的方式连接两个特定设备,或将总线作为一条公用通道(commmon pathway)来连接多个设备。要求多个设备共享的总线称为多点(multipoint)总线。总线协议(bus protocol)对于共享总线十分重要,典型计算机总线包含数据总线、地址总线、控制总线和电源线:数据总线(data bus)传递必须在计算机不同位置之间移动的实际信息;控制总线(control line)提示哪个设备允许使用总线和使用的目的,也用来传递有关总线请求、中断和时钟同步信号的响应;地址总线(address line)指出数据读写位置。
- 各种信息的传递都发生在一个总线周期(bus cycle)内,总线周期是完成总线信息传送所需的时间脉冲间的时间间隔。同步(synchronous)总线由时钟控制,各种事件只有在时钟脉冲到来时才会发生。总线周期与时钟频率成反比,要通过时钟控制事件的发生,因此任何时钟脉冲产生的相位漂移(clock skew)都不能过大,即总线周期时间不能短于信息在总线上传输所需要的时间,因此总线长度对总线的时钟频率和周期时间有一定限制。异步(asynchronous)总线负责协调计算机各种操作,采用握手协议强制实现计算机其他操作同步。
- 根据总线传递的信息类型和使用总线的设备,可以细分为:处理器-内存总线(processor-memory bus)为长度较短的高速总线,将CPU和内存系统使用最大限度的带宽连接,需要专门的设计;I/O总线通常比处理器-内存总线长,可连接不同带宽的设备,兼容多种不同体系结构;底板总线(backplane bus)构建在机器主板上,将主板上所有部件连接,即所有设备共享一条总线。对于PC机,使用内总线(系统总线)连接CPU、内存和所有其他内部部件,使用外总线(拓展总线)连接外围设备、拓展插槽和I/O端口。
- 总线仲裁(bus arbitration):对于配备不止有一个主控设备的系统需要主线仲裁,为主控设备制定优先级别,保证各个主控设备都有机会使用总线。
- 菊花链仲裁方式:使用一条“出让总线”的控制线将总线使用权依次由最高级别向最低级别传递,简单但不能保证仲裁公平性。
- 集中式平行仲裁方式:每个设备有一个总线请求控制线,通过一个总线仲裁器选择设备。会导致使用过程中出现瓶颈效应。
- 自选择的分配式仲裁方式:由设备自己决定那个设备具有使用的最高优先级。
- 冲突检测的分配式仲裁方式:每个设备都允许发出总线使用请求,如果有冲突则这些设备都必须重新发出另一个使用请求。以太网采用这种方式。
时钟
用于对系统各个部件协调同步,CPU的每条指令执行都是使用固定的时钟脉冲数目。计算机采用时钟周期量度系统指令的性能。
- 多数计算机系统都是同步计算机:计算机只有一个主控时钟信号,按照规定的时间间隔发生脉动,各个寄存器必须等待时钟脉冲发生跃变才能输入新的数据。最小的时钟周期时间至少应大于数据从每组寄存器的输出到下一组寄存器的输入所需要的传递时间,即电路的最大传输延迟时间。可以通过在输出寄存器和对应的输入寄存器之间增加寄存器的方法减小传输延迟,增加额外的寄存器等价于增加该条指令所需的时钟周期的数目。一般的,乘法比加法操作、浮点运算比整数运算要更多的时钟周期。
- 某些总线结构有自己的时钟,总线时钟通常比CPU时钟慢,造成了系统的瓶颈问题。有时会为了达到目的超越某些技术限制,如超频(over-clocking)使部件超出规定给出的时间频率或总线速度上限,CPU是最流行的超频组件(许多部件都可以超频运行)。对系统总线的超频可以大幅度改善系统性能,但同样可能损害与总线相连的各种部件。
存储器组成和寻址方式
可以把存储器设想成一个数据位的方阵,方阵的每一行的位长度通常是机器的字大小。物理上通过一个寄存器实现存储器方阵的一行的数据存储。每个寄存器(存储单元)都有一个唯一的地址编号。存储器地址几乎都为无符号整数,正常情况下(目前流行的大部分)存储器采用按字节编址(byte-addressable),即每个字节有一个唯一的地址。有的机器的字大小超过一个字节(32位系统的每个字都是4个字节),可以采用按字编址(word-addressable),每个机器字有一个自己唯一的地址。字是计算机指令使用的基本单位,即使是按字节编址的计算机也可以从内存中直接读出一个字或将一个字写入存储器。
- 存储器(内存)由随机访问存储器(RAM)芯片构成,使用符号L×W(长×宽)表示,如4M×16存储器表示存储器有4M(2^22个字)长和16位宽(每个字都是16位)。要对该存储器编址需要2^22个不同的地址,即22位二进制数。主存储器使用的RAM芯片数目大于1,通常利用多块芯片拼接成一定要求的单一存储器模块。单一共享存储器模块可能引起存储器访问上的顺序问题,存储器交叉存储技术从多个存储器模块中分离存储单元,低位交叉存储使用地址的低位选择存储器组,把连续的存储器地址分配到不同的存储器模块中,高位交叉存储使用地址的高位选择存储器组,把地址直接分配给具有连续地址的存储器模块。
中断和输入/输出子系统
输入/输出是各种外围设备和主存储器(内存)之间的数据交换。中断(interrput)是改变或中断系统正常流程的各种事件。
- 输入/输出设备通常不与CPU直接相连,而采用某种接口(interface)来处理数据交换,接口将信号转化为总线和外设都可以接受的形式。CPU通过输入输出寄存器和外设交流,有两种工作方式:1)内存映射的输入输出(memory-mapped I/O),接口中的寄存器地址就在内存地址的分配表中,此时CPU对I/O设备的访问和对内存的访问完全相同,速度很快但要占用系统内存空间;2)指令实现的输入输出(instruction-based I/O),CPU有专门的指令实现输入输出操作。
- 如果采用键盘输入,并且打字的速度很快,计算机必须有足够的时间来阅读输入寄存器的每一个字符。如果在计算机能够有机会处理完当前的字符之前,又有另外一个字符被送入到输入寄存器,那么当前的那个字符就会丢失。一种更可能发生的情况是,由于处理器的速度非常快,而键盘输入的速度很慢,所以处理器可能会多次从寄存器重复读取同一个字符。可以使用中断控制的输入输出(interrupt-driven I/O)来解决上述这些问题。
- 多种原因可以触发中断:I/O请求,算术错误,算术下溢或上溢,硬件故障,用户定义的中断点(如程序调试),页面错误,非法指令等。不同中断类型的中断处理方法不同。由用户或系统发出(启动)的中断请求可以是屏蔽(maskable)中断(可以被禁止或忽略)或非屏蔽(maskable)中断(高优先级别的中断,不能被禁止,必须响应)。
- 计算机中有三种类型的中断:由外部事件(输入/输出,电源掉电等) 产生的外部中断;由于程序中的一些异常(被0除,堆栈溢出,保护系统侵犯等)产生的内部中断以及执行程序中的某条指令(例如,要求程序的执行从一种运行环境如用户层,转到另一个运行环境如内核层等)所引起的软件中断。
MARIE
MARIE包含一个实际的工作计算机具备的全部功能部件,包括存储器和CPU。
体系结构、寄存器和总线
- MARIE有以下特点:使用二进制数和补码表示法,存储程序和采用字长度,按字编址,主存储器容量为4K字,16位数据,16位指令、4位操作吗和12位地址,一个16位的累加器(AC),一个16位的指令寄存器(IR),一个16位的存储器缓冲寄存器(MBR),一个12位的程序计数器(PC),一个12位的存储器地址寄存器(MAR),一个8位的输入寄存器和一个8位的输出寄存器。
- MARIE的7种寄存器
- AC:累加器(accumalator)用来保持数据值,是通用寄存器。
- MAR:存储器地址寄存器(memory address register),用来保持被引用数据存储器地址。
- MBR:存储器缓冲寄存器(memory buffer register),用来保持刚从存储器中读取或者将要写入存储器的数据。
- PC:程序计数器(program counter),用来保持程序将要执行的下一条指令的地址。
- IR:指令寄存器(instruction register),用来保持要执行的下一条指令。
- InREG:输入寄存器(input register),用来保持来自输入设备的数据。
- OutREG:输出寄存器(output register),用来保持将要输出到输出设备的数据。
其中,MAR、MBR、PC和IR寄存器为专用寄存器,不能作除上述规定外的其他目的。另外有一个状态或标志寄存器(status),保持显示各种状态信息。
- MARIE的数据通道
指令系统体系结构
指令系统体系结构(instruction set architecture,ISA)规定了计算机可以执行的每条指令和其格式。
指令构成
MARIE的每条指令由16位二进制数构成,最左边(12~15)4位组成操作码,右边12位(0~11)形成地址。0001 1 Load X 将地址为X的存储单元中的内容装入AC 0010 2 Store X 将AC中的内容存储到地址为X的存储单元中 0011 3 Add X 将地址为X的存储单元中的内容和AC中的内容相加,结果存入AC 0100 4 Subt X 将AC中的内容减去地址位X的存储单元中的内容,结果存入AC 0101 5 Input 从键盘输入一个数值到AC中 0110 6 Output 将AC中的数值输出到显示器 0111 7 Halt 终止程序的执行 1000 8 Skipcond 有条件的跳过下一条指令 1001 9 Jump X 将X的值装入PC中
对于Skipcond,假定最靠近操作码的两位地址位作为测试的条件,如可以设定00为AC中的值为负数,01为AC中的值等于0,10为AC中的值大于0。寄存器传输表示法:MARIE指令集实际是计算机部件用来执行程序的机器级别的指令系统,每条指令实际包含多个微指令(mini-instruction),又称为微操作。微指令规定了对寄存器中存储数据可以执行的各种最基本操作。描述计算机微操作的行为的符号表示法为寄存器传输表示法(RTN)或寄存器传输语言(RTL)。使用M[X]表示存放在地址为X处的存储单元中的数据,<——表示信息的传送。实际操作中,数据先从源寄存器送到总线,然后脱离总线到达目的寄存器。下面叙述中没有包括总线的传送过程。
Load X MAR<——X,MBR<——M[MAR],AC<——MBR Store X MAR<——X,MBR<——AC,M[MAR]<——MBR Add X MAR<——X,MBR<——M[MAR],AC<——AC+MBR Subt X MAR<——X,MBR<——M[MAR],AC<——AC-MBR Input AC<——InREG Output OutREG<——AC Halt 无 Jump X PC<——X 指令执行过程
取指-译码-执行(fecth-decode-execute)。整个过程如下。
- 将PC中的内容复制到MAR:MAR<——PC。
- CPU转向主存储器,提取由MAR给出的地址单元中的指令,并将指令放入指令寄存器IR,同时PC自动加1(MARIE按字编址,PC加一实际效果是下一个字的地址占据PC寄存器,如果MARIE按字节编制,则PC需要增量2,因为每条16位指令占据两个字节宽度),此时PC指向下一条指令:IR<——M[MAR],PC<——PC+1。
- IR最右边的12位地址复制到MAR,对IR最左边4位译码:MAR<——IR[11-0],IR[15-12]。
- 若需要,则CPU使用MAR中的地址转向存储器提取数据,并将数据放入MAR(可能是AC)中,然后执行指令。
MARIE的中断和输入/输出:当CPU要执行输入输出指令时,通知I/O设备,之后继续处理其它任务,直到I/O设备准备就绪,此时I/O设备会向CPU发送中断请求信号,CPU响应和处理这个中断请求,完成I/O操作后CPU会继续正常的取指-译码-执行周期。大部分计算机中断处理方法为:在机器的每一个取指-译码-执行周期开始处,检查是否有中断请求存在,如果有中断请求则CPU先处理中断任务,否则正常执行。在CPU执行中断服务程序前,必须存储PC中的内容,CPU的所有寄存器中的内容,以及原始程序中原有的各种状态条件。中断服务完成后,CPU必须严格恢复到原始程序运行的真实环境。
编译程序:编译程序使用助记符号将汇编语言转换成机器语言,即完全由二进制数组成的语句。编译程序阅读由汇编语言编写的源文件(source file),生成由机器代码组成的目标文件(object file)。可以使用标记符号label(简单名称)来标识或命名一些特定的存储器地址。MARIE要求标号后面必须要加一个“,”的标点符号。
在第一次通读时,编译程序建立一组符号表(symbol table)表示对应关系。
第二次通读时,编译程序使用符号表来填充空白地址,并且生成相应的机器语言指令。
简单MARIE程序
两数相加
十六进制地址 指令 存储器地址二进制内容 存储器十六进制内容 100 Load 104 0001 0001 0000 0100 1104 101 Add 105 0011 0001 0000 0101 3105 102 Store 106 0010 0001 0000 0110 2106 103 Halt 0111 0000 0000 0000 7000 104 0023 0000 0000 0010 0011 0023 105 FFE9 1111 1111 1110 1001 FFE9 106 0000 0000 0000 0000 0000 0000 MARIE指令集扩充
指令编号(十六进制) 指令 意义 RTN 0 JnS X 将PC内容存储到地址X处,并跳转到地址X+1 MBR<——PC,MAR<——X,M[MAR]<——MBR,MBR<——X,AC<——1,AC<——AC+MBR,PC<——AC A Clear AC清零 AC<——0 B AddI X 间接相加:将地址X处的数值作为操作数实际地址,加到AC中 MAR<——X,MBR<——M[MAR],MAR<——MBR,MBR<——M[MAR],AC<——AC+MBR C JumpI X 间接转移:将地址X处的数值作为地址并无条件跳转到该存储单元 MAR<——X,MBR<——M[MAR],PC<——MBR 硬件译码和微程序控制译码
- 硬连线控制(hardwired control):物理上将各条控制线与实际的机器指令连接。速度快,电路复杂,设计修改困难。
- 微编程(microprogramming):所有机器指令被放置到微程序中,将指令转换成规定的控制信号。微程序是一个用微代码编写的翻译器,被存储在计算机固件(ROM、PROM、EPROM等)中,称为控制存储器。设计灵活简单,有助于设计功能强大的指令集。每条指令都需要经过一次额外的翻译过程,会减缓整个程序执行速度。
实际计算机体系结构:CISC(复杂指令集计算机,Complex Instruction Set Computer),如Intel体系结构中的x86系列CPU,和RISC(精简指令集计算机,Reduced Instruction Set Computer),如Intel的奔腾系列和MIPS体系结构。CISC机器有数目庞大、长度各异、设计复杂的指令系统,多数指令非常复杂,这些复杂指令的一个小子集就可能显著减慢CPU运行速度。RISC机器主要目的是简化指令,对一些小的但是完整的指令硬连线,提高指令执行速度。在RISC系统中,每条指令只执行一个操作,所有指令长度相同只是格式略有差别,所有算术运算在寄存器之间执行,存储器中的数据不能用作操作数。1982年后,所有新设计的指令系统基本都属于RISC结构或CISC和RISC组合结构。
专栏目录:计算机理论基础
此专栏的上一篇文章:计组与体系结构笔记(二):布尔代数和数字逻辑
此专栏的下一篇文章:计组与体系结构笔记(四):指令系统
原创作品,允许转载,转载时无需告知,但请务必以超链接形式标明文章原始出处(https://forec.github.io/2015/10/21/Computer-Organization-Architecture3/) 、作者信息(Forec)和本声明。