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

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

教材学习内容总结

Y86指令体系结构

  • Y86是一个指令体系结构(ISA),它是计算机系统这本书的作者YY出的指令集。目的是为了让我们更加清晰的了解ISA。
  • 对于Y86,它就是一个ISA的例子,让各位通过它来了解ISA的设计。这一章的内容比较轻松,因为我们已经在第三章了解过X86的汇编指令。
程序员可见状态
  • 理论上来讲,我们在编写一个程序的时候,我们是可以知道CPU的状态的。因为在你观察程序的汇编指令时,你可以知道当程序执行到某个地方,寄存器、存储器以及条件码寄存器等等的状态是如何的。说到底,无论是寄存器,存储器还是条件码寄存器等等,都是汇编指令可以访问的处理器状态。在设计和实现一个处理器的时候,只要我们能保证机器级程序(比如汇编程序)可以正常的访问程序猿可见状态(比如寄存器、存储器),那么就不太需要非得按照ISA真正的方式来表示我们的处理器状态。

  • 对于Y86来说,它的可见状态就是这几种:寄存器、存储器、条件码、PC、程序状态。

  • 在Y86当中,寄存器依旧是8个,每一个寄存器可以存储一个字,也就是一个32位二进制。条件码是一个一位二进制的寄存器,保存着最近的算术或逻辑运算所造成的影响的信息。PC则是程序计数器,记录当前正在执行的指令的地址。

  • 存储器则是一个很大的字节数组,Y86的程序可以使用虚拟地址(类似于数组的下标)来访问存储器,硬件和操作系统会将虚拟地址翻译为实际的地址。最后一个程序状态(stat),它则代表着程序的运行情况。

Y86指令集
  • 接下来我们就看看Y86的指令集,

  

  • halt:这个指令将会终止指令的执行。
  • nop:这是一个占位指令,它不做任何事情,后续为了实现流水线,它有一定的作用。
  • xxmovl:这是一系列的数据传送指令,其中r代表寄存器,m代表存储器,i代表立即数。比如rrmovl指令,则代表将一个寄存器的值,赋给另外一个寄存器。
  • opl:操作指令,比如加法,减法等等。
  • jxx:条件跳转指令,根据后面的条件进行跳转。
  • cmovxx:条件传送指令,后面的xx代表的是条件。特别的是,条件传送只发生在两个寄存器之间,不会将数据传送到存储器。
  • call与ret:方法的调用和返回指令。一个将返回地址入栈,并跳到目标地址。一个将返回地址入PC,并跳到返回地址。
  • push与pop:入栈和出栈操作。
指令编码
  • 图的右边,是指令所占的字节数或者说编码。一般两个寄存器占用一个字节,存储器则占用四个字节,指令的编码和功能占用一个字节。因此可以看到,比如rrmovl指令,它的字节长度是2,其中第一个字节代表了指令rrmovl,第二个字节代表了两个寄存器。

  • 对于opl、jxx、cmovxx指令来说,都有一个fn标识,占用4个二进制位(半个字节)。这个便是指令的功能部分,这个是由于它们的指令编码一样,但功能有所不同所造成的。比如对于opl,就有加、减、与、异或等操作,那么它们的指令编码第一个字节就分别为十六进制的60、61、62、63。

  • 对于寄存器的表示,是使用4个二进制位表示的,这是一个ID标识。所有的寄存器可以看做是一个寄存器文件,其中的ID标识就类似于它们的地址。对于一些只需要一个寄存器的指令来说,另一个寄存器标识位使用0xF表示。

  • 还有的指令需要一个字的常数,比如irmovl指令,call指令等等。这种指令,将把常数放在最后的四个字节当中,顺序按照大端法或小端法表示(与机器和OS有关)。对于call指令来说,这四个字节就是一个地址,这个地址就是绝对地址,指向了存储器当中的某一个位置,这个位置存储着代码。采用绝对地址是为了描述简单,真实当中,是采取的基于PC的相对地址。

Y86异常
  • 对于Y86来说,程序员可见的状态中就有stat状态码,它标识了程序执行的状态。Y86需要有能力根据stat去做一些处理。不过为了简单起见,这里除了正常执行之外,都将停止指令的执行。真实当中,会有专门的异常处理程序。

  • Y86有四种不同的状态码,AOK(正常)、HLT(执行halt指令)、ADR(非法地址)和INS(非法指令)。

Y86程序

  书中给出了一个示例程序,来说明X86和Y86的区别,这里LZ就不详细分析这些汇编指令了,这种事情在第三章已经做的很多了,各位猿友可以私底下自己分析一下。其实两者是非常相似的,毕竟Y86就是根据X86的结构YY出来的。区别就在于,有的时候Y86需要两条指令来达到X86一条指令就可以达成的目的。

  比如对于X86指令中的 addl $4,%ecx 这样的指令,由于Y86当中的addl指令中不包含立即数,所以Y86需要先将立即数存入寄存器,即使用irmovl指令,然后再使用addl来处理加法运算。

  总的来说,Y86就是一个X86的缩减版,它的目的是以简单的结构实现一个处理器,帮助我们了解处理器的设计和实现。有兴趣的猿友可以去观摩一下Y86程序生成的汇编代码,并进行逐一的分析,实际上,这与X86是十分类似的。

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

要实现一个数字系统需要三个主要的组成部分: 计算对位进行操作的函数的组合逻辑 存储位的存储器元素 控制存储器元素更新的时钟信号

逻辑门
  • 逻辑门产生的输出,等于它们输入位值的某个布尔函数。逻辑门只对单个位的数进行操作,而不是整个字。
  • 逻辑门总是活动的,一旦一个门的输入变化,在短时间内,输出就会跟着变化。
组合电路和HCL布尔表达式
  • 组合电路:将很多的逻辑门组合成一个网,能构建计算块。
  • 多路复用:根据输入控制信号的值,从一组不同的数据信号中选出一个。
  • 构建这些网有两条限制:(1)两个或多个逻辑门的输出不能连接在一起(2)这个网必须是无环的。
  • HCL表达式和C语言中逻辑表达式的区别: 组合逻辑电路的输出会持续地响应输入的变化;C表达式只有在程序执行过程中被遇到时才会求值。 C的逻辑表达式允许参数是任意整数,0表示FLASE,其他任何值都表示TRUE;逻辑门只对位值0和1进行操作。 C的逻辑表达式可能只被部分求值;组合逻辑没有部分求值的规则,逻辑门只是简单地响应输入的变化。
集合关系
  • 判断集合关系的通用格式是:iexpr in {iexpr1,iexpr2,……,iexprk}

Y86的顺序实现

  • SEQ处理器:每一个时钟周期上,SEQ执行处理一条完整指令所需的所有步骤。

  • 各个阶段以及各阶段内执行操作:

    • 取指:从存储器读取指令字节,地址为程序计数器PC的值
    • 译码:从寄存器读入最多两个操作数,得到valA或valB
    • 执行:算术/逻辑单元要么执行指令指明的操作,计算存储器引用的有效地址,要么增加或减少栈指针。得到的值为valE。
    • 访存:将数据写入存储器,或从存储器中读出数据,读出的值为valM。
    • 写回:最多可以写两个结果到寄存器文件
    • 更新PC:将PC设为下一条指令的地址
  • 执行一条指令需要的处理过程:执行指令所表明的操作、计算地址、更新栈指针、确定下一条指令的地址。
  • 对于三种控制转移指令的处理:需要注意位信号Cnd。 在更新PC阶段,检查这个标志,如果这个标志为1,将PC设为valC(跳转目标),如果为0,就设为valP(下一条指令的地址)。
SEQ硬件结构
  • 在SEQ中,所有硬件单元的处理都在一个时钟周期内完成。
  • SEQ线路图的画图惯例:
    • 浅灰色方框表示硬件单元
    • 控制逻辑块是用灰色圆角矩形表示的
    • 线路的名字在白色椭圆中说明
    • 宽度为字长的数据连接用中等粗度的线表示
    • 宽度为字节或者更窄的数据连接用细线表示
    • 单个位的连接用虚线表示
  • SEQ的时序
  • SEQ的实现包括组合逻辑和两种存储器设备: 时钟寄存器 程序计数器和条件码寄存器  
    随机访问存储器 寄存器文件、指令存储器和数据存储器

  • 每个时钟周期,程序计数器都会装在新的指令地址;只有在执行整数运算指令时,才会装载条件码寄存器;只有在执行rmmovl、pushl或call指令时,才会写数据存储器;寄存器文件的两个写端口允许每个时钟周期更新两个程序寄存器。

  • 组织计算原则:处理器从来不需要为了完成一条指令的执行而去读由该指令更新了的状态。 用时钟来控制状态元素的更新,值通过组合逻辑传播。
SEQ阶段的实现
  • 取指阶段: 以PC为第一个字节的地址,一次读6个字节。 icode:控制逻辑块计算指令; ifun:功能码;
    三个一位的信号(根据icode值计算):instr_valid:发现不合法的指令;need_regids:包含寄存器指示符字节吗;need_valC:包括常数字吗 后五个字节是寄存器指示符字节和常数字的组合编码。
  • 译码和写回阶段: 都需要访问寄存器文件,根据四个端口的情况,判断应该读哪个寄存器产生信号valA、valB。 寄存器文件,支持同时进行两个读和两个写,每个端口有一个地址连接(寄存器ID)和一个数据连接(32根线路),既可以作为寄存器文件的输出字,又可以作为他的输入字。
  • 执行阶段: 包括算数/逻辑单元(ALU),输出为valE信号。ALU通常作为加法器使用
  • 访存阶段 读或者写程序数据。 两个数据块产生存储器地址和存储器输入证据的值,两个产生控制信号表明应该是读还是写。当执行读操作时,数据存储器产生valM。 根据icode,imem_error,instr_valid,dmem_error,从指令执行的结果计算状态码Stat。
  • 更新PC阶段 产生程序计数器的新值,依据指令的类型和是否要选择分支,新的PC可能是valC、valM或者valP。

教材学习中的问题和解决过程

Y86的安装

  • 使用命令sudo apt-get install bison flex安装bison和flex词法分析工具。

  • 使用命令sudo apt-get install tcl8.5-dev tk8.5-dev tcl8.5 tk8.5安装Tcl/Tk 支持图形界

  • 解压sim

  • 对makefile进行修改

  • make all

  • 查看结果
关于Linux下的卸载
  • 这周在Y86的安装过程中,有同学安装过程中出现了这样那样的问题,想重新安装,却不知道如何去卸载。
  • 下面简单介绍一下改如何卸载:

  • 输入如下命令:

  • sudo apt-get autoremove --purge

    • sudo ———— 获取 root 权限

    • apt-get ——— 执行安装卸载功能的软件

    • autoremove — 告诉 apt-get 我们所要做的操作是移除软件

    • --purge ——— 注意这前面是两个短划线,这个参数是告诉他们要完整的干净的彻底的移除

  • 最后在这条指令后加上你所要卸载的全称即可

本周代码托管截图

其他(感悟、思考等,可选)

  • 这周的学习算是对上一章内容的更深层次的理解和学习,同时也是对上学期汇编学习的再复习与巩固,Y86是一个指令体系结构(ISA),目的是为了让我们更加清晰的了解ISA,我们学这个并不是为了设计指令集,因为这种工作很难发生在我们的身上。我们的目的是为了了解CPU处理指令的流程以及它的工作原理,学习它的思想,这对我们说不定会有一些启发。

学习进度条

 代码行数(新增/累积)博客量(新增/累积)学习时间(新增/累积)重要成长
目标  4000行  24篇  400小时   
第一周  150/150  1/1  15/15  对Linux有了初步的认识
第二周  200/350 1/2 20/35 vim的使用 
第三周  250/600 1/4 20/55 各种信息的表示方法
第五周  250/850 1/5 25/80 汇编与反汇编
第六周  150/1000 1/6 25/105 Y86

参考资料

原文地址:https://www.cnblogs.com/5301z/p/5991501.html