热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

计算机系统架构:机器控制与控制器CU的功能解析

通过对计算机系统架构的研究,尤其是控制器CU的功能解析,我对处理器的工作原理有了更深入的理解。原来,机器指令能够被直接识别和执行,是因为其背后有微程序的支持。深入探讨后发现,最基本的不可分割操作实际上是由微指令组成的,这些微指令构成了机器指令的基础,确保了指令的准确执行。
  • 控制器部分的内容算是让我对处理器有了更深一步的理解
  • 学到汇编其实还是有些抽象,为什么机器指令就可以直接被机器识别并执行呢?
  • 这才知道,机器指令之下还有微程序,细究起来最不可分的操作应当是微指令,多条微指令实现了一个指令的功能
  • 进一步把指令细分为很多阶段(称为周期,如取指周期、执行周期等)的话,那在微指令和指令层次之间,还有一个指令的分段的中间层次,即多条微指令实现指令的某个阶段(如取指、读取等等)的功能,指令的多个阶段的功能就组成了这条指令的功能,多条指令又组成了程序来运行
  • 一条微指令作为最基本的机器动作,按我理解就是,一条微指令就指明了哪些部件在这一步需要工作,哪些不需要工作。需要工作的就给“通上电”,不需要的就“断开”,部件通上了电也就会自己运行起来,电流就流通起来,像门电路这种就实现各种逻辑,最终完成一条微指令的操作
    • 比如取指周期的安排
节拍 动作
C1 MAR <- (PC), R <- 1
C2 MDR <- M(MAR)
C3 PC <- (PC)+1
C4 IR <- (MDR), CU <-OP(IR)
  • 节拍是时序的控制信号,所有的动作都在时序的严格控制下
    • C1节拍,PC的内容也就是下一条指令的地址送入MAR中,并置读信号为1有效
    • C2节拍按照MAR的地址指示从主存中读取数据到MDR中,读取的是一条指令
    • C3节拍PC自加1,指向下一条指令
    • C4节拍讲MDR的指令送入IR指令寄存器,并将IR指令的操作码部分送入CU控制器准备译码
  • 每一个“MAR <- (PC)”的小动作就由一个微指令来完成,只涉及少数几个部件。都是通过电信号来控制,那么按我的猜想,给PC的输出打开,给MAR的输入打开,电流自然流通,PC的内容也就传送到MAR中去了。不知道对不对,反正有电路控制下都可以实现。

组成与功能

  • 处理器的工作就是在控制器CU的指挥下,按照“取指令 - 分析指令 - 根据寻址方式计算操作数地址- 取源操作数 - 处理源操作数 - 写目的操作数”的顺序,周而复始地解释指令。
  • CU的功能就是,对指令进行分析(译码),按照一定时序,根据当前处理器状态,向计算机的各个部件发出控制信号/命令

控制器CU


时序系统

  • 操作有序的基础,即在时序的控制下。
  • 简单来讲就是规定时间间隔,每个时间段内完成能完成的任务,完不成就分配两个时间段等等,但时间总是时间段的整数倍。

  • 指令周期:处理器从主存取出一条指令并执行完该指令所需的时间

    • 然而不同指令所需的时间不同,且同一指令的时间也受环境的影响,为了简化控制,一般都设计成节拍的某个整数倍——基准周期
    • 基准周期称为机器周期或CPU周期,其长短取决于指令的基本操作和期间的工作速度
  • 对于单周期处理器,所有指令的指令周期都是相同的,都等于一个机器周期。
    • 为了保证适配所有的指令,所以指令周期就要选取最复杂指令所用的时间
  • 多周期处理器,把一条指令的周期分为好几个部分来细化,最简单的两周期就分为“取指周期”和“执行周期”
    • 多个周期之间总得有个基准,这个基准就是机器周期
    • 为了保证一个机器周期内至少可以完成一个指令的基本操作(细化后的一个部分),一般选取花费时间较长的一次访存的时间(访存依赖于总线,所以一次访存的时间也叫总线周期)
    • 一个标准的、同步总线的总线周期为4个节拍

三级时序

  • 节拍
    • 时钟脉冲,由一个频率相当精确和稳定的脉冲信号发生器按一定电压幅度,一定时间间隔连续发出的脉冲信号。其频率在CPU设计的时候就确定下来,作为最基础的时序控制。
  • 机器周期
    • CPU的基准时间,设计的长度可以保证至少能完成一个指令的基本操作,简化了控制。
    • 设计成节拍的某个整数倍
    • 一个标准的、同步总线的机器周期为4个节拍
  • 指令周期

    • 一条指令执行所需要的时间
    • 分为单周期处理器和多周期处理器
      • 单周期:所有指令的指令周期一样长。既然一样长就干脆设置成为一个机器周期的长度好了,更简化了控制。只不过这个时候机器周期是不是一般而言的4个节拍,那就不好说了。万一某条指令非常复杂需要的时间超过了4个节拍呢?那就得机器周期了呗,至少得大于等于最复杂指令的执行时间吧。
      • 多周期:指令被分为好几个部分执行,每个部分需要的时间规定为一个机器周期,这样机器周期才是设计为保证至少完成一个基本操作。
      • 指令周期的例子
      • 指令周期
  • 三级时序系统

    • 即最底层的节拍、节拍之上作为基准的基准周期(也叫机器周期,一般设置和总线周期相同,但和总线周期不是一个概念)、再在这个基准之上在组间我们的指令周期

三级时序系统

控制方式

  • 一般都是多周期处理器。单周期虽然设计简单,但太浪费了。好好的CPU时间大部分都闲着
  • 但是多周期的话,就要考虑不同的指令其指令周期必然不同,而对指令划分的每个部分,其也不一定会相同
    • 虽然我们用一次访存的时间来作为机器周期,目的是为了保证在一个机器周期内能完成一个基本操作,比如取指、间址、执行、中断查询这四个部分的话,就要保证一个机器周期内能完成一个部分的操作
    • 但是对于复杂的运算,比如乘法、除法,其执行周期很可能就大于一次访存的时间,也就是在一个机器周期内完成不了执行周期所需的完成的操作
    • 这就尴尬了
  • 所以我们需要控制
    • 同步控制:和单周期处理器的思想差不多,既然把指令划分了,那就以最长的一个部分的操作时间作为基准
      • 假设乘除最长且需要在两个机器周期内完成,那么对于取指、间址等其他部分,也分配两个机器周期的时间
      • 但是对于大部分的操作,两个机器周期太长了,这就会导致CPU经常处于空闲的状态。浪费浪费
      • 作为一种在同步控制之下的弥补手段,人们又设计了不等长的机器周期。简单的操作就采用3个节拍的机器周期,复杂的操作采用5个节拍的机器周期。不过在此之上由需要一层控制在分配机器周期
    • 异步控制
      • 即采用“握手/应答”的方式来确定机器周期的长短。当进入一个机器周期的时候,将相应的某个“指令执行阶段标志”置为1,当最后一个微操作结束的时候,向控制器发出一个信号,控制器再发出一个信号来将“指令执行阶段标志”置为0。这样才算一个机器周期结束
      • 如此一来机器周期的长短也无法实现规定
    • 联合控制
      • 两种办法相结合呗
      • 比如在部件(如ALU)的内部采用同步,部件之间采用异步
      • 在比如,固定机器周期的长度,但是根据指令复杂度的不同,每个指令分配的机器周期的数量也不等。这属于联合控制,异步中有同步(机器周期固定长度),同步中有异步(不同指令周期有不同数量的机器周期)

硬布线与微程序

  • 终于到了微指令的部分了。
  • 说,一条指令被控制器翻译成多条微指令(亦称微操作,不过微指令的“指令”层面的概念尤其对应微程序,因为硬布线实在牵扯不到“指令”层面上),而一条指令本身又是可划分的,可以被划分为多个部分,那么每个部分同样对应着多条微指令

硬布线

  • 原理

    • 把每个微操作所对应的需要用到的部件、信号都用逻辑电路连接起来,等合适的信号来了就自动启动了对应了部件(通上电…开关打开…之类的)…
  • 比如对于取指周期,一般给安排一个机器周期的时间就够用,通常的机器周期是4个节拍,也就是4个节拍要完成取指这个操作

节拍 动作
C1 MAR <- (PC), R <- 1
C2 MDR <- M(MAR)
C3 PC <- (PC)+1
C4 IR <- (MDR), CU <-OP(IR)
  • 对于每个微操作,列出其所在的指令的哪个周期、哪个节拍、哪些指令需要用到
周期 节拍 微指令 SHL LDAM STAM JMP X JZ X ADD M COM
FE C1 MAR <- (PC) 1 1 1 1 1 1 1
FE C1 R <- 1 1 1 1 1 1 1 1
FE C2 MDR <- M(MAR) 1 1 1 1 1 1 1
FE C3 PC <- (PC)+1 1 1 1 1 1 1 1
FE C4 IR <- (MDR) 1 1 1 1 1 1 1
FE C4 CU <- OP(IR) 1 1 1 1 1 1 1
EXE C1 MAR <-AD(IR) 0 1 0 0 0 1 0
EXE C2 MDR <- M(MAR) 0 1 0 0 0 1 0
  • 太长我就不写了
  • 以“MDR<-M(MAR)”为例,也就是一次读取主存内容的微操作
    • 从表格可以看出,在取指周期FE的C2节拍安排了这个微操作,在执行周期EXE的C2节拍也有这个操作
    • 因为取指周期必然的(所有的指令都用到了),就是说只要到了取指周期的C2节拍,那么这个微操作就必然要启动执行
    • 执行周期不一样,有些指令需要从主存取数、而有些指令则不需要,但只要需要,就安排在了C2节拍里。也就是说,到了执行周期的C2节拍,如果是需要从主存取数的指令,那么这个微操作也会被启动执行
  • 所以对于所有的微操作,都是提前安排好了,你你你在哪个周期哪个节拍,他又在哪个周期的哪个节拍,从指令转换成微操作序列,也需要符合这个表格所规定的微操作的先后顺序
    • 只不过这里使用最简单的两周期来举例
  • 在设计组合电路之前,还要写出微操作所对应的逻辑表达式
    • 如“MDR<-M(MAR)”
    • FE · C2 · (SHL + LDA M + STA M + JMP X + JZ X + COM) + EXE · C2 · (LDA M)
    • = FE · C2 + EXE · C2 · (LDA M)
    • = C2 · [ FE + EXE · ( LDA M ) ]
    • 注:逻辑加和逻辑乘

硬布线

  • FE、C2均是当前的状态信号,现在是哪个周期、哪个节拍
  • 对于LDA M信号,那自然就是ID指令译码器所要发出的信号了,就是判断当前的指令是哪条指令
  • 这个时候的输出还只是我要启动“MDR<-M(MAR)”这个微操作,相当于把当前指令根据时序翻译成了微操作序列
  • 然后这条输出就对应到了相应的控制信号,同样也是通过逻辑电路来对应的。
  • 按我的理(猜)解(想),每个微操作对应多个部件,那么要实现这个微操作就需要对每个对应的部件就要发出一个控制信号,这个控制信号被称为微命令。差不多是很底层的命令了。不过应该还可以被相应的部件继续翻译(应该是吧),比如发给ALU的信号就是要告诉它进行什么运算,是加还是减还是移位等等,ALU收到信号翻译后听懂了就进行相应的动作。

  • 从百度百科盗图一张

硬布线逻辑

微程序

  • 原理
    • 既然每条微指令需要发出的控制信号都是相同的,那么就存储下来,用到的时候直接拿出来用不就可以了嘛。机智!
    • 相比于硬布线,其硬件的复杂度大大降低了,只不过还需要从存微指令的地方取出来,所以花费的时间肯定要比直接采用逻辑电路的硬布线要慢
    • 对于RISC还是采取硬布线的方式比较合算,因为RISC本身的指令就不多,硬件复杂度也不会高到哪去
  • 历史
    • 其实早在1951年这个想法就被英国剑桥大学的计算机教授Wilkes提出来了,所以“微程序控制”也被称为“Wilkes模型”
    • 然而,当时的存储器太慢太慢了,,,,,,,,,,,,
  • 设计
    • 同样是先根据周期、节拍来规定好每个微指令在何时才能执行
    • 把微指令编制成微程序
    • 把所有的微程序存入控制器内部的一个ROM——控制存储器CM(Control Memory,简称控存)
    • 机器运行的时候,控制器根据当前指令、状态(节拍)取出对应的微指令,按照规定好的节拍一条一条送入控存数据寄存器CMDR
    • 由CMDR发出微命令(即控制信号)来通知相应的部件开始干活

微程序

  • 微程序控制器组成
    • 原本控制器的IR、PC依旧保存,其余的见上图
    • 微地址形成逻辑代替了实现了指令译码器的功能
    • 微指令寄存器存放当前的微指令
    • 控制存储器存储所有的微指令,以微程序的形式
    • 微指令地址寄存器(uAR)存放微指令的地址,也称为CMAR
  • 微程序和微指令
    • 微程序
      • 通常微程序可以完成一个基础操作,比如取指操作可以编制成一个微程序。而想这种公共操作可以只存储一份,基本上就是取指、间址、中断判断这三个公共的部分
      • 对于其他每个指令,其执行部分的微指令必然是不同的,每条指令就需要对应一个执行部分的微程序
      • 一般来说,N条指令,就需要编制N+3个微程序
    • 微指令
      • 由“操作控制字段”和“顺序控制字段”组成
      • “操作控制字段”记录着所需要发出的微命令,因为是提前编制好的,这些微命令就可以完成这条微指令的操作
      • “顺序控制字段”用来确定下一条微指令的地址,如果当前的微程序没有执行完,一般就是顺序加1指向下一条微指令。如果执行完了,则相当于告诉微地址形成逻辑,我当前的微程序执行完了,应该选择下一个微程序执行了。一般是通过设置相应的标志位。于是就根据当前的指令操作码、时序来确定下一个微程序是哪个。取指的微程序执行完了,如果当前指令需要间址则跳到间址的微程序,不需要就直接跳到当前指令的执行部分的微程序

微程序与微指令

  • 细说微指令
    • 操作控制字段:记录要发出的控制信号,有不同的编码方式
      • 直接表示法
        • 每一位对应一个控制信号,如果该位为1则表示要发出这个控制信号,为0不发出
        • 但是控制信号太他妈多了啊。轻轻松松上百个。一条指令都舍不得占几位,一个微指令就要占几百位。No Way!
      • 编码表示法
        • 所以就编码表示了呗
        • 但是只有互斥(不能同时发出)的控制信号才可以被编码
        • 有编码自然也有译码
        • 字段直接编码
        • 字段直接编码
        • 字段间接编码
        • 字段间接编码
    • 顺序控制字段
      • 也叫“下地址”
      • 并不是所有时候都需要用到该微指令的下地址
        • 开机后,第一条微指令的地址由专门的电路生成
        • 某条指令的最后一条微指令结束,那么下一条必然为取指周期的微程序,也有专门的电路生成
        • 一般由取指周期微程序的最后一条微指令来置“间址标志IND”为1,表示下一步要进入该指令的间址周期,由于间址是公共操作,所以也有专门的电路生成
        • 若有条微指令置了“执行标志EXE”为1,表示要进入执行周期,则下地址由微地址形成逻辑根据指令操作码形成。由于存储在CM的微程序的位置都是固定的,可以在另外设置一个ROM来存储每个微程序的首地址,并且每个指令操作码对应的微程序首地址在该ROM存储的地址为这个指令操作码,就是说直接把指令操作码(是一个二进制编码)当作地址(所有的指令操作码均不相同)去访问该ROM就可以快速得到这个指令操作码所对应微程序在CM中的地址~
      • 给出下地址的方法
        • 直接给出:当前为A,下地址通常为B,除非当前微程序执行结束,则无条件转移到B。如执行结束必然要进入中断,则可以直接给出
        • 增量计数:将uAR赋予自动加1的特点,这样可以满足所有的顺序微指令,对于分支/跳转,就需要改进顺序控制字段,分为“转移控制字段BCF”和“转移地址字段BAF”,若条件满足则直接用BAF来改写uAR
        • 断定法:顺序控制字段分为“非测试字段”和“测试字段”
          • “非测试字段”直接构成下地址的高位
          • “测试字段”和“非测试字段”以及状态(时序等)、指令操作码等等送入“测试网络”来生成下地址的地位
          • 这样就支持多路转移,转移的路数由“测试字段”的位数决定(n位则有2^n路)

  • 这周应校选课要求,读了一本书叫《世界是平的》,虽然已出版很久了,不过仍然值得一读。

推荐阅读
  • 本文详细介绍了如何在智能手机上将电话铃声恢复到原始状态,适用于各种品牌的智能手机。 ... [详细]
  • 本文探讨了在一个物理隔离的环境中构建数据交换平台所面临的挑战,包括但不限于数据加密、传输监控及确保文件交换的安全性和可靠性。同时,作者结合自身项目经验,分享了项目规划、实施过程中的关键决策及其背后的思考。 ... [详细]
  • 流处理中的计数挑战与解决方案
    本文探讨了在流处理中进行计数的各种技术和挑战,并基于作者在2016年圣何塞举行的Hadoop World大会上的演讲进行了深入分析。文章不仅介绍了传统批处理和Lambda架构的局限性,还详细探讨了流处理架构的优势及其在现代大数据应用中的重要作用。 ... [详细]
  • 如何高效解决Android应用ANR问题?
    本文介绍了ANR(应用程序无响应)的基本概念、常见原因及其解决方案,并提供了实用的工具和技巧帮助开发者快速定位和解决ANR问题,提高应用的用户体验。 ... [详细]
  • 本文将深入探讨 Unreal Engine 4 (UE4) 中的距离场技术,包括其原理、实现细节以及在渲染中的应用。距离场技术在现代游戏引擎中用于提高光照和阴影的效果,尤其是在处理复杂几何形状时。文章将结合具体代码示例,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 深入探讨:Actor模型如何解决并发与分布式计算难题
    在现代软件开发中,高并发和分布式系统的设计面临着诸多挑战。本文基于Akka最新文档,详细探讨了Actor模型如何有效地解决这些挑战,并提供了对并发和分布式计算的新视角。 ... [详细]
  • 协程作为一种并发设计模式,能有效简化Android平台上的异步代码处理。自Kotlin 1.3版本引入协程以来,这一特性基于其他语言的成熟理念,为开发者提供了新的工具,以增强应用的响应性和效率。 ... [详细]
  • oracle 对硬件环境要求,Oracle 10G数据库软硬件环境的要求 ... [详细]
  • Redis:缓存与内存数据库详解
    本文介绍了数据库的基本分类,重点探讨了关系型与非关系型数据库的区别,并详细解析了Redis作为非关系型数据库的特点、工作模式、优点及持久化机制。 ... [详细]
  • CPU风扇不转导致无法开机,常见原因及解决方法
    某用户在尝试开机时发现,系统未能正常启动,开机键短暂亮起后熄灭,且未听到CPU风扇的运转声音。本文将探讨CPU风扇不转的原因,并提供相应的解决方法。 ... [详细]
  • PCIe中的弹性缓冲原理解析
    PCIe是一种高速串行总线,其传输信号为差分信号,并采用同步传输方式。然而,PCIe并没有专用的同步时钟。本文将详细介绍PCIe中的弹性缓冲(Elastic Buffer)原理,探讨其如何处理时钟差异,确保数据传输的稳定性和可靠性。 ... [详细]
  • 对象存储与块存储、文件存储等对比
    看到一篇文档,讲对象存储,好奇,搜索文章,摘抄,学习记录!背景:传统存储在面对海量非结构化数据时,在存储、分享与容灾上面临很大的挑战,主要表现在以下几个方面:传统存储并非为非结 ... [详细]
  • 本文将详细介绍如何配置JDK 8u101的环境变量,包括下载、安装和环境变量的设置步骤。适用于64位和32位操作系统。 ... [详细]
  • 深入理解Dockerfile及其作用
    Dockerfile是一种文本格式的配置文件,用于定义构建Docker镜像所需的步骤。通过使用`docker build`命令,用户可以将Dockerfile中的一系列指令转换成一个可执行的Docker镜像。 ... [详细]
  • IIS 7 访问 .ashx 文件时出现 404 错误的解决方案
    本文详细介绍了在 IIS 7 环境下访问 .ashx 文件时遇到 404 错误的问题及其解决方案,包括检查和配置处理程序映射以及确保 .NET Framework 正确注册到 IIS。 ... [详细]
author-avatar
姓赵的妖女
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有