20145206 《信息安全系统设计基础》第6周学习总结
教材学习内容总结
1.流水线化的处理器:
将每条指令的执行分解成五步,每个步骤由一个独立的硬件部分或者阶段来处理。指令步经流水线的各个阶段,且每个时钟周期有一条新指令进入流水线。所以处理器可以同时执行五条指令的不同阶段。
2.程序员可见的状态:
Y86程序中的每条指令都会读取或者修改处理器状态中的某些部分。这称为程序员可见状态。
3.Stat
程序状态的最后一个部分是状态码Stat,它表明程序执行的总体状态;它会指示是正常运行还是出现了某种异常。
4.Y86
一个简单的、可以称之为IA32指令集的子集的指令集;只包括四字节整数操作,寻址方式比较少。指令编码长度从1——6字节不等。
关于指令结构,每条指令的第一个字节表明指令的类型;这个字节分为两个部分,每部分四位:高四位是代码部分(0——0xB),第四位是功能部分。这里补充一些缩写:立即数(i),寄存器(r)、存储器(m)。指令附加的寄存器指示符字节依次是数据源(如果是立即数,把这一位设置成0xf)、目的寄存器/基址寄存器。有些指令需要附加四字节的常数字,采用小端法(倒序)编码
5.stat代码可能取值反应了机器的不同状态——
- AOK:正常操作(除此之外的任何状态都会使得处理器停止执行指令)
- HLT:处理器执行halt指令
- ADR:遇到非法地址
- INS:遇到非法指令
6.命令指明应该将代码或者是数据放在什么位置等。
其中,以 .开头的是汇编器命令,它们告诉汇编器调整地址,以便在那儿产生代码或者是插入一些数据。
7.指令模拟器YIS是模拟Y86机器代码程序的执行而不用试图去模拟任何具体处理器实现的行为。
8.pushl会把栈指针减4,并将一个寄存器值写入存储器中。
因此,执行pushl %esp 和 popl %esp的结果是不固定的。
9.逻辑门是数字电路的基本计算元素。
逻辑门总是活动的,一旦一个门的输入变化了,在很短的时间内,输出就会相应地变化。
10.将很多的逻辑门组合成一个网,就能构建计算块,称为组合电路。限制:
两个或者多个逻辑门的输出不能连接在一起;
这个网必须无环
11.多路复用电路(MUX):根据输入控制信号的值,从一组不同的数据信号中选出一个。
12.关于HCL的几点说明
HCL中所有字级的信号都声明为int;
在画字级电路的时候,用中等粗度的线表示携带字的每个位的线路,用虚线来表示布尔信号的结果
在HCL中,表示默认情况(即所有条件都没有被选中的情况)一般用1
13.算术/逻辑单元(ALU):
根据控制输入的设置(0,1,2,3),电路会对数据输入执行不同的算数或者逻辑操作(+,-,&,^)。
14.时序电路
有状态并且在这个状态上进行计算的系统
15.时钟寄存器&随机访问存储器
时钟寄存器存储单个位或者字。时钟信号控制寄存器加载输入值
随机访问存储器存储多个字,用地址来选择该读入或者该写哪个字
16.Y86的顺序实现离不开SEQ处理器(顺序处理器)。
将处理一条指令的操作组织成一个特殊的阶段序列;可以设计一个充分利用硬件的处理器。
17.处理操作的阶段——
取指:从寄存器读取指令字节,地址为程序计数器的值。计算下一条指令地址等于PC中的值加上已取出指令的长度
译码:从寄存器文件中最多读出两个操作数
执行:ALU执行指明的操作、引用的有效地址或者是修改栈指针
访存:将数据写入存储器或者从存储器读出数据
写回:写两个结果到寄存器文件
更新PC:将PC设置成下条指令地址
18.关于一些指令的处理步骤
irmovl指令的处理与rrmovl类似,但是因为是长指令格式,所以程序计数器要加6
指令call和ret与之前的popl和pushl类似。对于指令call,我们要将valP也就是call之后的那条指令的地址压入栈中在更新PC阶段,将PC设置为valC,也就是调用目的地
19.SEQ的时序(逐步深化)
要控制处理器中活动的时序,只需要寄存器和存储器的时钟控制
除了指令存储器只用来读指令故而可以看作组合逻辑之外,剩余的程序计数器、条件码寄存器、数据存储器和寄存器文件需要通过一个时钟信号来控制(控制时序)
在每个时钟周期内,程序计数器都会装载新的指令地址;只有执行整数运算指令的时候,才会装载条件码寄存器。只有执行rmmovl,pushl,call时,才会写数据存储器。
Y86指令集的本质遵循这样一项组织原则:处理器从来不需要为了完成一条指令的执行而去读由该指令更新了的状态 【如何理解?也就是说,处理器所“经手”的指令中,如果有某些是可以改变机构状态的;那么一定先改变状态之后再执行指令。这样保证了操作的时序性(防止指令执行起来互相颠倒)】
20.SEQ阶段的实现
取指阶段包括指令存储器单元。一次从存储器中读出6个字节。第一个字节分为ocode,ifun。根据icode的值,计算:instrvalid(发现不合法指令),needregids,need_valC。instrvalid和imemerror在访存阶段被用来产生状态码。
SEQ中译码和写回阶段都需要访问寄存器文件。寄存器文件有四个端口,它支持同时进行两个读和两个写;每个端口都一个地址连接和数据连接。如果某个地址端口上的值为特殊标识符0xf,则表明不需要访问寄存器。
执行阶段包括算术/逻辑单元(ALU)。这个单元革命家alufun信号的设置,对输入aluA和aluB执行ADD,SUB,AND,XOR运算。ALU的输出就是valE信号。还包括条件码寄存器。每次运行时,ALU都会产生三个与条件码相关的信号——零,符号,溢出。用set_cc来控制是否应该更新条件码寄存器。
访存阶段。两个控制块产生存储器地址和存储器输入数据的值;另外两个块产生控制信号表明应该执行读操作还是写操作。
实验楼实验
·要求:课程QQ群中,或官网下载Y86模拟器,验证教材上不少于三个HCL代码;构建YIS环境:
cd ~/Code/shiyanlou_cs413 wget http://labfile.oss.aliyunce.com/courses/413/sim.tar tar -xvf sim.tar cd sim sudo apt-get install tk sudo ln -s /usr/lib/x86_64-linux-gnu/libtk8.6.so /usr/lib/libtk.so sudo ln -s /usr/lib/x86_64-linux-gnu/libtk8.6.so /usr/lib/libtk.so make
·构建YIS环境:
失败:
成功:
课后练习
1.确定下面的Y86指令序列的字节编码。.pos 0x100表明这段代码的起始地址应该是0x100
irmovl $15,%ebx
rrmovl %ebx,%ecx
loop:
rmmovl %ecx,-3(%ebx)
addl %ebx,%ecx
jmp loop
解答:
irmovl $15,%ebx ##30f30f000000
rrmovl %ebx,%ecx ##2031
loop:
rmmovl %ecx,-3(%ebx) ##4013fdffffff
addl %ebx,%ecx ##6031
jmp loop ##7008010000
注意最后一个指令:第一条指令需要6个字节,而第二条指令需要2个字节,因此,循环的目标地址为0x00000108.以反向顺序来写就是08 01 00 00.
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: ##proc: 0x208:30f30a000000 ##irmovl $10,%ebx 0x20e:90 ##ret C. 0x300:505407000000 ##mrmovl 0x7(%esp),%ebp 0x306:10 ##nop 0x307:f0 ##非法 0x308:b01f ##popl %ecx
3.修改P238图4-6中的Y86代码,使其能计算一个数组的绝对值的和。内循环中使用条件传送。
源代码:
int Sum(int *Start,int Count) { int sum = 0; while(Count) { sum+=*Start; Start++; Count--; } return sum; }
改动之后:
loop: mrmovl (%ecx),%esi irmovl $0,%edi subl %esi,%edi cmovg %edi,%esi addl %esi,%eax irmovl $4,%ebx addl %ebx,%ecx irmovl $-1,%ebx addl %ebx,%edx jne loop
4.写出信号xor的HCL表达式。输入为a和b
bool xor = (a && !b) || (!a && b)
与bool eq = (!a && !b) || (a && b)
的区别为,二者互补
5.写一个电路的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.1 4.2 4.3 部分,通过练习书上的习题,学习了Y86指令,HCL语言等,对于课本还要多阅读、理解,才能融会贯通,学以致用。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 0/0 | 1/2 | 20/30 | 学习了一些Linux核心命令 |
第二周 | 250/250 | 1/3 | 20/50 | 学习了vim编辑器基础 |
第三周 | 280/530 | 1/4 | 18/68 | 熟练在vim里编程并运行 |
第五周 | 300/830 | 1/5 | 15/83 | 学会生成汇编文件并查看 |
第六周 | 200/1030 | 1/6 | 12/95 | 了解Y86指令 |
参考资料
来源:https://www.cnblogs.com/ZouJR/p/5986346.html