20145223 《信息安全系统设计基础》第6周学习总结
教材学习内容总结——处理器体系结构
ISA——在编译器编写者和处理器设计者之间提供了一个抽象。
·计算机中的指令被编码为由一个或多个字节序列组成的二进制格式,一个处理器支持的指令和指令的字节级编码称为它的**指令集体系结构(ISA)**
·ISA模型看上去是**顺序**指令执行,实际上为了提高处理器的性能,并且保持处理器能达到同顺序执行相同的效果,人们会采用一些特殊的机制(比如web浏览器或平衡二叉树和哈希表这样的信息检索数据结构中使用缓存)
.流水线化的处理器
将每条指令的执行分解成五步,每个步骤由一个独立的硬件部分或者阶段来处理。指令步经流水线的各个阶段,且每个时钟周期有一条新指令进入流水线。所以处理器可以**同时执行五条指令的不同阶段**。
为了使这个处理器保留Y86 ISA的顺序的性质,就要求处理很多冒险和冲突情况,冒险就是一条指令的位置或操作数依赖于其他仍在流水线中的指令。
Y86指令体系结构
1:程序员可见状态:Y86程序中的每条指令都会读取或者修改处理器状态中的某些部分。
Y86的处理器状态类似于IA32,有八个程序寄存器:%eax.%ecx.%edx.%ebx.%esi.%edi.%esp和%ebp,处理器的每个程序寄存器存储一个字
寄存器%esp被入栈、出栈、调用和返回指令作为栈指针。在其他情况下,寄存器没有固定的含义或固定值。
有三个一位的条件码:ZF,SF,OF,它们保存最近的算术或洛基指令所造成英雄的有关信息。
程序计数器PC存放当前正在执行指令的地址。
存储器:概念上来说是一个保存程序和数组的很大的字节数组,Y86程序用虚拟地址来引用存储器位置,硬件和操作系统软件联合起来将虚拟地址翻译成实际或物理地址。
状态码Stat:程序状态的最后一个部分是状态码Stat,它表明程序执行的总体状态;它会指示是正常运行还是出现了某种异常。
2:Y86指令
**movl指令**: IA32的movl指令分为四种:irmovl,rrmovl,mrmovl,rmmovl 前面的两个字母是在显式的指定源操作数和目的操作数的格式,第一位是源操作数,第二位是目的操作数。
源操作数 可以是:i-立即数 r-寄存器 m-存储器 目的操作数 可以是:r-寄存器 m-存储器
**寻址方式不支持第二变址寄存器和任何寄存器值的伸缩,两个操作数不能都是来自存储器,也不允许将立即数传送到存储器**
**四个整数操作指令** addl 加 subl 减 andl 与 xorl 异或 并且它们只对寄存器数据进行操作(IA32允许对存储器数据进行这些操作)。
这些指令会设置三个条件码:ZF-零 SF-符号 OF-溢出
**七个跳转指令**根据分支指令的类型和条件码的设置来选择分支,分支条件和IA32一样。
**六个条件传送指令** cmovle cmovl cmove cmovne cmovge cmovg 这些指令的格式与寄存器-寄存器传送指令rrmovl一样,只有当条件码满足所需要的约束时,才会更新目的寄存器的值。
**call** call指令将返回地址入栈,然后跳到目的地址,**ret** 从这样的过程调用中返回。
**pushl和popl** 实现入栈和出栈
**halt指令** 停止指令的执行,执行此指令会导致处理器停止,并将状态码设置为HLT。
3.指令编码:每条指令的第一个字节表示指令类型,字节高四位是代码部分,低四位是功能部分。
4.Y86异常
值 | 名字 | 含义 |
---|---|---|
1 | AOK | 正常操作(除此之外的任何状态都会使得处理器停止执行指令) |
2 | HLT | 处理器执行halt指令 |
3 | ADR | 遇到非法地址 |
4 | INS | 遇到非法指令 |
5.一些Y86指令的详情
pushl会把栈指针减4,并将一个寄存器值写入存储器中
逻辑设计和硬件控制语言HCL
1.逻辑门:只对单个位的数进行操作而不是整个字
AND——&&
OR——||
NOT——!
2.将很多的逻辑门组合成一个网,就能构建计算块,称为组合电路。
两个或者多个逻辑门的输出不能连接在一起;
这个网必须无环
3.多路复用电路(MUX):根据输入控制信号的值,从一组不同的数据信号中选出一个。
4.HCL中所有字级的信号都声明为int,不指定字的大小。
5.存储器和时钟
两类存储器设备:
**时钟寄存器(寄存器):**存储单个位或者字。
**时钟信号控制寄存器(存储器):**加载输入值 随机访问存储器存储多个字,用地址来选择该读入或者该写哪个字。
Y86的顺序实现
1.将处理组织成阶段:
**取指(fetch):**
取值阶段从存储器读取指令字节,放到指令存储器(CPU中)中,地址为程序计数器(PC)的值。
它按顺序的方式计算当前指令的下一条指令的地址(即PC的值加上已取出指令的长度)
**译码(decode):**
ALU从寄存器文件(通用寄存器的集合)读入最多两个操作数。(即一次最多读取两个寄存器中的内容)
**执行(execute):**
在执行阶段会根据指令的类型,将算数/逻辑单元(ALU)用于不同的目的。对其他指令,它会作为一个加法器来计算增加或减少栈指针,或者计算有效地址,或者只是简单地加0,将一个输入传递到输出。
条件码寄存器(CC)有三个条件位。ALU负责计算条件码新值。当执行一条跳转指令时,会根据条件码和跳转类型来计算分支信号cnd。
**访存(memory):**
访存阶段,数据存储器(CPU中)读出或写入一个存储器字。指令和数据存储器访问的是相同的存储器位置,但是用于不同的目的。
**写回(write back):**
写回阶段最多可以写两个结果到寄存器文件。寄存器文件有两个写端口。端口E用来写ALU计算出来的值,而端口M用来写从数据存储器中读出的值。
更新PC(PC update):
根据指令代码和分支标志,从前几步得出的信号值中,选出下一个PC的值。
2.SEQ抽象视图:
Y86模拟器安装过程中的问题和解决过程
参考博客:
Y86模拟器安装 - 20145307陈俊达 - 博客园
Y86模拟器安装20145218
遇到的问题:在官方网站下可以看到chapter4,可以看到source distribution项目,下载所需要的源文件。用tar xf sim.tar命令进行解压出现无法打开的错误:
解决过程:
1:用cd ~
和ls
查看,发现Home目录当中并没有下载的sim.tar文件:
2:打开firefox下载文件所在的文件夹,找到sim.tar并把它拖入到主文件夹Home中:
3:再次用cd ~
和ls
便可以看见目录中已经有了下载的sim.tar,这时候就可以用tar xf sim.tar
命令对其进行解压了:
实验楼实验
1:Y86模拟器的安装
·在终端中输入sudo apt-get install bison flex
·下载sim解压。地址http://csapp.cs.cmu.edu/public/students.html
·在终端中输入sudo apt-get install tcl8.5-dev tk8.5-dev tcl8.5 tk8.5
·在解压后的sim文件夹中找到makefile文件,作如下改动:
GUIMODE=-DHAS_GUI
TKLIBS=-L/usr/lib/ -ltk8.5 -ltcl8.5
TKINC=-I /usr/include/tcl8.5
·在sim文件夹下右键选择在终端中打开,输入make clean;make
2:使用安装好的Y86模拟器
输入cd pipe
,再输入./psim -t -g ../y86-code/asum.yo
就可以用y86模拟器进行编译了:
运行的结果和书上p238页的结果一致:
同理,运行实验楼给出的asuml.yo:
运行的结果和书上p240页的YAS汇编器的输出结果一致:
本周代码托管
代码托管链接
其他(感悟、思考等,可选)
这周的内容主要就是学习计算机的指令体系结构ISA,重点学习了Y86处理器的体系结构,ISA在编译器编写者和处理器设计者之间提供了一个抽象。学习Y86处理器的目的在于了解它在整个计算机系统中是如何工作的,同时帮助我们了解整个计算机系统的运作。这一章里没有很多c语言代码帮助我们理解,我们需要结合之前所学过的汇编内容来学习Y86的汇编程序。一开始这些程序确实对于我这个初学者来说很难理解,但是结合书上对于代码的讲解,我觉得其实这些汇编语句并不是很难,它的每一条语句其实都和事前确定的规则相对应,需要我们多练习。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 4000行 | 20篇 | 400小时 | |
第0周 | 0/0 | 1/1 | 5/5 | |
第1周 | 0/0 | 1/2 | 10/15 | |
第2周 | 300/300 | 1/3 | 15/30 | |
第3周 | 200/500 | 1/4 | 10/40 | |
第5周 | 150/650 | 1/5 | 10/50 | |
第6周 | 50/700 | 1/6 | 8/58 |