热门标签 | 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路)

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

推荐阅读
  • 雨林木风 GHOST XP SP3 经典珍藏版 V2017.11
    雨林木风 GHOST XP SP3 经典珍藏版 V2017.11 ... [详细]
  • 在安装Oracle 11g时,CentOS 6.5系统提示交换空间不足。本文详细介绍了如何通过两种方法增加交换空间,并提供了具体步骤和命令,帮助用户解决这一问题。 ... [详细]
  • 全面解析运维监控:白盒与黑盒监控及四大黄金指标
    本文深入探讨了白盒和黑盒监控的概念,以及它们在系统监控中的应用。通过详细分析基础监控和业务监控的不同采集方法,结合四个黄金指标的解读,帮助读者更好地理解和实施有效的监控策略。 ... [详细]
  • 本文详细介绍了Grand Central Dispatch (GCD) 的核心概念和使用方法,探讨了任务队列、同步与异步执行以及常见的死锁问题。通过具体示例和代码片段,帮助开发者更好地理解和应用GCD进行多线程开发。 ... [详细]
  • 本月初,我们为大家推荐了一系列精选书单,助力大家提升技术水平。月底,我们将介绍几位行业大牛,帮助大家找到人生导师。InfoQ一直致力于为用户提供有价值的资源和支持。 ... [详细]
  • 智能医疗,即通过先进的物联网技术和信息平台,实现患者、医护人员和医疗机构之间的高效互动。它不仅提升了医疗服务的便捷性和质量,还推动了整个医疗行业的现代化进程。 ... [详细]
  • vivo Y5s配备了联发科Helio P65八核处理器,这款处理器采用12纳米工艺制造,具备两颗高性能Cortex-A75核心和六颗高效能Cortex-A55核心。此外,它还集成了先进的图像处理单元和语音唤醒功能,为用户提供卓越的性能体验。 ... [详细]
  • 对于许多初学者而言,遇到总线错误(bus error)或段错误(segmentation fault/core dump)是极其令人困扰的。本文详细探讨了这两种错误的成因、表现形式及解决方法,并提供了实用的调试技巧。 ... [详细]
  • 了解计算机的序列号和主板型号对于多种用途至关重要。本文将详细介绍如何使用命令提示符和第三方工具,在Windows 10系统中轻松获取这些关键硬件信息。 ... [详细]
  • 本文深入探讨了MySQL中常见的面试问题,包括事务隔离级别、存储引擎选择、索引结构及优化等关键知识点。通过详细解析,帮助读者在面对BAT等大厂面试时更加从容。 ... [详细]
  • RStudio 1.4安装指南及使用说明
    RStudio 1.4 是一款强大的集成开发环境(IDE),专为 R 语言编程设计。它提供了简洁直观的用户界面和丰富的功能,能够显著提升数据科学家和程序员的工作效率。本文将详细介绍其安装步骤和主要特性。 ... [详细]
  • 你根本不会用百度
    本文转载自第2大脑,详情可以扫描下方二维码关注该公众号摘要:教你正确使用百度。想必你的朋友圈这两天应该被《搜索引擎百度已死》这篇文章刷屏了吧࿰ ... [详细]
  • 深入理解ExtJS:从入门到精通
    本文详细介绍了ExtJS的功能及其在大型企业前端开发中的应用。通过实例和详细的文件结构解析,帮助初学者快速掌握ExtJS的核心概念,并提供实用技巧和最佳实践。 ... [详细]
  • Python技巧:利用Cookie实现自动登录绕过验证码
    本文详细介绍了如何通过Python和Selenium库利用浏览器Cookie实现自动登录,从而绕过验证码验证。文章提供了具体的操作步骤,并附有代码示例,帮助读者理解和实践。 ... [详细]
  • 主调|大侠_重温C++ ... [详细]
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社区 版权所有