zoukankan      html  css  js  c++  java
  • 信息安全系统设计基础第五周学习总结

    课本内容
    1.流水线化的处理器:
    将每条指令的执行分解成五步,每个步骤由一个独立的硬件部分或者阶段来处理。指令步经流水线的各个阶段,且每个时钟周期有一条新指令进入流水线。所以处理器可以同时执行五条指令的不同阶段。为了使这个处理器保留Y86 ISA的顺序的性质,就要求处理很多冒险和冲突情况,冒险就是一条指令的位置或操作数依赖于其他仍在流水线中的指令。
    2.程序员可见的状态:
    Y86程序中的每条指令都会读取或者修改处理器状态中的某些部分。这称为程序员可见状态。Y86的处理器状态类似于IA32.
    有八个程序寄存器:%eax.%ecx.%edx.%ebx.%esi.%edi.%esp和%ebp....
    处理器的每个程序寄存器存储一个字
    寄存器%esp被入栈、出栈、调用和返回指令作为栈指针。在其他情况下,寄存器没有固定的含义或固定值。
    有三个一位的条件码:ZF,SF,OF,它们保存最近的算术或洛基指令所造成英雄的有关信息。
    程序计数器PC存放当前正在执行指令的地址。
    3.状态码Stat
    程序状态的最后一个部分是状态码Stat,它表明程序执行的总体状态;它会指示是正常运行还是出现了某种异常。
    4.Y86
    一个简单的、可以称之为IA32指令集的子集的指令集;只包括四字节整数操作,操作较少,寻址方式也比较少。指令编码长度从1——6字节不等。汇编码和字节编码在课本232页。
    关于指令结构,每条指令的第一个字节表明指令的类型;这个字节分为两个部分,每部分四位:高四位是代码部分(0——0xB),第四位是功能部分。 这里补充一些缩写:立即数(i),寄存器(r)、存储器(m)。指令附加的寄存器指示符字节依次是数据源(如果是立即数,把这一位设置成0xf)、目的寄存器/基址寄存器。有些指令需要附加四字节的常数字,采用小端法(倒序)编码
    movl指令 IA32的movl指令分为四种:
    irmovl,rrmovl,mrmovl,rmmovl 前面的两个字母是在显式的指定源操作数和目的操作数的格式,第一位是源操作数,第二位是目的操作数。
    (1)源操作数 可以是:
    i-立即数 r-寄存器 m-存储器 (2)目的操作数 可以是:
    r-寄存器 m-存储器 ※这里的存储器引用方式是简单的基址和偏移量形式,寻址方式不支持第二变址寄存器和任何寄存器值的伸缩
    ※两个操作数不能都是来自存储器,也不允许将立即数传送到存储器
    四个整数操作指令 addl 加 subl 减 andl 与 xorl 异或 并且它们只对寄存器数据进行操作(区别于IA32,后者还允许对存储器数据进行这些操作)。
    这些指令会设置三个条件码:
    ZF-零 SF-符号 OF-溢出 七个跳转指令——分支控制 jmp 直接跳转 jle(SF^OF)|ZF 有符号数≤ jl SF^OF 有符号< je ZF 相等/零 jne ~ZF 不相等/非零 jge ~(SF^OF) 有符号≥ jg (SF^OF)&ZF 有符号> 六个条件传送指令 cmovle cmovl cmove cmovne cmovge cmovg 这些指令的格式与寄存器-寄存器传送指令rrmovl一样,但是只有当条件码满足所需要的约束时,才会更新目的寄存器的值。
    call和ret call指令将返回地址入栈,然后跳到目的地址,ret指令从这样的过程调用中返回。
    pushl和popl 实现入栈和出栈
    halt指令 halt指令停止指令的执行,执行此指令会导致处理器停止,并将状态码设置为HLT。
    类比IA32:halt指令与之类似,但是IA32的应用程序不允许使用这条指令,因为它会导致整个系统暂停运行。
    Y86异常
    5.stat代码可能取值反应了机器的不同状态——
    AOK:正常操作(除此之外的任何状态都会使得处理器停止执行指令)
    HLT:处理器执行halt指令
    ADR:遇到非法地址10/18/2015 3:11:55 PM
    INS:遇到非法指令10/18/2015 3:12:05 PM
    6.命令指明应该将代码或者是数据放在什么位置等。其中,以 .开头的是汇编器命令,它们告诉汇编器调整地址,以便在那儿产生代码或者是插入一些数据。
    7.指令模拟器YIS是模拟Y86机器代码程序的执行而不用试图去模拟任何具体处理器实现的行为。
    ※指令集的重要性质:
    字节编码必须有唯一的解释
    8.pushl会把栈指针减4,并将一个寄存器值写入存储器中。因此,执行pushl %esp 和 popl %esp的结果是不固定的。
    9.逻辑门是数字电路的基本计算元素。逻辑门总是活动的,一旦一个门的输入变化了,在很短的时间内,输出就会相应地变化。
    10.将很多的逻辑门组合成一个网,就能构建计算块,称为组合电路。限制:
    两个或者多个逻辑门的输出不能连接在一起; 这个网必须无环 11.多路复用电路(MUX):根据输入控制信号的值,从一组不同的数据信号中选出一个。
    12.关于HCL的几点说明
    HCL中所有字级的信号都声明为int; 在画字级电路的时候,用中等粗度的线表示携带字的每个位的线路,用虚线来表示布尔信号的结果 在HCL中,表示默认情况(即所有条件都没有被选中的情况)一般用1 13.算术/逻辑单元(ALU):
    根据控制输入的设置(0,1,2,3),电路会对数据输入执行不同的算数或者逻辑操作(+,-,&,^)。
    14.时序电路
    有状态并且在这个状态上进行计算的系统
    15.时钟寄存器&随机访问存储器
    时钟寄存器存储单个位或者字。时钟信号控制寄存器加载输入值 随机访问存储器存储多个字,用地址来选择该读入或者该写哪个字 16.Y86的顺序实现离不开SEQ处理器(顺序处理器)。
    将处理一条指令的操作组织成一个特殊的阶段序列;可以设计一个充分利用硬件的处理器。
    17.处理操作的阶段——
    取指:从寄存器读取指令字节,地址为程序计数器的值。计算下一条指令地址等于PC中的值加上已取出指令的长度 译码:从寄存器文件中最多读出两个操作数 执行:ALU执行指明的操作、引用的有效地址或者是修改栈指针 访存:将数据写入存储器或者从存储器读出数据 写回:写两个结果到寄存器文件 更新PC:将PC设置成下条指令地址 18.关于一些指令的处理步骤
    irmovl指令的处理与rrmovl类似,但是因为是长指令格式,所以程序计数器要加6 指令call和ret与之前的popl和pushl类似。对于指令call,我们要将valP也就是call之后的那条指令的地址压入栈中在更新PC阶段,将PC设置为valC,也就是调用目的地 19.SEQ的时序(逐步深化)
    要控制处理器中活动的时序,只需要寄存器和存储器的时钟控制 除了指令存储器只用来读指令故而可以看作组合逻辑之外,剩余的程序计数器、条件码寄存器、数据存储器和寄存器文件需要通过一个时钟信号来控制(控制时序) 在每个时钟周期内,程序计数器都会装载新的指令地址;只有执行整数运算指令的时候,才会装载条件码寄存器。只有执行rmmovl,pushl,call时,才会写数据存储器。 Y86指令集的本质遵循这样一项组织原则:处理器从来不需要为了完成一条指令的执行而去读由该指令更新了的状态 【如何理解?也就是说,处理器所“经手”的指令中,如果有某些是可以改变机构状态的;那么一定先改变状态之后再执行指令。这样保证了操作的时序性(防止指令执行起来互相颠倒)】 20.SEQ阶段的实现
    取指阶段包括指令存储器单元。一次从存储器中读出6个字节。第一个字节分为ocode,ifun。根据icode的值,计算:instrvalid(发现不合法指令),needregids,needvalC。instrvalid和imemerror在访存阶段被用来产生状态码。 SEQ中译码和写回阶段都需要访问寄存器文件。寄存器文件有四个端口,它支持同时进行两个读和两个写;每个端口都一个地址连接和数据连接。如果某个地址端口上的值为特殊标识符0xf,则表明不需要访问寄存器。 执行阶段包括算术/逻辑单元(ALU)。这个单元革命家alufun信号的设置,对输入aluA和aluB执行ADD,SUB,AND,XOR运算。ALU的输出就是valE信号。还包括条件码寄存器。每次运行时,ALU都会产生三个与条件码相关的信号——零,符号,溢出。用setcc来控制是否应该更新条件码寄存器。 访存阶段。两个控制块产生存储器地址和存储器输入数据的值;另外两个块产生控制信号表明应该执行读操作还是写操作。
    小练习部分
    1.确定下面的Y86指令序列的字节编码。.pos 0x100表明这段代码的起始地址应该是0x100
    irmovl $15,%ebx
    rrmovl %ebx,%ecx
    loop:
    rmmovl %ecx,-3(%ebx)
    addl %ebx,%ecx
    jmp loop
    解答:
    irmovl $15,%ebx ##30f30f000000
    rrmovl %ebx,%ecx ##2031
    loop:
    rmmovl %ecx,-3(%ebx) ##4013fdffff
    addl %ebx,%ecx ##6031
    jmp loop
    3.修改P238图4-6中的Y86代码,使其能计算一个数组的绝对值的和。内循环中使用条件传送。
    源代码:
    int Sum(int Start,int Count)
    {
    int sum = 0;
    while(Count)
    {
    sum+=
    Start;
    Start++;
    Count--;
    }
    return sum;
    }
    对于内循环的Y86代码,如要计算绝对值之和,只需要在相对于“sum+=*Start”的部分做下改动,加上条件分支(负数取反,正数不变)。如果要用条件传送,则适合cmovg或者cmovge
    loop:
    mrmovl (%ecx),%esi
    irmovl $0,%edi
    subl %esi,%edi
    cmovg %edi,%esi ##以上代码处理了x<0的情况,下面即和原代码相同
    addl %esi,%eax
    irmovl $4,%ebx
    addl %ebx,%ecx
    irmovl $-1,%ebx
    addl %ebx,%edx
    jne loop
    4.写出信号xor的HCL表达式。输入为a和b
    bool xor = (a && !b) || (!a && b)
    与bool eq = (!a && !b) || (a && b)的区别为,二者互补
    .5写一个电路的HCL代码,对于输入字A,B,C,选择中间值。
    int Med3 = [
    A<=B && A>=C :A;
    A<=C && A>=B :A;
    B<=A && B>=C :B;
    B<=C && B>=A :B;
    1:C;
    ];
    9.我们希望只为向存储器写数据的指令设置控制信号mem_write。
    bool mem_write = icode in {IRMMOVL,IPUSHL,ICALL};
    在此本人是挑了几个看起来比较好懂得题目粘贴在上面,之前落下的太多。
    实验部分
    要求:下载Y86模拟器,验证教材上不少于三组HCL代码;构建YIS环境(操作性的代码见下);YIS手册下载;YIS测试
    cd ~/Code/shiyanlou_cs413
    wget http://labfile.oss.aliyunce.com/courses/413/sim.tar
    tar -xvf sim.tar
    cd sim
    sudo apt-get install tk
    sudo ln -s /usr/lib/x86_64-linux-gnu/libtk8.6.so /usr/lib/libtk.so
    sudo ln -s /usr/lib/x86_64-linux-gnu/libtk8.6.so /usr/lib/libtk.so
    make
    然而并不懂什么意思,感觉太深奥了。。还有老师说的qq群里有Y86的模拟器,我找了,但没有,去官网完全不懂什么意思。
    心得
    本次老师您指导了结对学习,我认为这很好,本人也会从此努力,之前是落下了好多,对,就是老师说的欠债,不过有老师的警告,本人也会警觉的,我是50分及格,基础也是不怎么好,所以其实在尽力,这次刘蔚然同学说的先让我掌握markdown的编辑器用法,然后还有一些基础知识的掌握。本人会努力的。
    参考
    1.《深入理解计算机系统》Randal E. Bryant & David R. O'Hallaron
    2.实验楼私有课程《深入理解计算机系统》之 程序的机器级表示&处理器体系结构

  • 相关阅读:
    NOI2.5 4980:拯救行动
    NOI2.5 1490:A Knight's Journey
    NOI2.5 8465:马走日
    考试题目“部落卫队”
    考试题目“笨笨的西瓜种植”
    考试题目“笨笨玩游戏”
    NOI4.6 1455:An Easy Problem
    NOI2.5 1253:Dungeon Master
    NOI2.2 8758:2的幂次方表示
    NOI2.5 1817:城堡问题
  • 原文地址:https://www.cnblogs.com/20135239-yxlm/p/4889638.html
Copyright © 2011-2022 走看看