zoukankan      html  css  js  c++  java
  • 20135315宋宸宁—信息安全系统设计基础第六周学习总结

    第四章 处理器体系结构

    指令体系结构:一个处理器支持的指令和指令的字节级编码

    4.1Y86指令集体系结构

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

    4.1.1 程序员可见状态

    Y86程序中的每条指令都会读取或修改处理器状态的某些部分。
    Y86具体包括:8个程序寄存器、3个条件码ZFSFOF、程序计数器(PC) 
    Y86用虚拟地址引用存储器位置。 程序状态的最后一个部分是状态码Stat,它表明程序执行的总体状态。

    4.1.2 Y86指令

    注意:条件码只与整数操作指令有关

    4.1.3 指令编码

    高4位是代码部分,低4位是功能部分

    只需要一个寄存器操作数的指令将另一个寄存器指示符设为0xF。 
    指令集的一个重要性质:字节编码必须有唯一的解释。 RISC和CISC指令集的区别:

    4.1.4 Y86异常

    状态码Stat,描述程序执行的总体状态。
    代码值1,命名为AOK,表示程序执行正常;
    代码值2,命名为HLT,表示处理处执行一条halt指令;
    代码值3,命名为ADR,表示处理器试图从一个非法存储器地址读或者向一个非法存储器地址写,可能是当取指令的时候,也可能是当读或者写数据的时候。 
    异常处理程序、信号处理程序。

    4.1.5 Y86程序

    Y86指令和IA32代码的主要区别在于,它可能需要多条指令来执行一条IA32指令能完成的所有功能。 
    Y86没有伸缩寻址模式。 
    以“.”开头的词是汇编器命令,命令.pos0告诉汇编器应该从地址0处开始产生代码。 
    创建Y86代码的唯一工具是汇编器。
    YIS:指令集模拟器

    4.1.6 一些Y86指令的详情

    pushl指令会把栈指针减4,并且将一个寄存器值写入存储器中。 
    因为要入栈的寄存器会被同一条指令修改,通常有两种约定:(1)压入%esp的原始值 (2)压入减去4的%esp的值。

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

    4.2.1 逻辑门

    逻辑门是数字电路的基本计算元素,它们的输出,等于它们输入位值的某个布尔函数。
    布尔函数AND、OR、NOT的标准符号。

    4.2.2 组合电路和HCL布尔表达式

    组合电路:将很多的逻辑门组合成一个网,能构建计算块。 
    多路复用:根据输入控制信号的值,从一组不同的数据信号中选出一个。

    构建这些网有2条限制:(1)两个或多个逻辑门的输出不能连接在一起(2)这个网必须是无环的。

    HCL表达式和C语言中逻辑表达式的区别:

    (1)组合逻辑电路的输出会持续地响应输入的变化;C表达式只有在程序执行过程中被遇到时才会求值。
    (2)C的逻辑表达式允许参数是任意整数,0表示FLASE,其他任何值都表示TRUE;逻辑门只对位值0和1进行操作。 
    (3)C的逻辑表达式可能只被部分求值;组合逻辑没有部分求值的规则,逻辑门只是简单地响应输入的变化。

    4.2.3 字级的组合电路和HCL整数表达式

    执行字级计算的组合电力根据输入字的各个为,用逻辑门来计算输出字的各个位。 
    用中等粗度的线来表示携带字的每个位的线路,用虚线来表示布尔信号结果。
    在HCL中,多路复用函数用情况表达式来描述。 
    算术/逻辑单元是一种很重要的组合电路。

    4.2.4 集合关系

    判断集合关系的通用格式是:

    iexpr in {iexpr1,iexpr2,……,iexprk}

    4.2.5 存储器和时钟

    组合电路从本质上将,不存储任何信息。 
    存储设备都是由同一个时钟控制,两类存储器设备包括:

    时钟寄存器(寄存器):存储单个位或字,时钟信号控制寄存器加载输入值 
    随机访问存储器(存储器):存储多个字,用地址来选择该读或该写哪个字

    随机访问存储器的例子包括:(1)处理器的虚拟存储器系统(2)寄存器文件

    “寄存器”在硬件和机器级编程中的区别:

    在硬件中,寄存器直接将它的输入和输出线连接到电路的其他部分; 
    在机器级编程中,寄存器代表的是CPU中为数不多的可寻址的字,这里的地址是寄存器ID。 Y86处理器会用时钟寄存器保存程序计数器(PC)、条件代码(CC)、程序状态(Stat)。

    如果同时读和写同一个寄存器会发生什么?

    如果更新一个寄存器,同时在读端口上用同一个寄存器ID,我们会看到一个从旧值到新值的变化,当我们把这个寄存器文件加入到处理器设计中,我们保证会考虑到这个属性的。

    边界检查纯粹就是地址输入的函数,不涉及保存任何状态。 
    只读存储器:用来读指令。这两个存储器被合并为一个具有双端口的存储器:一个用来读指令,另一个用来读或者写数据。

    4.3 Y86的顺序实现

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

    4.3.1 将处理组织成阶段

    取址:valP:PC的值加上已取出指令的长度。
    译码:读入指令rA和rB字段指明的寄存器。
    执行:ALU执行指令指明的操作,计算存储器引用的有效地址,要么增加或者减少栈指针,得到的值为valE;对跳转指令来说,这个阶段会检验条件码和分支条件。
    访存:可以将数据写入存储器,或者从存储器读出数据。置为valM。
    写回:最多可以写两个结果到寄存器文件。
    更新:将PC设置成下一条指令的地址。

    执行一条指令需要的处理过程:
    执行指令所表明的操作、计算地址、更新栈指针、确定下一条指令的地址。
    对于三种控制转移指令的处理:需要注意位信号Cnd。 在更新PC阶段,检查这个标志,如果这个标志为1,将PC设为valC(跳转目标),如果为0,就设为valP(下一条指令的地址)。

    4.3.2 SEQ硬件结构

    实现所有Y86指令所需要的计算可以组织成6个阶段:取值、译码、执行、访存、写回和更新PC。 在SEQ中,所有硬件单元的处理都在一个时钟周期内完成。
    SEQ线路图的画图惯例:

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

    4.3.3 SEQ的时序

    SEQ的实现包括组合逻辑和两种存储器设备:时钟寄存器(程序计数器和条件码寄存器),随机访问存储器(寄存器文件、指令存储器和数据存储器)。 
    每个时钟周期,程序计数器都会装在新的指令地址;只有在执行整数运算指令时,才会装载条件码寄存器;只有在执行rmmovl、pushl或call指令时,才会写数据存储器;寄存器文件的两个写端口允许每个时钟周期更新两个程序寄存器。

    处理器的原则:

    处理器从来不需要为了完成一条指令的执行而去读由该指令更新了的状态。

    4.3.4 SEQ阶段的实现

    nop指令:除了将PC加1,不进行任何处理; 
    halt指令:将处理器状态设置为HLT,导致处理器停止运行。

    1、取址阶段

    取址阶段包括指令存储器硬件单元。
    instrvalid:指示指令是否合法
    need
    regids:指示是否包括一个寄存器指示符字节
    need_valC:指示是否包括一个常数字
    instrvalid和imemerror在访存阶段被用来产生状态码。

    2、译码写回阶段

    3、执行阶段

    标号为“cond”的硬件单元会根据条件码和功能码来确定是否进行条件分支或者条件数据传送。

    4、访存阶段

    访存阶段的任务就是读或者写程序数据。 
    访存阶段最后的功能是根据取值阶段产生的icode、imemerror、instrvalid值以及数据存储器产生的dmem_error信号,从指令执行的结果来计算状态码Stat

    5、更新PC阶段

    6、SEQ小结

    这种实现方法不能充分利用硬件单元,每个单元只在整个时钟周期的一部分时间内才被使用,引入流水线能获得更好的性能。

    实验部分

    终端操作代码

    asuml.yo

    asuml.ys

    查看代码

    遇到的问题

    1、写出SEQ中信号mem_write的HCL代码,答案不理解,为什么只有ICALL,IPUSHL,IRMMOVL的指令,其他指令为什么不能算进来?

    参考文献

    1、《深入理解计算机系统》课本第三章

    2、实验楼实验指导书:https://www.shiyanlou.com/courses/413 实验五

    3、每周重点:http://group.cnblogs.com/topic/73069.html

  • 相关阅读:
    NetCore+AutoMapper多个对象映射到一个Dto对象
    log4net快速上手
    WebService基于soapheader的身份验证
    Canvas入门笔记-实现极简画笔
    .Net修改网站项目调试时的虚拟目录
    Roslyn导致发布网站时报错:编译失败
    .NET通过字典给类赋值
    键盘测试工具
    索引器基类定义
    自定义队列任务执行器
  • 原文地址:https://www.cnblogs.com/java-stx/p/4884025.html
Copyright © 2011-2022 走看看