zoukankan      html  css  js  c++  java
  • 2017-2018-1 20155339 《信息安全系统设计基础》第七周学习总结

    2017-2018-1 20155339 《信息安全系统设计基础》第七周学习总结

    教材学习内容总结

    • 与x86-64相比,Y86-64指令集的数据类型、指令和寻址方式都要少一些。它的字节级编码也比较简单,机器代码没有相应的x86-64代码紧凑。

    程序员可见状态

    • 定义一个指令集体系结构(例如Y86-64)包括定义各种状态单元、指令集和它们的编码、一组编程规范和异常事件处理。
    • Y86程序中的每条指令都会读取或者修改处理器状态的某些部分。这称为程序员可见状态。
    • 15个程序寄存器:%rax、%rcx、%rdx、%rbx、%rsp、%rbp、%rsi、%rdi、%r8-%r14。每个程序寄存器存储一个64位的字。%rsp被入栈、出栈、调用和返回指令作为栈指针。
    • 有3个一位的条件码:ZF、SF和OF,它们保存最近的算术或逻辑指令所造成影响的有关信息。程序计数器(PC)存放当前正在执行指令的地址。
    • Y86-64程序用虚拟地址来引用内存位置。
    • 序状态的最后一个部分是状态码Stat,它表明程序执行的总体状态。它会指示是正常运行,还是出现了某种异常。

    Y86-64指令

    • Y86-64指令集基本上是x86-64指令集的一个子集。它只包括8字节整数操作,寻址方式较少,操作数也较少。
    • movq指令分成了4个不同的指令:irmovq、rrmovq、mrmovq和rmmovq。分别显示地指明源和目的的格式:
      1.源操作数:立即数(i)、寄存器(r)或内存(m)。
      2.目的操作数:寄存器(r)、内存(m)。
    • 指令名字的第一个字母就表示了源的类型、指令名字的第二个字母指明了目的的类型。
    • 两个内存传送指令中的存储器引用方式是简单的基址和偏移量形式。
    • 在地址计算中,我们不支持第二变址寄存器和任何寄存器值的伸缩。
    • 不允许从一个内存地址直接传送到另一个内存地址。也不允许将立即数传送到内存。
    • 4个整数操作指令:addq、subq、andq和xorq。
    • 7个跳转指令:jmp、jle、jl、je、jne、jge和jg,根据分支指令的类型和条件代码的设置来选择分支。
    • 6个条件传送指令:cmovle、cmovl、cmove、cmovne、cmovge和cmovg。
    • call指令将返回地址入栈,然后跳到目的地址。ret指令从这样的过程调用中返回。
    • pushq和popq实现入栈和出栈的操作。
    • halt指令停止指令的执行。
    • 执行halt指令会导致处理器停止,并将状态码设置为HLT。

    指令编码

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

    • 指令的字节级编码规则:每条指令的第一个字节表明指令的类型。分为两个部分,高4位是代码部分,低4位是功能部分。代码值为0~0xB,功能值只有在一组相关指令共用一个代码时才有用。

    • 15个程序寄存器当中,每个都有一个相对应的0~0xE之间的寄存器标识符。

    • 程序寄存器存在CPU中的一个寄存器文件中,这个寄存器文件就是一个小的、以寄存器ID作为地址的随机访问存储器。

    • 分支指令和call指令,就没有寄存器指示符字节。

    • 只需要一个寄存器操作数的指令(irmovq、pushq、popq)将另一个寄存器指示符设为0xF。

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

    Y86-64异常

    • 对Y86-64来说,程序员可见的状态码包括Stat,它描述程序执行的总体状态,这个代码可能的值如下:
    名字 含义
    1 AOK 正常操作
    2 HLT 遇到器执行halt指令
    3 ADR 遇到非法地址
    4 INS 遇到非法指令
    • 指令模拟器,称为YIS,他的目的是模拟Y86-64机器代码程序的执行,而不用试图模拟任何具体处理器实现的行为。

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

    • 要实现一个数字系统需要的三个主要的组成部分:计算对位进行操作的函数的组合逻辑、存储位的存储器单元,以及控制存储器元素更新的时钟信号。
    • 逻辑门是数字电路的基本单元。它们产生的输出,等于它们输入位值的某个布尔函数。
    • 逻辑门只对单个位的数进行操作,而不是整个字。
    • 逻辑门总是活动的。一旦一个门的输入变化了,在短时间内,输出就会相应变化。
    • 将很多逻辑门组合成一个网,就能构建计算块,称为组合电路。构建这些网有几个限制:
      1.每个逻辑门的输入必须连接到下述选项之一:(1)一个系统输入;(2)某个存储器单元的输入;(3)某个逻辑门的输入。
      2.两个或多个逻辑门的输出不能连接在一起。否则可能使线上信号矛盾,可能会导致一个不合法的电压或电路故障。
      3.这个网必须是无环的。否则会导致该网络计算的函数有歧义。
    • HCL表达式很清楚地表明了组合逻辑电路和c语言中逻辑表达式的对应之处。它们都是用到布尔操作来对输入进行计算的函数,但是,这两种表达计算的方法之间也是有区别的。
    • 在HCL中,我们将所有字级的信号都声明为int,不指定字的大小。
    • HCL允许比较是否相等,与c的使用方法一样,‘=’表示赋值,‘==’表示相等。
    • 处理器中会用到很多多路复用器,使得我们能够根据某些控制条件,从很多源中选出一个字。在HCL中,多路复用函数是用情况表达式来描述的。情况表达式的通用格式如下:
    [
       select1:expr1;
       select2:expr2;
        .
        .
        .
       selectk:exprk
    ]
    
    • 组合电路本质上讲,不存储任何信息。相反,它们只是简单的响应输入信号,产生等于输入的某个函数的输出。
    • 时序电路:有状态并且在这个状态上进行计算的系统。
    • 两类存储器设备:
      (1)时钟寄存器(简称寄存器):储存储单个位或字,时钟信号控制寄存器加载输入值。
      (2)随机访问存储器(简称内存):存储多个字,用地址来选择该读或者写哪个字。
    • Y86-64处理器会用时钟寄存器保存程序计数器(PC)、条件代码(CC)和程序状态(Stat)。

    Y86-64的顺序实现

    • 处理一条指令包括很多的操作。将他们组织成某个特殊的阶段序列,即使指令的动作差异很大,但所有的指令都遵循统一的序列。
    • 六个阶段内执行的操作:
      (1)取指;从内存读取指令字节,地址为程序计数器(PC)的值。抽取指令指示符字节两个四位部分,称为icode(指令代码)和ifun(指令功能)。有如下公式:vaIP(下一条指令的地址)=PC+已取出指令的长度。
      (2)译码:从寄存器文件读入最多两个操作数,得到valA和/或valB。
      (3)执行:算术/逻辑单元要么执行指令指明的操作,计算内存引用的有效地址,要么增加或减少栈指针。得到的值称为valE。
      (4)访存:将数据写入内存,或从内存读出数据。读出的值为valM。
      (5)写回:最多可以写两个结果到寄存器文件。
      (6)更新PC:将PC设成下一条指令的地址。
      处理器无限循环,执行这些阶段,在简化的实现中,一旦发生任何异常,处理器就会停止。
    • SEQ的实现包括组合逻辑和两种存储器设备:
      (1)时钟寄存器、程序计数器和条件码寄存器,随机访问存储器。
      (2)程序计数器、条件码寄存器。数据内存和寄存器文件。
    • 通过一个时钟信号来控制,触发将新值装载到寄存器以及将值写到随机访问存储器。
    • 每个时钟周期,程序计数器都会装载新的指令地址。
    • 只有在执行整数运算指令时,才会装载条件码寄存器。
    • 只有在执行rmovq、pushq或call指令时,才会写数据内存。
    • SEQ阶段的实现:
      (1)取指阶段(包括指令内存硬件单元):以PC为第一个字节的地址,一次从内存读10个字节。
      三个一位的信号:
      instr_valid:用于发现不合法的指令
      need_regids:是否包含寄存器指示符字节
      need_valC:是否包括常数字
      (2)译码和写回阶段:寄存器文件有四个端口,支持同时进行两个读和两个写。每个端口有一个地址连接(寄存器ID)和一个数据连接(64根线路),既可以作为寄存器文件的输出字,又可以作为它的输入字。
      (3)执行阶段:包括算数/逻辑单元(ALU),输出为valE信号。
      (4)访存阶段:读或者写程序数据。两个控制块产生内存地址和内存输入数据的值。另外两个块产生表明应该执行读还是写操作的控制信号。当执行读操作时,数据内存产生valM。
      (5)更新PC阶段:SEQ的最后一个阶段会产生程序计数器的新值,依据指令的类型和是否要选择分支,新的PC可能是valC、valM或者valP。

    在实验楼构建YIS

    • 新建两个文件夹,并进入,输入命令wget http://labfile.oss.aliyuncs.com/courses/413/sim.tar tar -xvf sim.tar成功会显示已保存

    • 输入指令tar -xvf sim.tar,进入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/libtcl8.6.so /usr/lib/libtcl.so,以及make指令。

    • 进行YIS测试,进行汇编,由于已经都是.yo,所以不用进行汇编运行所有代码,查看asuml.yo,如下图

    Y86模拟器安装

    参考链接

    • 首先安装词法分析工具,在终端输入sudo apt-get install bison flex,使用命令sudo apt-get install tcl8.5-dev tk8.5-dev tcl8.5 tk8.5安装Tcl/Tk 支持图形界面。
    • 下载并解压sim.tar压缩包,下载的网址我用的是实验楼的网址( http://labfile.oss.aliyuncs.com/courses/413/sim.tar),输入命令wget http://labfile.oss.aliyuncs.com/courses/413/sim.tar下载,在终端输入命令tar -xvf sim.tar以解压sim压缩包。
    • 打开sim中的Makefile,修改mkaefile文件,如下:

    GUIMODE=-DHAS_GUI---->GUIMODE=-DHAS_GUI

    TKLIBS=-L/usr/lib/ -ltk -ltcl---->TKLIBS=-L/usr/lib/ -ltk8.5 -ltcl8.5 // 注意根据libtcl.so和libtk.so的路径以便gcc能找到库,在我的电脑中只要加上8.5

    TKINC=-isystem /usr/include/tcl--->TKINC=-I /usr/include/tcl8.5

    • 编译:进入sim目录:cd sim,
      在sim目录下终端输入:make clean,
      在sim目录下终端输入:make.

    • 运行图形界面:
      以pism为例:进入pipe目录,运行图形界面:./psim -t -g ../y86-code/asum.yo,如下图:

    • 练习教材中p265的代码,得到如下图

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

    (一个模板:我看了这一段文字 (引用文字),有这个问题 (提出问题)。 我查了资料,有这些说法(引用说法),根据我的实践,我得到这些经验(描述自己的经验)。 但是我还是不太懂,我的困惑是(说明困惑)。【或者】我反对作者的观点(提出作者的观点,自己的观点,以及理由)。 )

    • 问题1:在实际操作时只能使用IA32的movl指令以及IA32寄存器,为什么教材上介绍的是x86-64寄存器呢
    • 问题1解决方案:上网搜索,没有查到什么可用的信息,待解决。

    代码调试中的问题和解决过程

    • 问题1:在安装Y86时出现下图所示错误。

    • 问题1解决方案:通过上网搜索并且多次尝试各种方法,最后通过输入命令sudo rm /var/cache/apt/archives/locksudo rm /var/lib/dpkg/lock,以及sudo rm /var/lib/dpkg/lock之后成功解除占用。

    • 问题2:在练习教材p265的代码,获得.yo文件时,出现了下图所示问题

    • 问题2解决方案:查看刚刚编写的p265.ys,将所有的irmovq改为irmovl等,使用IA32的movl指令,将寄存器改为IA32寄存器,如下图。成功解决。

    代码托管

    上周考试错题总结

    未公布答案

    结对及互评

    点评模板:

    • 博客中值得学习的或问题:
      • xxx
      • xxx
      • ...
    • 代码中值得学习的或问题:
      • xxx
      • xxx
      • ...
    • 其他

    本周结对学习情况

    - [20155306](https://home.cnblogs.com/u/0831j/)
    - ![](http://images2017.cnblogs.com/blog/1071519/201711/1071519-20171104160220138-1180348338.jpg)
    
    
    - 结对学习内容
        第四章
    

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

    这周学习了第四章,下载了Y86模拟器,在模拟器中还可以让它运行显示栈的变化,还是很神奇的,总的来说,这周接触的东西还是比较新鲜的,学习效率也还可以。

    学习进度条

    代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 5000行 30篇 400小时
    第一周 200/200 2/2 20/20
    第二周 300/500 2/4 18/38
    第三周 500/1000 3/7 22/60
    第四周 300/1300 2/9 30/90
    第五周 300/1300 2/9 30/90
    第六周 706/2006 1/10 50+/140+
    第七周 838/2838 1/11 23/163

    尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
    耗时估计的公式
    :Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

    参考:软件工程软件的估计为什么这么难软件工程 估计方法

    • 计划学习时间:20小时

    • 实际学习时间:23小时

    • 改进情况:

    (有空多看看现代软件工程 课件
    软件工程师能力自我评价表
    )

    参考资料

  • 相关阅读:
    老李分享:持续集成学好jenkins之解答疑问
    持续集成:TestNG组织如何测试用例 1
    老李分享:持续集成学好jenkins之Git和Maven配置 2
    老李分享:持续集成学好jenkins之Git和Maven配置 1
    老李分享:持续集成学好jenkins之内置命令
    老李分享:持续集成学好jenkins之解答疑问
    老李分享:持续集成学好jenkins之安装
    老李分享:接口测试之jmeter
    老李推荐:破坏性创新第一原则 2
    Logback 日志策略配置
  • 原文地址:https://www.cnblogs.com/pingcpingcuo/p/7783606.html
Copyright © 2011-2022 走看看