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

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

教材学习内容总结

Y86指令集体系结构

  • Y86:包括定义各种状态元素、指令集和它们的编码、一组编程规范和异常事件处理。
  • 程序员可见状态

    1、Y86程序中每条指令都会读取或修改处理器状态的某些部分。

    2、可以访问和修改程序寄存器、条件码、程序计数器和存储器,状态码指明程序是否运行正常。

    • 8个程序寄存器:%eax、%ecx、%edx、%ebx、%esi、%edi、%esp、%ebp。每个程序寄存器存储一个字。%esp被入栈、出栈、调用和返回指令作为栈指针。
    • 有3个一位的条件码:ZF、SF、OF,他们保存最近的算术或逻辑指令所造成影响的有关信息。
    • 程序计数器(PC)存放当前正在执行的地址。
    • 存储器:一个很大的字节数组,保存着程序和数据。
  • Y86指令

    1、只包括四字节整数操作。

    2、指令编码长度从1个字节到6个字节不等,一条指令含有一个单字节的指令指示符,可能含有一个单字节的寄存器指示符,还可能含有一个四字节的常数字。

    字段fn指明是某个整数操作(OPL)、数据移动条件(cmovXX)或是分支条件(jXX)。

    所有数值都用十六进制表示:

    3、IA32的movl指令分成了4个不同的指令:irmovl、rrmovl、mrmovl和rmmovl。分别显示地指明源和目的的格式:

    源操作数:立即数i、寄存器r、存储器m
    目的操作数:寄存器r、存储器m

    注意:

    (1)两个存储器传送指令中的存储器引用方式是简单的基址和偏移量形式。
    (2)在地址计算中,不支持第二变址寄存器和任何寄存器值的伸缩。
    (3)不允许从一个存储器地址直接传送到另一个存储器地址。也不允许将立即数传送到存储器。

    4、4个整数操作指令:addl、subl、andl、xorl

    5、7个跳转指令(jXX):jmp、jle、jl、je、jne、jge、jg

    6、6个条件传送指令(cmovXX):cmovle、cmovl、cmove、cmovne、cmovge、cmovg

    注意:只有当条件码满足所需要的约束时,才会更新目的寄存器的值。

    7、call指令将返回地址入栈,然后跳到目的地址。ret指令从这样的过程调用中返回。

    8、pushl和popl指令实现了入栈和出栈。执行pushl和popl指令时,处理器的行为是不确定的,因为要入栈的寄存器会被同一条指令修改。通常有两种约定:

    1)压入/弹出%esp的原始值
    (2)压入/弹出%esp-/+4后的值
    9、halt指令停止指令的执行。对于Y86来说,执行halt指令会导致处理器停止,并将状态码设置为HLT。
  • 指令编码

    1、每条指令的第一个字节表明指令的类型。这个字节分为两个部分,每部分4位:高4位是代码部分,低4位是功能部分。功能值只有在一组相关指令共用一个代码时才有用。

    (1)整数操作里代码部分均为6,功能部分区分addl,subl,andl,xorl
    (2)分支指令里代码部分均为7
    (3)传送指令里代码部分均为2

    2、8个程序寄存器中每个都有相应的0~7的寄存器标识符:

    程序寄存器存在一个寄存器文件中,这个寄存器文件就是一个小的、以寄存器ID作为地址的随机访问存储器。当需要指明不应访问任何寄存器时,用ID值0xF表示。

    3、分支指令和call指令没有寄存器操作数,就没有寄存器指示符字节。

    irmovl、pushl、popl指令只需要一个寄存器操作数,将另一个寄存器指示符设为0xF。

    4、指令集的一个重要性质就是字节编码必须有唯一的解释。

    所有整数采用小端法编码。当指令按反汇编格式书写时这些字节就以相反的顺序出现。
  • Y86异常

    出现异常时Y86处理器停止运行指令,也可以调用一个异常处理程序使其更完整。

    Y86状态码:

  • Y86程序

    1、Y86代码与IA32代码的主要区别:

     (1)Y86可能需要多条指令来执行一条IA32指令所完成的功能。

 

       (2)Y86没有伸缩寻址模式。

       2、以“.”开头的词是汇编命令,他们告诉汇编器调整地址。创建Y86代码的唯一工具是汇编器。

 

  • 指令集模拟器YIS

       模拟Y86机器代码程序的执行,而不用试图去模拟任何具体处理器实现的行为。

逻辑设计和硬件控制语言HCL

  • 要实现一个数字系统需要三个主要的组成部分:

    (1)计算对位进行操作的函数的组合逻辑
    (2)存储位的存储器元素
    (3)控制存储器元素更新的时钟信号
  • 逻辑门

    AND     &&
    OR      ||
    NOT     !
    逻辑门只对单个位的数进行操作,而不是整个字。一旦一个门的输入变化,在短时间内,输出就会跟着变化。
  • 组合电路和HCL布尔表达式

    1、将逻辑门组合成一个网,构建计算块(组合电路)的限制。

    注意:

    • 两个以上的逻辑门的输出不能连接在一起,否则可能使线上信号矛盾,导致一个不合法的电压或电路故障。
    • 这个网必须是无环的,否则会导致网络计算有歧义。

    2、组合逻辑电路和c语言中逻辑表达式的区别:

    • 组合电路的输出会持续地响应输入变化,c语言表达式只有在执行过程中被遇到才求值。
    • C的逻辑表达式允许参数是任意整数,0是FALSE,其他任何值0的都是TRUE,逻辑门只对位值0和1操作。
    • C的逻辑表达式可能被部分求值(第一个参数就能确定结果的就不会对第二个求值)。
  • 字级的组合电路和HCL整数表达式

    1、所有字级的信号都声明为int,不指定字的大小。

    2、画字级电路时,中等粗度的线来表示携带字的每个位的线路,用虚线来表示布尔信号结果。

    3、多路复用函数

    通用格式:
    [
       select_1(布尔表达式):expr_1(整数表达式)
       select_2:expr_2
        ......
       select_k:expr_k
    ]
    选择表达式是顺序求值的,第一个求值为1的情况会被选中,选择表达式允许不互斥。
  • 集合关系

    通用格式:iexpr in {iexpr1,iexpr2,...,iexprk}
    被测试的值iexpr和带匹配的值iexpr1~iexprk都是整数表达式。

 

  • 存储器和时钟

1、时序电路:有状态,且在这个状态上进行计算的系统。

两类存储器设备:

  • 时钟寄存器(寄存器):储存单个位或字,用时钟信号控制寄存器加载输入值。(保存程序计数器PC,条件代码CC和程序状态Stat)
  • 随机访问储存器(储存器):储存多个字,用地址选择该读/写哪个字。(存储程序数据)

2、处理器还包括另外一个只读存储器,用来读指令。但在大多数实际系统中,这两个存储器被合并为一个具有双端口的存储器:一个用来读指令,一个用来读或写数据。

Y86的顺序实现

 

  • SEQ 顺序处理器

    每个时钟周期上,SEQ执行一条完整指令所需的所有步骤。
  • 将处理组织成阶段

    六个基本阶段:

    • 取指 从存储器读取指令字节,地址为程序计数器PC的值
    • 译码 从寄存器读入最多两个操作数,得到valA或valB
    • 执行 算术/逻辑单元要么执行指令指明的操作,计算存储器引用的有效地址,要么增加或减少栈指针。得到的值为valE。
    • 访存 将数据写入存储器,或从存储器中读出数据,读出的值为valM。
    • 写回 最多可以写两个结果到寄存器文件
    • 更新PC 将PC设为下一条指令的地址
  • SEQ硬件结构

    SEQ抽象视图画图惯例:

    浅灰色方块表示硬件单元
    控制逻辑块是用灰色圆角矩形表示的
    线路的名字在白色椭圆中说明
    宽度为字长的数据连接用中等粗度的线表示
    宽度为字节或更窄的数据连接用细线表示
    单个位的连接用虚线
  • SEQ的时序

    SEQ的实现包括组合逻辑(不需要任何时序或控制)和两种存储器设备:

    • 时钟寄存器 程序计数器和条件码寄存器
    • 随机访问存储器 寄存器文件、指令存储器和数据存储器

      指令存储器 只用来读指令(可以将这个单元看成是组合逻辑)
      条件码寄存器 只在执行整数运算指令时装载
      数据存储器 只在执行rmmovl、pushl或call时写入
      寄存器文件 两个写端口允许每个时钟周期更新两个程序寄存器。(特殊寄存器ID 0xF表明此端口不应执行写操作)
  • SEQ阶段的实现

    1、取指阶段:以PC为第一个字节的地址,一次读6个字节

    icode   控制逻辑块计算指令
    ifun    功能码

    三个一位的信号(根据icode值计算)

    instr_valid     发现不合法的指令
    need_regids     包含寄存器指示符字节码
    need_valC       包括常数字码

    后五个字节是寄存器指示符字节和常数字的组合编码。

    2、译码和写回阶段

    都需要访问寄存器文件,根据四个端口的情况,判断应该读哪个寄存器产生信号valA、valB。

    寄存器文件,支持同时进行两个读和两个写,每个端口有一个地址连接(寄存器ID)和一个数据连接(32根线路),既可以作为寄存器文件的输出字,又可以作为他的输入字。

    3、执行阶段:

    • 包括算数/逻辑单元(ALU),输出为valE信号:ALU通常作为加法器使用
    • 包括条件码寄存器:每次运行产生零、符号、溢出、产生信号set_cc

    4、访存阶段:读或者写程序数据

    两个数据块产生存储器地址和存储器输入证据的值,两个产生控制信号表明应该是读还是写。

    当执行读操作时,数据存储器产生valM。

    根据icode,imem_error,instr_valid,dmem_error,从指令执行的结果计算状态码Stat。

    5、更新PC阶段

    产生程序计数器的新值,依据指令的类型和是否要选择分支,新的PC可能是valC、valM或者valP。

Y86模拟器安装

安装的步骤主要参考了20145218的博客:http://www.cnblogs.com/senlinmilelu/p/5985966.html#3538763

  • 安装bison和flex词法分析工具,在终端中输入sudo apt-get install bison flex

 

  • 下载sim解压:wget http://labfile.oss.aliyuncs.com/courses/413/sim.tar

  • 图形界面须要安装Tcl/Tk,在终端中输入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 // 加上8.5

TKINC=-I /usr/include/tcl8.5 //将isystem改为大写的I,在最后加上tcl8.5

  • 编译 在sim文件夹下右键选择在终端中打开,输入make clean;make

(make clean的主要作用就是把后缀为.yo的文件删除)

  • make all之后使用cat查看编译好的asuml.yo文件。

本周代码托管截图

链接:https://git.oschina.net/929210354/Linux

学习进度条

 代码行数(新增/累积)博客量(新增/累积)学习时间(新增/累积)重要成长
目标 3500行 30篇 400小时  
第一周 100/100 1/1 20/20  
第二周 200/300 1/2 30/50  
第三周 100/400 1/3 28/78  
第五周 60/460 1/4 20/98  
第六周 200/660 1/5 21/119  

参考资料

 

posted on 2016-10-23 22:35  20145239杜文超  阅读(159)  评论(2编辑  收藏  举报

导航