20145212 《信息安全系统设计基础》第6周学习总结
教材学习内容总结
1.处理器体系结构
一个处理器支持的指令和指令的字节级编码称为它的指令集体系结构ISA。
2.Y86指令集体系结构
- 流水线化的处理器:
将每条指令的执行分解成五步,每个步骤由一个独立的硬件部分或者阶段来处理。指令步经流水线的各个阶段,且每个时钟周期有一条新指令进入流水线。所以处理器可以同时执行五条指令的不同阶段。有3个一位的调价吗:ZF、SF、OF,它们保存最近的算术或逻辑指令所造成影响的有关信息。 - 程序员可见的状态:
Y86程序中的每条指令都会读取或者修改处理器状态中的某些部分。这称为程序员可见状态。Y86程序中的每条指令都会读取或者修改处理器状态的某些部分这称为程序员可见状态。这里的"程序员"既可以是用汇编代码写程序的人,也可以是产生机器级代码的编译器。在处理器实现中,只要我们保证机器级程序能够访问程序员可见状态,就不需要完全按照ISA隐 - Y86指令:一个简单的、可以称之为IA32指令集的子集的指令集;只包括四字节整数操作,寻址方式比较少。指令编码长度从1——6字节不等。
halt:这个指令将会终止指令的执行。
nop:这是一个占位指令,它不做任何事情,后续为了实现流水线,它有一定的作用。
xxmovl:这是一系列的数据传送指令,其中r代表寄存器,m代表存储器,i代表立即数。比如rrmovl指令,则代表将一个寄存器的值,赋给另外一个寄存器。
opl:操作指令,比如加法,减法等等。
jxx:条件跳转指令,根据后面的条件进行跳转。
cmovxx:条件传送指令,后面的xx代表的是条件。特别的是,条件传送只发生在两个寄存器之间,不会将数据传送到存储器。
call与ret:方法的调用和返回指令。一个将返回地址入栈,并跳到目标地址。一个将返回地址入PC,并跳到返回地址。
push与pop:入栈和出栈操作。
3.stat代码
- Y86有四种不同的状态码
AOK:正常操作(除此之外的任何状态都会使得处理器停止执行指令)
HLT:处理器执行halt指令
ADR:遇到非法地址
INS:遇到非法指令
4.命令
(1)命令指明应该将代码或者是数据放在什么位置等。
(2)其中,以 .开头的是汇编器命令,它们告诉汇编器调整地址,以便在那儿产生代码或者是插入一些数据。
(3)指令模拟器YIS是模拟Y86机器代码程序的执行而不用试图去模拟任何具体处理器实现的行为。
5.逻辑门
- 逻辑门是数字电路的基本计算元素。
- 逻辑门产生的输出,等于它们输入位值的某个布尔函数。
- 逻辑门总是活动的,一旦一个门的输入变化了,在很短的时间内,输出就会相应地变化。
与 AND &&
或 OR ||
非 NOT !
- 将很多的逻辑门组合成一个网,就能构建计算块,称为组合电路。
6.关于HCL的几点说明
- HCL中所有字级的信号都声明为int;
- 在画字级电路的时候,用中等粗度的线表示携带字的每个位的线路,用虚线来表示布尔信号的结果
- 在HCL中,表示默认情况(即所有条件都没有被选中的情况)一般用1
7.算术/逻辑单元(ALU):
- 根据控制输入的设置(0,1,2,3),电路会对数据输入执行不同的算数或者逻辑操作(+,-,&,^)。
- 组合逻辑电路和c语言中逻辑表达式的区别:
(1)组合电路的输出会持续响应输入变化,c语言表达式只有在执行过程中被遇到才求值
(2)逻辑门只对0和1操作,c语言表达式中参数可以是任意整数,0是FALSE,不是0的都是TRUE
(3)c的逻辑表达式可能被部分求值
8.时序电路:
- 有状态并且在这个状态上进行计算的系统。
- 其两类存储器设备:
(1)时钟寄存器(简称寄存器):储存单个位或字。时钟信号控制寄存器加载输入值
(2)随机访问储存器(简称储存器):储存多个字,用地址选择该读/写哪个字。
9.SEQ处理器
- Y86的顺序实现离不开SEQ处理器(顺序处理器)
- 处理操作的阶段
取指:从寄存器读取指令字节,地址为程序计数器的值。计算下一条指令地址等于PC中的值加上已取出指令的长度
译码:从寄存器文件中最多读出两个操作数
执行:ALU执行指明的操作、引用的有效地址或者是修改栈指针
访存:将数据写入存储器或者从存储器读出数据
写回:写两个结果到寄存器文件
更新PC:将PC设置成下条指令地址
10.SEQ的时序(逐步深化)
- SEQ的实现包括组合逻辑和两种存储器设备:
1.时钟寄存器——程序计数器和条件码寄存器
2.随机访问存储器——寄存器文件、指令存储器和数据存储器
- 对于上面提到的五个硬件单元,可以分成两类:
1.组合逻辑——指令存储器
2.时序——剩下四个
- 剩下四个中:
条件码寄存器——只在执行整数运算指令时装载
数据存储器——只在执行rmmovl、pushl或call时写入
寄存器文件——两个写端口允许每个时钟周期更新两个程序寄存器。特殊寄存器?xF表示此端口不应执行写操作。
教材学习中的问题和解决过程
练习题4.2确定下列每一个字节序列所编码的Y86指令序列。如果有不合法字节,指出其位置。
A.
0x100:30f3fcffffff ##irmovl $-4,%ebx
0x106:406300080000 ##rmmovl %esi,0x800(%ebx)
0x10c:00 ##halt
B.
0x200:a06f ##pushl %esi
0x202:8008020000 ##call proc
0x207:00 ##halt
0x208:
0x208:30f30a000000 ##irmovl $10,%ebx
0x20e:90 ##ret
C.
0x300:505407000000 ##mrmovl 0x7(%esp),%ebp
0x306:10 ##nop
0x307:f0 ##非法
0x308:b01f ##popl %ecx
练习题4.8写出信号xor的HCL表达式。输入为a和b
bool xor = (a && !b) || (!a && b)
4.10写一个电路的HCL代码,对于输入字A,B,C,选择中间值。
int Med3 = [
A<=B && A>=C :A;
A<=C && A>=B :A;
B<=A && B>=C :B;
B<=C && B>=A :B;
1:C;
];
练习题4.11.根据图4-17中目标代码第9行call处理情况填写具体的处理阶段。
取指
icode:ifun<-M1[0x023]=8:0
valC<-M4[0x024] = 0x29
valP<-0x028
译码
valB<-R[%esp]=128
执行
valE<-128-4=124
写回
R[%esp]<-124
更新PC
PC<-0x029
效果是将%esp设置为124,将0x028(返回地址)存放到该存储器地址
练习题4.17写出SEQ中实现need_valC的HCL代码
bool need_valC = icode in {IIROMVL,IRMMOVL,IMRMOVL,IJXX,ICALL};
练习题4.19.寄存器IDdestM表明写端口M的目的寄存器,从存储器中读出来的值valM将放在那里。写出destM的HCL代码。
int dstM = [
icode in {IMRMOVL,IPOPL} :rA;
1:RNONE;
]
实验楼中的问题和解决过程
要求:下载Y86模拟器,验证教材上不少于三组HCL代码;构建YIS环境(操作性的代码见下);YIS手册下载;YIS测试
Ubuntu下Y86模拟器的安装
1.安装Tcl/Tk图形界面
sudo apt-get install tcl8.5-dev tk8.5-dev tcl8.5 tk8.5
2.安装bison和flex词法分析工具
sudo apt-get install bison flex
3.下载sim解压地址
wget http://labfile.oss.aliyuncs.com/courses/413/sim.tar
按实验楼步骤构建YIS环境的过程
wget http://labfile.oss.aliyunce.com/courses/413/sim.tar
tar -xvf sim.tar
sudo apt-get install tk
cd sim
中途增加一步:在sim文件夹中修改Makefile
#GUIMODE=-DHAS_GUI // 删掉#
TKLIBS=-L/usr/lib/ -ltk -ltcl // 在ltk和ltcl之后加上8.5
TKINC=-isystem/usr/include //将isystem改为大写的I,在最后加上/tcl8.5
sudo ln -s /usr/lib/x86_64-linux-gnu/libtk8.6.so /usr/lib/libtk.so
部分截图:
过程中出现了这样的错误:
发现错误原因是目录有问题,重新进入了目录之后,成功:
课本第239页图4-7上的代码,在系统中叫做asum.yo
自己电脑的虚拟机中的运行结果:
家庭作业
3.65
B取四的倍数的上整数 = 8,8+4+ (B2)取四的倍数的上整数 = 28,B可能为为7或者8。
2AB取四的上整数为44,所以AB可能21和22。
因此,A=3, B=7。
4.47
ebp<- M4[cur_ebp]
esp<- cur_ebp + 4
取指阶段
icode:ifun = D:0
valP<= PC + 1
译码阶段
valB <= R[%ebp]
执行阶段
valE<= valB + 4
访存阶段
valM <= M4[valB]
写回阶段
R[%esp] <= valE
R[%ebp] <= valM
本周代码托管
本周用到的c语言代码不多,还有一些是通过实验楼做的
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 0/0 | 1/2 | 10/10 | |
第二周 | 341/341 | 1/3 | 20/30 | |
第三周 | 177/518 | 2/5 | 16/46 | |
第五周 | 161/679 | 1/6 | 15/61 | |
第六周 | 73/752 | 1/7 | 15/76 |