20145203 《信息安全系统设计基础》第六周学习总结
第四章 处理器体系结构
教材学习内容总结
绪论
1、指令集体系结构:一个处理器支持的指令和指令的字节编码称为它的指令集体系结构。
2、HCL(硬件控制语言):描述硬件系统控制部分的简单语言。
第一节 Y86指令集体系结构
一、程序员可见的状态
1.含义:
每条指令都会读取或修改处理器状态的某些部分
2.“程序员”:
可以是用汇编代码写程序的人,也可以是产生机器级代码的编译器。
3.Y86处理器状态:类似于IA32
①有8个程序寄存器,%eax,%ecx,%edx,%ebx,%esi,%edi,%esp,%ebp
②处理器的每个程序寄存器存储一个字
③寄存器%esp被入栈、出栈、调用和返回指令作为栈指针。在其他情况下,寄存器没有固定的含义或固定值。
④有三个一位的条件码:ZF,SF,OF,它们保存最近的算术或逻辑指令所造成影响的有关信息。
⑤程序计数器(PC)存放当前正在执行指令的地址。
4.存储器
Y86程序用虚拟地址来引用存储器位置,硬件和操作系统软件联合起来将虚拟地址翻译成实际或物理地址
5.状态码stat
它表明程序执行的总体状态,会指示是正常运行还是出现了某种异常。
二、Y86指令
Y86指令集基本上是IA32指令集的一个子集,只包括四字节整数操作,寻址方式比较少,操作也较少。
1.movl指令
IA32的movl指令分为四种:irmovl(字节编码:30),rrmovl(20),mrmovl(50),rmmovl(40)
前面的两个字母是在显式的指定源操作数和目的操作数的格式,第一位是源操作数,第二位是目的操作数。
(1)源操作数
可以是:
i-立即数
r-寄存器
m-存储器
(2)目的操作数
可以是:
r-寄存器
m-存储器
※注意:①两个存储器传送指令中的存储器引用方式是简单的基址和偏移量形式,寻址方式不支持第二变址寄存器和任何寄存器值的伸缩②两个操作数不能都是来自存储器,也不允许将立即数传送到存储器
2.四个整数操作指令
Addl (60) 加
subl (61)减
andl (62)与
xorl (63)异或
并且它们只对寄存器数据进行操作(区别于IA32,后者还允许对存储器数据进行这些操作)。
这些指令会设置三个条件码:
ZF-零
SF-符号
OF-溢出
3.七个跳转指令——分支控制
jmp (70)直接跳转
Jle (71)(SF^OF)|ZF 有符号数≤
jl (72)SF^OF 有符号<
je (73)ZF 相等/零
jne (74)~ZF 不相等/非零
jge (75)~(SF^OF) 有符号≥
jg (76)~(SF^OF)&~ZF 有符号>
4.六个条件传送指令
Cmovle(21)
Cmovl (22)
Cmove (23)
Cmovne(24)
Cmovge(25)
Cmovg (26)
这些指令的格式与寄存器-寄存器传送指令rrmovl一样,但是只有当条件码满足所需要的约束时,才会更新目的寄存器的值。
5.call和ret
call指令将返回地址入栈,然后跳到目的地址,ret指令从这样的过程调用中返回。(?)
6.pushl和popl
入栈和出栈
7.halt指令
halt指令停止指令的执行,执行此指令会导致处理器停止,并将状态码设置为HLT。
与IA32相比:hlt指令与之类似,但是IA32的应用程序不允许使用这条指令,因为它会导致整个系统暂停运行。
三、指令的字节级编码
1.第一个字节:
这个字节分为两个部分,每个部分4位:
高四位:代码部分。
低四位:功能部分
总结:
①整数操作里代码部分均为6,功能部分区分addl,subl,andl,xorl
②分支指令里代码部分均为7
③传送指令里代码部分均为2,注意rrmovl归到了传送指令里,它们有相同的指令代码。
8个程序寄存器中每个都有相应的0~7的寄存器标识符,程序寄存器存在CPU中的一个寄存器文件中,这个寄存器文件就是一个小的、以寄存器id作为地址的随机访问存储器。
当需要指明不应访问任何寄存器时,用ID值0xF表示
2、附加的4字节常数字
这个字的用处:
1.irmovl的立即数数据
2.rmmol和mrmovl的地址指示符的偏移量
3.分支指令和调用指令的目的地址
注意
①没有寄存器操作数的指令,例如分支指令和call指令,就没有寄存器指示符字节。
②只需要一个寄存器操作数的指令(irmovl,pushl,popl)将另一个寄存器指示符设为0xF
③分支指令和调用指令的目的地址是一个绝对地址
④所有整数采用小端法编码
⑤指令集的重要性质:字节编码必须有唯一的解释
四、Y86异常
1.状态码Stat(程序执行的总体状态)的可能取值
1. AOK 正常操作
2. HLT 处理器执行halt指令
3. ADR 遇到非法地址
4. INS 遇到非法指令
2.出现异常时?
Y86——处理器停止运行指令。更完善的是调用一个异常处理程序例如调用一个用户自定义的信号处理程序。
五、Y86程序
1.Y86和IA32的区别
1.Y86有时需要两条指令来完成IA32一条指令就能完成的事
2.Y86没有伸缩寻址模式
2.注意:
①命令指明应该将代码或数据放在什么位置,以及该如何对齐
②以“.”开头的是汇编器命令
③创建Y86代码的唯一工具是汇编器,所以程序员必须执行本来通常交给编译器、链接器和运行时系统来完成的任务。
④popl和pushl,在压入/弹出栈指针%esp的时候,有两种不同的约定:
*1.压入/弹出%esp的原始值
*2.压入/弹出%esp-/+4后的值
经过试验,发现默认压入弹出的都是原始值。pushl在不同的x86模型之间有歧义,但是popl没有。
第二节 逻辑设计和硬件控制语言HCL
电子电路中,用1.0V左右的高电压表示逻辑1,用0.0V左右的低电压表示逻辑0.
一、逻辑门
1.逻辑门产生的输出,等于它们输入位值的某个布尔函数。
2.运算符号:
AND &&
OR ||
NOT !
3.逻辑门只对单个位的数进行操作,而不是整个字。
4.逻辑门总是活动的,输入变化输出很快就跟着变化。
二、组合电路和HCL布尔表达式
1.构建计算块(组合电路)时的限制
①两个或多个逻辑门的输出不能连接在一起
②必须无环
2.组合逻辑电路和c语言中逻辑表达式的区别
①组合电路的输出会持续响应输入变化,c语言表达式只有在执行过程中被遇到才求值
②逻辑门只对0和1操作,c语言表达式中参数可以是任意整数,0是FALSE,不是0的都是TRUE
③c的逻辑表达式可能被部分求值
三、字级的组合电路和HCL整数表达式
1、多路复用函数用情况表达式来描述,具体格式如下:
[
select_1 : expr_1
select_2 : expr_2
……
]
2、从逻辑上讲,这些选择表达式是顺序求值的。
①选择表达式为1时,表示如果前面没有情况被选中,就选择这种情况
②不同 选择表达式之间允许不互斥
四、集合关系
判断集合关系的通用格式是:
iexpr in {iexpr1,iexpr2,...,iexprk}
iexpr等都是整数表达式。
五、存储器和时钟
1.时序电路的两类存储器设备:
(1)时钟寄存器(简称寄存器):储存单个位或字。
(2)随机访问储存器(简称储存器):储存多个字,用地址选择该读/写哪个字。
(3)寄存器分为“硬件寄存器”和“程序寄存器”。
2.Y86处理器
它会用时钟寄存器保存程序计数器PC,条件代码CC和程序状态Stat。
第三节 Y86的顺序实现
SEQ处理器
一、将处理组织成阶段
(一)六个基本阶段:
- 取指
- 译码
- 执行
- 访存
- 写回
- 更新
具体过程如下:
①针对OPl(整数和逻辑运算),rrmovl(寄存器-寄存器传送)和irmovl(立即数-寄存器传送)
②针对rmmovl和mrmovl
③针对跳转,call和ret
④针对pushl和popl
二、SEQ硬件结构
1.SEQ抽象视图的画法:
- 程序计数器放在寄存器中,位于左下角PC。
- 信息随着线流动,方向是先向上再向右
- 反馈先祖在右边向下
- 所有硬件单元的处理都在一个时钟周期内完成。
- 浅灰色方块表示硬件单元
- 控制逻辑块是用灰色圆角矩形表示的
- 线路的名字在白色椭圆中说明
- 宽度为字长或更窄的数据连接用细线
- 单个位的连接用虚线
2.硬件单元是与各个处理阶段相关联的
有六个基本阶段
三、SEQ的时序
1、SEQ的实现包括组合逻辑和两种存储器设备:
①时钟寄存器——程序计数器和条件码寄存器
②随机访问存储器——寄存器文件、指令存储器和数据存储器
2、SEQ五个硬件单元,可以分成两类:
①组合逻辑——指令存储器
②时序——剩下四个
剩下四个中:
条件码寄存器——只在执行整数运算指令时装载
数据存储器——只在执行rmmovl、pushl或call时写入
寄存器文件——两个写端口允许每个时钟周期更新两个程序寄存器。特殊寄存器?0xF表示此端口不应 3、Y86指令集下的组织原则:处理器从来不需要为了完成一条指令的执行而去读由该指令更新了的状态。
4总结:用时钟来控制状态元素的更新,值通过组合逻辑传播。
四、SEQ阶段的实现
在控制逻辑中必须被显式引用的一些常数:
备注:
-
nop指令:PC+1,别的只经过不改变
-
halt指令:使处理器状态变为HLT,导致停止运行
1.取指阶段
以PC为第一个字节,读6个字节。
-
两个逻辑块(从第一个字节中分出,各四位)
icode-指令代码 ifun-指令功能
-
三个一位的信号(根据icode值计算)
instr_valid-发现不合法的指令 need_regids-包含寄存器指示符字节 need_valC-包括常数字
后五个字节是寄存器指示符字节和常数字的组合编码。
2.译码和写回阶段
都需要访问寄存器文件,根据四个端口的情况,判断应该读哪个寄存器产生信号valA、valB
3.执行阶段
(1)包括算术/逻辑单元ALU,输出的是valE。
ALU常被用作加法器
(2)包括条件码寄存器
零,符号,溢出,产生信号set_cc
4.访存阶段
- 读或者写程序数据。
两个数据块产生存储器地址和存储器输入证据的值,两个产生控制信号表明应该是读还是写。
- 根据icode,imem_error,instr_valid,dmem_error,从指令执行的结果计算状态码Stat。
5.更新PC阶段
会产生程序计数器的新值。
实验
①将课本第239页图4-7上的代码asum.yo,打印在屏幕上:
②用课本第251页图4-17,测试Y86
建立417.ys进入后,输入以下代码:
然后用make 417.yo编译,编译后用vim进入417.yo
代码调试中的问题和解决过程
①问题:在构建YIS环境时,解压虚拟机的 home/下载/文件夹中的压缩包时,显示找不到文件夹。
解决方法:将压缩包移到home主文件夹下,在进行解压就可以了。显然这是虚拟机的基本用法,证明我还不太熟悉虚拟机,还是需要下功夫的,相信很多同学和我一样。
②问题:找不到已安装好的YIS模拟器的单独窗口,我看其他同学发的教程中都有。
解决方法;尚未解决。
课后作业中的问题和解决过程
①课本p235页,练习题4.1。
注意:在字节编码的过程中涉及到一个有符号数的字节编码问题,题中的-3是这样表示的:fd ff ff ff
本周代码托管链接
其他(感悟、思考等,可选)
对于我来说,想要明白这一章讲什么,会做简单的练习题,我觉得还挺容易的。但是如果想要理解各个章节以及SEQ处理器每一步操作的的原理,我觉得还是很非常困难的。其实学到这里我发现我学习这门课程的时候,并不像学习java的时候感觉那么陌生。因为中间涉及到的一些知识,大一大二的时候已经接触过了。所以我建议大家学习的时候可以作类比,举一反三,这样理解起来相对比较容易。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 150/150 | 1/2 | 20/20 | |
第二周 | 200/350 | 1/2 | 24/44 | |
第三周 | 150/500 | 1/3 | 20/64 | |
第五周 | 300/800 | 1/4 | 15/79 | |
第六周 | 500/1300 | 1/5 | 20/99 |