文章目录
处理器体系结构
- 处理器必须执行一系列指令,一个处理器支持的指令和指令的字节级编码称为它的指令集体系结构(Instuction-Set Architecture, ISA)。
- 一个程序编译成在一个机器上运行,就不能再另一个机器上运行。
Y86-64指令集体系结构
- 自定义一个指令集体系结构包括:状态单元、指令集和它们的编码、一组编程规范和异常事件处理。
程序员可见状态
-
Y86-64程序中的每条指令都会读取或修改处理器状态的某些部分称为程序员可见状态。
-
“程序员”既可以是用汇编写代码的人,也可以是机器的编译器。
-
Y86-64为X86-64的简化模式:
Y86-64指令
Y86-64指令细节:
-
moveq
指令分成了4个不同的指令:irmovq、rrmovq、mrmoveq和rmmovq。
第一个字母为源:i为立即数,r为寄存器,m为内存
第二个字母为目的:r为寄存器,m为内存
内存传送指令中的内存引用方式是简单地基址和偏移量形式。
不允许从一个内存地址直接传送到另一个内存地址,也不运行将立即数传送到内存。
-
4个整数操作指令:addq、subq、andq、xorq,只对寄存器进行操作,会设置3个状态码ZF、SF、OF(零、符号和溢出)
-
7个跳转指令:jmp、jle、jl、je、jne、jge、jg
-
6个条件传送指令: cmovle、 cmovl、cmove、cmovne、cmovge、cmovg。
-
call指令将返回地址入栈,然后跳到目的地址。ret指令从这样的调用中返回
-
pushq和popq指令实现了入栈和出栈。halt指令停止指令的执行.
指令编码
-
每条指令需要1~10个字节不等,第一个字节表明指令的类型,这个字节分为两部分:高4位是代码部分,底4位是功能部分。
-
寄存器中每个都有一个对应的范围在0到0xE之间的寄存器标识符(register ID),0XF表示无寄存器。
-
程序寄存器存在CPU中的一个寄存器文件中,这个寄存器文件就是一个小的、以寄存器ID作为地址的随机访问存储器。
-
没有寄存器操作数的指令如:分支指令和call指令,就没有寄存器指示符字节(指定一个或两个寄存器)。只需要一个寄存器操作数的指令(irmovq、pushq和popq)将另一个寄存器指示符设为0XF.
-
指令集的一个重要性质就是字节编码必须有唯一的解释。任意一个字节序列要么是一个唯一的指令序列的编码,要么就不是一个合法的字节序列。
Y86-64 异常
-
程序员可见状态包括状态码Stat——描述程序执行的总体状态。
-
1表示程序正常执行,其它都表示发生异常
-
2表示处理器执行了一条halt指令,终止处理器
-
3表示读或者写的内存地址非法
-
4表示遇到了非法的指令代码
-
处理器通常会调用一个异常处理程序处理异常
逻辑设计和硬件控制语言HCL
- 逻辑1是用1.0伏特左右的高电压表示,0用0.0伏特左右的低电压表示
逻辑门
-
AND用&&表示,OR用||,NOT用!表示,逻辑门运算符只对单个位的数进行操作
-
逻辑门总是活动的(activate)。一旦一个门输入变化,在很短的时间内,输出就会相应的变化。
组合电路和HCL布尔表达式
将多个逻辑门组合成一个网,就能构建计算快,称为组合电路。
构建规则:
-
每个逻辑门的输入必须满足下述之一:
- 一个系统输入(称为主输入)
- 某个存储单元的输出
- 某个逻辑门的输出
-
多个逻辑门的输出不能连接在一起。
-
这个网必须是无环的。
-
多路复用器:根据输入控制信号的值,从一组不同的信号中输出一个。
字级的组合电路和HCL整数表达式
-
讲逻辑门组合成大的网,构造出能计算更加复杂函数的组合电路
-
使用位级相等组合电路组合成字级组合电路:测试两个64位字A和B是否相等。
-
将所有字级的信号都声明为int, 不指定字的大小。
-
在画字级电路的时候,用中等粗度的线来表示携带字的每个位的线路,用虚线表示布尔信号的结果。
-
在HCL中,多路复用函数是用情况表达式描述的:
每种情况i都有一个布尔表达式select i 表明什么时候该选择这种情况和一个整数表达式expri表明得到的值。
-
算数/逻辑单元(ALU)是一种很重要的组合电路:
存储器和时钟
-
时序电路:有状态并且在这个状态上进行计算的系统,引入按位存储信息的设备。
-
存储设备都是由同一个时钟控制的,时钟是一个周期性信号,决定什么时候要把新值加载到设备中。
-
时钟寄存器(简称寄存器)存储单个位或字节。时钟信号控制寄存器加载输入值。
-
**随机访问存储器(内存)**存储多个字,用地址选择该读或该写哪个字。
-
大多数时候,寄存器都保持在稳定状态(用x表示),产生的输出等于它当前的状态。当遇到新的寄存器输入,且时钟是上升沿(高电位),新的输入信号就称为寄存器的新的状态并输出新的状态直到遇到下一个时钟上升沿。
Y86-64的顺序实现
-
取指(fetch):取指阶段从内存读取指令字节,地址为程序计数器(PC)的值。
-
译码(decode):从寄存器文件读入最多两个操作数。
-
执行(execute):在执行阶段,算术/逻辑单元(ALU)要么执行指令指明的操作,计算内存引用的有效地址,要么增加或减少指针。
-
访存(memory):访存阶段可以将数据写入内存,或者从内存读出数据。
-
写回(write back):写回阶段最多可以写两个结果到寄存器文件。
-
更新PC(PC update): 将PC设置成吓一跳指令的地址。
-
白色方框表示时钟寄存器。
-
浅蓝色方框表示硬件单元。
-
控制逻辑块用灰色圆角矩形表示。
-
线路的名字在白色圆圈中说明。
-
宽度为字长的数据连接用中等粗度的线表示。
-
宽度为字节或更窄的数据连接用细线表示。
-
单个位的连接用虚线表示。
流水线的通用原理
- 流水线的一个重要特性就是提高了系统的吞吐量,也就是单位时间内执行的指令数量。
- 但是流水线也会轻微的增加延迟,延迟的单位为ps(皮秒:e-12秒),从头到尾执行一条指令所需的时间称为延迟。
- 吞吐量的单位为每秒千兆条指令(GIPS),也就是每秒十亿条指令。
- 流水线阶段之间的指令转移是由时钟信号来控制的,随着时钟周而复始地上升和下降,不同的指令就会通过流水线的各个阶段,不会互相干扰。
流水线的局限性
- 不一致的划分
- 运行时钟的速率是由最慢的阶段延迟限制的。
- 流水线过深,收益反而下降
- 当流水线过深组合逻辑被分成较小的块,但是由寄存器更新引起的延迟就成为了一个限制因素。
带反馈的流水线系统
- 指令之间可能是相关(数据相关,逻辑相关)的,这些相关都是由反馈路径来解决的,这些反馈将更新了的寄存器值向下传送到寄存器文件,将新的PC值向下传送到PC寄存器。