20145223《信息安全系统设计基础》第6周学习总结

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

参考资料

posted @ 2016-10-23 18:50  145223  阅读(258)  评论(1编辑  收藏  举报