• 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

    参考资料

  • 相关阅读:
    SPOJ Distinct Substrings(后缀数组求不同子串个数,好题)
    POJ 1743 Musical Theme(后缀数组+二分答案)
    HDU 6191 Query on A Tree(可持久化Trie+DFS序)
    swust oj 1052
    swust oj 1051
    swust oj 1016
    swust oj 1014
    swust oj 1013
    swust oj 1012
    swust oj 1011
  • 原文地址:https://www.cnblogs.com/20145223ymy/p/5988351.html
Copyright © 2020-2023  润新知