信息安全系统设计基础第6周学习总结
处理器体系结构
ISA(指令集体系结构) 一个处理器支持的指令和指令的字节级编码
ISA为编译器编写者和处理器设计人员提供了概念抽象层
编译器编写者只需做对允许哪些指令,及其是如何编码的;
处理器设计者必须建造出这些指令的处理器。
一、Y86指令集体系结构
1.程序员可见状态
- Y86程序中的每条指令都会读取或修改处理器状态的某些部分
2.存储器
- 概念上说就是一个很大的字节数组,保存着程序和数组
具体的处理器状态:类似于IA32
- 有8个程序寄存器,%eax,%ecx,%edx,%ebx,%esi,%edi,%esp,%ebp
- 处理器的每个程序寄存器存储一个字
- 寄存器%esp被入栈、出栈、调用和返回指令作为栈指针。在其他情况下,寄存器没有固定的含义或固定值。
- 有三个一位的条件码:ZF,SF,OF,程序计数器PC存放当前正在执行指令的地址。
状态码stat
它表明程序执行的总体状态,会指示是正常运行还是出现了某种异常。
Y86指令集基本上是IA32指令集的一个子集,只包括四字节整数操作,寻址方式比较少,操作也较少
3.Y86指令
(1)不同Y86的细节
-
movl的4个不同指令irmovl、rrmovl、 mrmovl、rmmovl
(i——立即数,r——寄存器,m——存储器)
-
整数操作指令 opl : addl subl andl xorl
-
跳转指令
-
条件传送指令
-
call与ret
-
pushl popl
-
halt指令停止指令的执行。导致处理器停止
(2)指令编码
每条指令需要1—6字节不等,这取决于需要哪些字段,每条指令的第一个字节表明指令的类型。这个字节分两部分,每部分分4位:高4位是代码部分0-0xB,低4位是功能部分,功能 值只有在一组相关指令公用一个代码时才有用。
PS: 分支指令和调用指令的目的地址是一个绝对地址
所有整数采用小端法编码
4.Y86异常
状态码Stat的可能取值:
1. AOK
正常操作
2. HLT
处理器执行
halt
指令
3. ADR
遇到非法地址
4. INS
遇到非法指令
5.Y86程序
Y86和IA32区别:
1.Y86
有时需要两条指令来完成
IA32
一条指令就能完成的事
2.Y86
没有伸缩寻址模式
注意:
(1)命令指明应该将代码或数据放在什么位置,以及该如何对齐
(2)以“.”开头的是汇编器命令
(3)创建Y86代码的唯一工具是汇编器,所以程序员必须执行本来通常交给编译器、链接器和运行时系统来完成的任务。
特指popl和pushl,在压入/弹出栈指针%esp的时候,有两种不同的约定:
1.
压入
/
弹出
%esp的原始值2.
压入
/
弹出
%esp-/+4后的值
默认压入弹出的都是原始值。
pushl在不同的x86模型之间有歧义,但是popl没有。
二、 逻辑设计和硬件控制语言HCL
- 逻辑门只对单个位的数进行操作,而不是整个字。
- 逻辑门总是活动的,输入变化输出很快就跟着变化。
1.组合电路和HCL布尔表达式
构建计算块(组合电路)时的限制
- 两个或多个逻辑门的输出不能连接在一起
- 必须无环
- 组合电路的输出会持续响应输入变化,c语言表达式只有在执行过程中被遇到才求值
- 逻辑门只对0和1操作,c语言表达式中参数可以是任意整数,0是FALSE,不是0的都是TRUE
- c的逻辑表达式可能被部分求值
字级的组合电路和HCL整数表达式
- 所有字级的信号都声明为int,不指定字的大小
2.集合关系
判断集合关系的通用格式是:
iexpr
in{iexpr1,iexpr2,
...,iexprk}
iexpr等都是整数表达式。
3.存储器和时钟
对应EDA学习时的时序逻辑电路
(1)时序电路的两类存储器设备:
- 时钟寄存器(简称寄存器):储存单个位或字。
- 随机访问储存器(简称储存器):储存多个字,用地址选择该读/写哪个字。
- 寄存器分为“硬件寄存器”和“程序寄存器”。
(2)Y86处理器
三、Y86的顺序实现
SEQ处理器
将处理组织成阶段
六个基本阶段:取指、译码、执行、访存、写回、更新PC
(1)针对OPl(整数和逻辑运算),rrmovl(寄存器-寄存器传送)和irmovl(立即数-寄存器传送)
(2)针对rmmovl和mrmovl
(3)针对pushl和popl
(4)针对跳转,call和ret
1.SEQ硬件结构
.SEQ抽象视图的画法:
2.硬件单元是与各个处理阶段相关联的
有六个基本阶段
2.SEQ的时序
SEQ的实现包括组合逻辑和两种存储器设备:
1.
时钟寄存器——程序计数器和条件码寄存器
2.
随机访问存储器——寄存器文件、指令存储器和数据存储器
对于上面提到的五个硬件单元,可以分成两类:
1.
组合逻辑——指令存储器
2.
时序——剩下四个
剩下四个中:
条件码寄存器——只在执行整数运算指令时装载
数据存储器——只在执行
rmmovl
、
pushl
或
call时写入
寄存器文件——两个写端口允许每个时钟周期更新两个程序寄存器。特殊寄存器?
0xF表示此端口不应执行写操作。
Y86指令集下的组织原则:处理器从来不需要为了完成一条指令的执行而去读由该指令更新了的状态。
用时钟来控制状态元素的更新,值通过组合逻辑传播。
3.SEQ阶段的实现
在控制逻辑中必须被显式引用的常数:
- nop指令:PC+1,别的只经过不改变
halt指令:使处理器状态变为HLT,导致停止运行
1.取指阶段
以PC为第一个字节,读6个字节。
两个逻辑块(从第一个字节中分出,各四位)
icode-
指令代码
ifun-
指令功能
三个一位的信号(根据icode值计算)
instr_valid-
发现不合法的指令
need_regids-
包含寄存器指示符字节吗
need_valC-
包括常数字吗
后五个字节是寄存器指示符字节和常数字的组合编码。
(2)译码和写回阶段
都需要访问寄存器文件,根据四个端口的情况,判断应该读哪个寄存器产生信号valA、valB
(3)执行阶段
*包括算术/逻辑单元ALU,输出的是valE。
ALU常被用作加法器
*包括条件码寄存器
零,符号,溢出,产生信号set_cc
(4)访存阶段
- 读或者写程序数据。
两个数据块产生存储器地址和存储器输入证据的值,两个产生控制信号表明应该是读还是写。
- 根据icode,imem_error,instr_valid,dmem_error,从指令执行的结果计算状态码Stat。
(5)更新PC阶段
会产生程序计数器的新值。
参考资料:《深入理解计算机》、20135202同学的博客。
学习总结:本章内容较少,了解到ISA在处理器行为和如何实现处理器之间提供了一层抽象。ISA提供了程序执行。Y86指令集有RISC和CISC的属性的。构建SEQ处理器,其中每个时钟周期执行一条指令,它会通过五个阶段。在这周的实验楼作业里,就是按照步骤去做,YIS环境构建上,感觉有点问题,有的同学会出现一个红色(MASTER),而有的同学的没有,后来用了同学的虚拟机联网做出来了。
遇到的问题
问题:在一长串字节序列所编码的Y86指令序列中,分不清如何分段去看每个字节的含义,如4.2中的B.0x200:a06f80080200000030f30a00000090
解决在写学习报告的时候,又重新把书大致浏览了一遍,看到了《深入理解计算机系统》P233书中指令编码里写着:每条指令需要1—6字节不等,这取决于需要哪些字段,每条指令的第一个字节表明指令的类型。由此,我可以根据第一个字节的类型,判断其指令长度。