学习计时:共8小时
读书:3小时
代码:1小时
作业:2小时
博客:2小时
第四章处理器体系结构
我们看到的计算机系统只限于机器语言程序级
指令被编码为由一个或多个字节序列组成的二进制格式——指令集体系结构(ISA)
设计处理器:基于顺序操作,功能正确,有点不实用,时钟必须足够慢。
创建一个流水线化的处理器,处理冒险或冲突
冒险:一条指令的位置或操作数依赖于其他仍在流水线中的指令
Y86处理器:硬件构造块,结构构造模块
4.1 Y86指令集体系结构
定义:各种状态元素、指令集和编码,一组编程规范和异常事件处理
4.1.1 程序员可见的状态
程序员可见状态:每条指令都会读取或修改处理器状态的某些部分
Y86处理器类似于IA32,有8个程序寄存器
每个程序寄存器存储一个字
3个一位的条件码:ZF、SF、OF
存储器:一个很大的字节数组,保存着程序和数据
Y86用虚拟地址引用储存器的位置
虚拟地址会被翻译成物理地址
状态码Stat:程序执行的总体状态,正常or异常
4.1.2 Y86指令
是IA32指令集的一个子集,只包括四字节整数操作
详见P232图4-2
Movl指令:irmovl、rrmovl、mrmovl、rmmovl
第一字母:源 i:立即数 r:寄存器 m:储存器
第二字母:目的 r:寄存器 m:储存器
储存器引用方式:基址和偏移量形式
4个整数操作指令OPl:addl、subl、andl、xorl,只对寄存器数据进行操作
7个跳转指令:jmp、jle、jl、je、jne、jge、jg,根据分支指令的类型和条件码的设置来选择分支
6个条件传送指令:cmovle、cmovl、cmove、cmovne、cmovge、cmovg
Call指令将返回地址入栈,然后跳到目的地址
Pushl:入栈 popl:出栈
Halt指令停止指令的执行
4.1.3 指令编码
每条指令的第一个字节表明指令的类型
高4位:代码 低四位:功能
Rrmovl:无条件传送,功能代码0
寄存器标识符0-7
程序寄存器存在CPU中的一个寄存器文件中
寄存器指示符字节:指示一个或两个寄存器
有些指令需要附加4字节的常数字
4.1.4 Y86异常
程序员可见的状态包括状态码Stat,描述程序执行的总体状态
1 AOK 正常
2 HLT 处理器执行halt指令
3 ADR 遇到非法地址
4 INS 遇到非法指令
处理器会调用一个异常处理程序。
4.1.5 Y86程序
.开头的命令是汇编器命令:调整地址
.pos0:从地址0开始产生代码
初始化栈指针,帧指针
YIS:指令集模拟器
4.1.6 一些Y86指令的详情
Pushl:栈指针减4,并且将一个寄存器值写入存储器中。
处理器的行为不确定
两种约定:1.压入%esp的原始值 2.压入减去4的%esp的值
4.2 逻辑设计和硬件控制语言HCL
三个组成部分:计算对位进行操作的函数的组合逻辑、存储位的存储器元素、控制存储器元素更新的时钟信号
4.2.1 逻辑门
AND OR NOT
4.2.2 组合电路和HCL布尔表达式
组合电路
两条限制:
两个或多个逻辑门的输出不能连接在一起,否则可能会使线上的信号矛盾,可能会导致一个不合法的电压或电路故障
这个网必须是无环的。
多路复用器:根据输入控制信号的值
组合逻辑电路与C语言中逻辑表达式的区别:
- 组合电路:输出会持续的响应输入的变化
C表达式:遇到才求值
- C表达式:允许参数是任意整数,0表示FALSE,其他都是TURE
组合电路:只对位0,1进行操作
- C表达式可能只被部分求值
4.2.3 字级的组合电路和HCL整数表达式
在HCL中,将所有的字级信号都声明为int,不指定字的大小,每个字都可以声明为有特定的位数
在画字级电路的时候,用中等粗度的线来表示携带字的每个位的线路,用虚线表示布尔信号结果
多路复用函数用情况表达式来描述
选择表达式可以是任意的布尔表达式,可以有任意多的情况
情况表达式能描述带复杂选择标准的,多种输入信号的块。
4.2.4 集合关系
判断集合关系的通用格式:
Iexpr in{iexpr1,iexpr2,…,iexprk}
都是整数表达式
4.2.5 储存器和时钟
由一个时钟控制
时钟寄存器:存储单个位或字,时钟信号控制寄存器加载输入值
随机访问寄存器:存储多个字,用地址来选择该读或该写哪个字
硬件寄存器,程序寄存器
寄存器文件有两个读口端,一个写口端,允许同时进行多个读或写操作
处理器还包括另一个只读储存器
两个储存器合并为一个具有双端口的储存器:一个用来读指令,另一个用来读或写数据
4.3 Y86的顺序实现
每个时钟周期上,SEQ执行处理一条完整指令所需的所有步骤
4.3.1 将处理组织成阶段
取址,译码,执行,访存,写回,更新PC
以一种统一的方式处理所有的跳转指令,它们只在判断是否要选择分支的时候不同
在执行阶段,检查条件码和跳转条件来确定是否要选择分支,产生出一个位信号Cnd
在更新PC阶段,检测这个标志
1:PC设为valC(跳转目标)
2:PC设为valP(下一条指令的地址)
4.3.2 SEQ硬件结构
同各个阶段相关的硬件单元负责执行这些处理
在右边,反馈线路向下,包括要写到寄存器文件的更新值,以及更新的程序计数器值
取址,译码,执行,访存,写回
浅灰色方框表示硬件单元
控制逻辑块是用灰色圆角矩形表示的
线路的名字在白色椭圆中说明
宽度为字长的数据连接用中等粗细的线表示
宽度为字节或更窄的数据连接用细线表示
单个位的连接用虚线来表示
4.3.3 SEQ的时序
一个时钟变化会引发一个经过组合逻辑的流,来执行整个指令
SEQ的实现包括组合逻辑和两种存储器设备
时钟寄存器(程序计数器和条件码寄存器),随机访问储存器(寄存器文件、指令存储器和数据存储器)
处理器从来不需要为了完成一条指令的而去读由该指令更新了的状态
4.3.4 SEQ阶段的实现
Nop指令:除了将PC加1,不进行任何处理
Halt指令:使得处理器状态被设置为HLT,导致处理器停止运行
1、 取指阶段
包括指令存储器硬件单元。以PC作为第一个字节的地址,这个单元一次从存储器读出6个字节,第一个字节被解释为指令字节(Split)
Icode:控制逻辑块计算指令
Ifun:功能码
当指令地址不合法,这些值对应于nop指令
2.译码和写回阶段
寄存器文件有四个端口
支持同时进行两个读或两个写
每个端口都有一个地址连接和一个数据连接
地址连接是一个寄存器ID,数据连接是一组32根线路
3.执行阶段
执行阶段包括算术\逻辑单元(ALU),对输入数据执行一系列运算
- 访存阶段
读或者写程序数据
两个控制块产生存储器地址和存储器输入数据的值
另外两个块产生控制信号表明应该执行读操作还是写操作
当执行读操作时,数据存储器产生值valM
- 更新PC阶段
会产生程序计数器的新值
- SEQ小结
问题:时钟必须非常慢,以使信号能在一个周期内传播所有的阶段
课后作业:
借鉴资料:《深入理解计算机系统》
问题:最后的课后作业make不能运行
心得:和上次不同,这次接触的基本都是全新的知识,也比较难于理解,课后题也不如以前的那么轻松,总之,理论知识很难,还需要多看几遍。