微体系结构层
微体系结构层
当CPU接收到一组0、1构成的二进制指令,准备去实现某项功能时,它有两种执行方法:
- 对于组合逻辑电路,这串二进制指令就是电路的控制信号,操控电路产生结果。
- 还有些场合,一串二进制指令实现不了某项功能,而是需要多串二进制指令共同作用,多次操作组合逻辑电路,最终产生正确的结果。这时候,这串二进制指令可能就是一个地址信息,从该地址顺序执行若干条二进制指令,这样一种方式称之为微体系结构。
一、微体系结构举例
阅读本节后回答以下问题:
- 为什么提出微体系结构
- 描述微体系结构
- 微指令的构成?如何实现跳转?
数据通路
微体系结构中,要执行多条指令的被控对象称之为数据通路,数据通路中的ALU控制信号的0、1组合就决定了数据通路的功能,可以把这组控制信号简单理解成操作码的一部分。
数据通路在一个周期内可以完成对同一个寄存器的读写,这需要一定的精巧设计
1.数据通路时序
2.内存操作
数据通路处理数据的来源是内存,它与内存的通信方式有两种
- 由内存地址寄存器(MAR)和内存数据寄存器(MDR)控制,按字寻址
- 由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个)控制信号:
- 6个控制ALU和2个控制移位器的信号(一个选择左/右移的功能,另一个使能或者是时间脉冲)
- 9个来自C总线的数据写入寄存器的使能
- 9个输出到B总线的寄存器使能(不需要同时使能,因此可以用译码器使能,4个信号线即可)
- 2个MAR/MDR指示内存数据读写的信号
- 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没有直接可见的绝对内存地址,它是把内存分成了许多区域,然后提供各个区域的基地址,有以下区域:
- 常量池。寄存器CPP保存基地址
- 局部变量结构。寄存器LV保存基地址
- 操作数栈。看成局部变量结构的一部分,是在局部变量结构的上面开辟的一块区域
- 方法区,保存二进制程序。寄存器PC指向下一条指令
IJVM指令集
大致截图一下,看看结构就行了。
重点看看函数调用与函数返回时,栈空间的变化。
- 函数调用过程:原函数在执行,遇到了函数1调用,它先把指向函数1的指针压入栈,然后把函数1定义的局部变量入栈,最后执行INVOKEVIRTUAL。函数1局部变量上面有一块操作数栈,再上面才是函数1的第一条可执行的指令,先会保存现场(保存原函数的PC和LV),然后让LV指向当前局部变量空间的栈底。再之上就是新的调用函数2的栈结构了。
- 函数返回过程:利用保存的原函数的LV、PC进行现场恢复
最后我们看一下高级语言与指令系统层汇编语言的对应关系
微指令Mic-1如何构成指令系统IJVM
微指令是一串36位的二进制数,多串二进制数,构成了一条IJVM的指令。微指令的二进制数实际结构不方便讲解,我们给每一条二进制的微指令用一句话来代替,方便讲解。合法的话如下图所示,DEST、SOURCE就是数据通路图中的那些寄存器。
除了上面这张图,还有几句等效的语言:
- MAR/MDR读写数据用rd和wr表示。
- PC/MBR读写操作码,用fetch表示
做了上述假设后,可以看看如何用微指令实现指令系统层的指令了,部分截图如下:
三、流水线思想
嵌入式CPU中,流水线的思想很重要,需要加以理解。最简单的理解就是,同一时间,微体系结构的不同部分能同时工作,处理不同批次的数据信息。
还有七段流水线的思想。