微体系结构层


当CPU接收到一组0、1构成的二进制指令,准备去实现某项功能时,它有两种执行方法:

  1. 对于组合逻辑电路,这串二进制指令就是电路的控制信号,操控电路产生结果。
  2. 还有些场合,一串二进制指令实现不了某项功能,而是需要多串二进制指令共同作用,多次操作组合逻辑电路,最终产生正确的结果。这时候,这串二进制指令可能就是一个地址信息,从该地址顺序执行若干条二进制指令,这样一种方式称之为微体系结构。

一、微体系结构举例

阅读本节后回答以下问题:

  1. 为什么提出微体系结构
  2. 描述微体系结构
  3. 微指令的构成?如何实现跳转?

数据通路

微体系结构中,要执行多条指令的被控对象称之为数据通路,数据通路中的ALU控制信号的0、1组合就决定了数据通路的功能,可以把这组控制信号简单理解成操作码的一部分。
微体系结构层
微体系结构层
数据通路在一个周期内可以完成对同一个寄存器的读写,这需要一定的精巧设计

1.数据通路时序

微体系结构层

2.内存操作

数据通路处理数据的来源是内存,它与内存的通信方式有两种

  1. 由内存地址寄存器(MAR)和内存数据寄存器(MDR)控制,按字寻址
  2. 由PC寄存器控制,把一个字节读入MBR的低8位中,按字节寻址

例如把2放入PC寄存器,然后读内存将得到内存第二个字节的值,该值保存至MBR的低8位。而把2放入MAR然后读内存,结果是把字节8-11(第2个字)存入MDR。

总结来说,字节是寻址的最小单位。字是计算机一次处理数据的最大单位。 PC/MBR用于读取指令系统层的可执行程序,程序由字节为单位。MAR/MDR用于读取指令系统层的数据字,数据由字为单位。

但是,实际内存是面向字节的,即内存的物理地址按照字节计算的。针对32位的总线,把2放入MAR(读取第二个字),实际是把8放入MAR开始读取(从第8个字节开始读),也就是说字的实现需要采用某种映射方式。一种最为简单的映射方法是将MAR中的内容左移两位,再放到地址总线上。

微指令

为了控制一次数据通路,我们一条指令需要29个(24个)控制信号:

  1. 6个控制ALU和2个控制移位器的信号(一个选择左/右移的功能,另一个使能或者是时间脉冲)
  2. 9个来自C总线的数据写入寄存器的使能
  3. 9个输出到B总线的寄存器使能(不需要同时使能,因此可以用译码器使能,4个信号线即可)
  4. 2个MAR/MDR指示内存数据读写的信号
  5. 1个PC/MBR指示内存读写的信号

再加上一些附加字段(下一条指令),构成了36位的一条指令结构

微体系结构层

微指令控制

数据通路与控制数据通路的控制器,两者构成了完整的微体系结构
微体系结构层

  • 控制存储器保存着所有微指令,每条微指令构成一个字,对应一个地址,一个字36位,需要512个不同的地址。把控制存储的地址寄存器称为微程序计数器(MPC),数据寄存器称为微指令寄存器(MIR)
  • 微指令没有顺序执行的特性,按照指令中的下一条地址来跳转运行。当MIR加载并稳定后,MIR中的下一条指令地址信息加载到MPC中去了。
  • 说明下操作下一条指令地址的寄存器JAM。JAM寄存器有三位、JMPC、JAMN、JAMZ。当三位都为0时候,地址就是下一条指令的地址,当JAMN或者JAMZ置位后,下一条地址的情况就要取决于ALU此时的N状态或Z状态(状态标志位),JMPC置位实现MBR与Addr的相或,实现地址的跳转

二、如何用微指令实现指令系统层的指令

我们已经知道微指令是用来实现指令系统层的指令的,即完成一条指令系统层的指令需要运行多条微指令来实现。那么具体而言,一条指令系统层的指令是由哪些微指令构成,又是怎么运行的呢?阅读完本节你需要回答清楚这个问题。

我们必须挑选一个指令系统层的指令作为例子来阐述,本书挑选的是IJVM,即探如何用微指令Mic-1构成指令系统IJVM。

下文先阐述IJVM的特点,再阐述Mic-1构成IJVM的机理。

指令系统层IJVM的特性

由于指令系统层是由微指令构成的,那么了解指令系统层的特性就是了解微指令的特性。

概念一

函数(或者称为过程、方法)有自己的局部变量,局部变量也需要保存在内存中的某些位置,能用一个绝对地址保存局部变量么?

  • 不行,举个例子,函数嵌套调用时,需要保护现场,要把原本数据保存到其他地方,再调用嵌套函数。如果不保存,嵌套返回时,对应地址的信息就被破坏了。

因此选择了一块内存区域,称为栈,这一块区域的寄存器都没有自己的地址号,因为这块区域存储的数据是在反复进入/出去的。

形象地举个栗子:绝对地址思想就像是一个人在某个城市(内存)买了一套房子,这套房子只归这个人持有,他进行了一些房屋布置,买了些家居(函数执行),然后有一天原主人要长期出差,这套房子空出来了。有一天,有个人偷偷住进了这套房子,他根本不知道原主人的存在,于是他把旧家具丢了,重新进行了房屋布置(函数嵌套),住了一段时间这个人走了(嵌套的函数执行完了),这时候原主人出差回来了(返回现场),发现自己原本的装修都没有了。

想到一个更污的栗子:张三娶了一个老婆李四,每天过着性福的生活,某一天他突然被公司要求长期出差了。隔壁老王乘虚而入,也跟李四过上了性福的生活。老王有一天发生自己的精力不够了,他离开了李四。这时候张三出差回来了,当天晚上他正准备与李四成长一番,惆怅的发现,自己的尺寸好像不匹配了。

栈的思想就像一个公寓,反正没有房产权,你也不在乎地址的概念。现在来了一个人,他就住在第一间卧室里面,他布置了些家居。又来了另一个人,他于是住到第二件卧室去了,他也布置了些家居,但他不会影响到第一个住客,等到有一天他真的不想住了,他也就不需要他的家居了,于是他离开了。这样,第二间卧室又可以住进来新的租客了。

概念二

栈有两个指针(房屋管理人记录租客情况),寄存器LV指向当前过程的基地址,SP指向当前过程的最高一个字,LV与SP之间的数据结构成为局部变量结构
微体系结构层
概念三

栈的另一个用途是保存操作数,例如计算a1=a2+a3的过程如下
微体系结构层

IJVM的内存模型

IJVM没有直接可见的绝对内存地址,它是把内存分成了许多区域,然后提供各个区域的基地址,有以下区域:

  1. 常量池。寄存器CPP保存基地址
  2. 局部变量结构。寄存器LV保存基地址
  3. 操作数栈。看成局部变量结构的一部分,是在局部变量结构的上面开辟的一块区域
  4. 方法区,保存二进制程序。寄存器PC指向下一条指令

IJVM指令集

大致截图一下,看看结构就行了。
微体系结构层
重点看看函数调用与函数返回时,栈空间的变化。

  • 函数调用过程:原函数在执行,遇到了函数1调用,它先把指向函数1的指针压入栈,然后把函数1定义的局部变量入栈,最后执行INVOKEVIRTUAL。函数1局部变量上面有一块操作数栈,再上面才是函数1的第一条可执行的指令,先会保存现场(保存原函数的PC和LV),然后让LV指向当前局部变量空间的栈底。再之上就是新的调用函数2的栈结构了。
  • 函数返回过程:利用保存的原函数的LV、PC进行现场恢复
    微体系结构层微体系结构层
    最后我们看一下高级语言与指令系统层汇编语言的对应关系
    微体系结构层微体系结构层

微指令Mic-1如何构成指令系统IJVM

微指令是一串36位的二进制数,多串二进制数,构成了一条IJVM的指令。微指令的二进制数实际结构不方便讲解,我们给每一条二进制的微指令用一句话来代替,方便讲解。合法的话如下图所示,DEST、SOURCE就是数据通路图中的那些寄存器。

微体系结构层除了上面这张图,还有几句等效的语言:

  1. MAR/MDR读写数据用rd和wr表示。
  2. PC/MBR读写操作码,用fetch表示

做了上述假设后,可以看看如何用微指令实现指令系统层的指令了,部分截图如下:
微体系结构层

三、流水线思想

嵌入式CPU中,流水线的思想很重要,需要加以理解。最简单的理解就是,同一时间,微体系结构的不同部分能同时工作,处理不同批次的数据信息。
微体系结构层
还有七段流水线的思想。
微体系结构层