zoukankan      html  css  js  c++  java
  • 20145316 许心远《信息安全系统设计基础》第六周学习总结

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

    教材学习内容总结

    第四章 处理器体系结构

    4.1 Y86指令集体系结构

    Y86是ISA的一个子集
    • 可见状态: 寄存器、存储器、条件码、PC、程序状态。
    • 寄存器:8个,每一个寄存器可以存储一个字,也就是一个32位二进制。
      条件码:一个一位二进制的寄存器,保存着最近的算术或逻辑运算所造成的影响的信息。
    • PC:程序计数器,记录当前正在执行的指令的地址。
    • 存储器:很大的字节数组,保存着程序和数据,用虚拟地址来访问存储器,硬件和操作系统会将虚拟地址翻译为实际的(或物理)地址。
    • 状态码:stat表明程序执行的总体状态(正常还是出现某种异常)。
    指令
    • xxmovl:数据传送指令,其中r代表寄存器,m代表存储器,i代表立即数。比如rrmovl指令,则代表将一个寄存器的值,赋给另外一个寄存器。(不允许:存储器地址直接传给存储器地址;立即数传给存储器。)
    • opl:操作指令,只对寄存器数据进行操作,设置三个条件码zf、sf、of。
    • jxx:条件跳转指令,根据分支指令类型和条件码设置进行跳转。
    • cmovxx:条件传送指令,后面的xx代表的是条件。(只发生在两个寄存器之间,不会将数据传送到存储器。)
    • call:将返回地址入栈,并跳到目标地址。
    • ret:将返回地址入PC,并跳到返回地址。
    • push与pop:入栈和出栈操作。
    • halt:终止指令的执行。(处理器停止,并将状态码设置成HLT。)
    指令编码
    • 指令的字节级编码规则:高4位为代码部分,低四位为功能部分,功能值只有在一组相关指令共用一个代码时才有用。
    • 8个程序寄存器当中,每个都有相应的0~7的寄存器标识符。程序寄存器存在CPU中的一个寄存器文件中,这个文件就是一个小的、以寄存器ID作为地址的随机访问存储器。
    • 附加寄存器指示符字节:指定一个或者两个寄存器。
    • 附加4字节的常数字:作为irmovl的立即数数据,rmmovl和mrmovl的地址指示符的偏移量,以及分支指令和调用指令的目的地址。
    Y86异常
     状态码stat:描述程序执行的总体状态
    
     1 AOK,正常操作
     2 HLT,处理器执行halt指令
     3 ADR,遇到非法地址
     4 INS,遇到非法指令
    
    遇到异常,处理器停止执行指令。
    
    • Y86代码与IA32代码主要区别:

      Y86需要多条指令来执行一条IA32指令完成的功能。

      Y86没有伸缩寻址模式。

    • YIS:指令集模拟器,目的是模拟Y86机器代码程序的执行。

    4.2 逻辑设计和硬件语言HCL

    • 数字系统由三部分组成:组合逻辑、存储器元素、时钟信号。
    • HCL:硬件控制语言,描述不同处理器设计的控制逻辑。
    逻辑门
    • HCL表示与、或、非:a&&ba||b!a。每个门产生的输出等于他输入的某个布尔函数。
    • 将很多逻辑门组合成一个网,就能构建计算块,称为组合电路。
    • 限制:两个及以上逻辑门的输出不能连接在一起(会产生信号矛盾)。
    • 网必须是无环的,不可以有路径经一系列门而形成回路。
    • 检测位相等:bool eq=(a&&b)||(!a&&!b)
    • MUX:多路复用器,根据输入控制信号的值,从一组不同的数据信号中选出一个。bool out=(s&&a)||(!a&&b)(s是控制信号)
    存储器和时钟
    • 组合电路从本质上讲,不存储任何信息。它们只是简单地响应输入信号,产生等于输入的某个函数的输出。
    • 为了产生时序电路,也就是有状态并且在这个状态上进行计算的系统,我们必须引入按位存储信息的设备。
    • 存储设备都是由同一个时钟控制,时钟是一个周期性信号,决定了什么时候要把新值加载到设备中。
    • 大多数时候,寄存器都保持在稳定状态(x),产生的输出等于它的当前状态。信号沿着寄存器前面的组合逻辑传播,这时,产生了一个新的寄存器输入(y),但只要时钟是低电位的,寄存器的输出就仍然保持不变。当时钟变成高电位的时候,输入信号才加载到寄存器中,成为下一个状态y,直至下一个时钟的上升沿。
    • 寄存器是作为电路不同部分中的组合逻辑之间的屏障。每当每个时钟到达上升沿时,值才会从寄存器的输入传送到输出。

    4.3 Y86顺序实现

    各阶段及其内执行操作
    • 取指
      从存储器读取指令字节,放到指令存储器(CPU中)中,地址为程序计数器(PC)的值。
      按顺序的方式计算当前指令的下一条指令的地址(即PC的值加上已取出指令的长度)
    • 译码
      从寄存器文件读入最多两个操作数。读入指令rA、rB字段指明的寄存器。
    • 执行
      根据指令的类型,将算数/逻辑单元(ALU)用于不同的目的。
      计算增加或减少栈指针;
      计算有效地址;
      只是简单地加0,将一个输入传递到输出;
      也可能设置条件码;
    • 访存
      将数据写入存储器;或从存储器读出数据。
      数据存储器(CPU中)读出或写入一个存储器字。指令和数据存储器访问的是相同的存储器位置,但是用于不同的目的。
    • 写回
      最多可以写两个结果到寄存器文件。
      寄存器文件有两个写端口。端口E用来写ALU计算出来的值,而端口M用来写从数据存储器中读出的值。
    • 更新PC
      将PC设置成下一条指令的地址。
    SEQ时序
    • SEQ的实现包括:组合逻辑和两种存储器设备
      时钟寄存器:程序计数器、条件码寄存器
      随机访问存储器:寄存器文件、指令存储器、数据存储器
    • 需要用时序进行明确控制:程序计数器、条件码寄存器、寄存器文件、数据存储器。
    • 每个时钟周期,程序计数器都会装载新的指令地址。
      只有在执行整数运算指令时,才会装载条件码寄存器。
      只有在执行mov、push、call指令时,才会写数据存储器。

    Y86模拟器的安装

    实验楼安装Y86模拟器

    • 实验楼的安装比较顺利,按照娄老师在实验楼编写的教程做就好。

    • 完成。

    虚拟机Ubuntu平台上安装Y86模拟器

    • 我的虚拟机Y86模拟器安装过程比较曲折,虽然有十分完备的教程,但还是因为自己的粗心出了问题,问题截图如下。

    • 因为发现找不到指令yas,还尝试过重新配置环境变量

    • 后来找到了问题所在,发现bixon flex词法分析工具没有安装,从头再来一遍,完成。教程大家都写得比较完整,在此不做赘述,只演示一下过程截图。

    代码的调试与运行

    • p240 4.1.5中的Sum代码

    • p241 练习题4.5中自己编写的AbsSum代码

    • p251示例中的代码

    课后习题的解答

    p234 4.1

    • 4.1和4.2都考察了指令编码,难度不大。对照前面的表格做就可以。但要注意按字节反序负数的表示方法

    p235 4.2

    p241 4.5

    • 本题考察了大家写汇编代码的能力。要理解AbsSum和Sum的区别就在于多了一个将负数取相反数的过程(注释#部分为添加部分)。同时注意,题目要求用条件传送指令,就是cmovXX

    p241 4.6

    • 由课本知识得,当执行pushl%esp指令时,处理器的行为有两种约定:1)压入%esp的原始值,2)压入减去4得%esp的值。
    • subl是减法指令,用于做两个数之间的比较。这个减法结果为0告诉我们压入栈中的值是起始值。

    p244 4.8

    • 先写出xor的HCL表达式:bool xor=(!a&&b)||(a&&!b);很明显,这个式子与上述eq表达式互补。

    p247 4.10

    int Mid3 = [
    	A<=C && A>=B :A;
    	A<=B && A>=C :A;
    	B<=A && B>=C :B;
    	B<=C && B>=A :B;
    	1            :C;
    ];
    
    • 这道题很简单,冒号前面是条件,冒号后面是输出结果,回忆一下大二上HDL硬件描述语言的知识。

    p253 4.11

    • 4.11,4.12,4.16这三道题题型类似,意在分析某一指令在处理器中的具体实现过程,找到规律就不难。通用一列规则已给出,直接在具体那一列套具体数值即可。

    • 我做这几道题的时候都进行了查指令编码表的操作,比如下面这张表:

    • 答案

    p255 4.12

    p257 4.16

    p264 4.17

    bool need_valC = 
    	icode in {IIROMVL,IRMMOVL,IMRMOVL,IJXX,ICALL};
    

    家庭作业

    4.48

    取指阶段 icode:ifun=M1[PC]=C:0
    		rA:rB<-M1[PC+1]
    		valC<-M4[pc+2]
    		valP<-PC+6
    译码阶段 valB<-R[rB]
    执行阶段 valE<-valB+valC
    		SetCC
    写回阶段 R[rB]<-valE
    

    本周代码托管截图

    感悟与思考

    • 这周的学习的内容为“处理器体系结构”,比起前几章更加深入计算机内部。在安装Y86模拟器的时候碰到了一些麻烦,但所幸克服了。当时安装了很久,各种方法都尝试了,甚至以为是老师给的压缩包有问题,后来才发现是自己的粗心。在查错过程中,自己早就应该想到“再装一次”这种解决措施,但当时的我却没有,导致浪费了很多时间和精力。
    • 这一周因为需要敲的代码不是很多,对课后习题比以前更上心了一点,不再像往周只侧重于理论学习,毕竟“纸上得来终觉浅,绝知此事要躬行”。

    学习进度条

    代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 5000行 30篇 400小时
    第一周 0/0 1/2 15/30
    第二周 56 /56 2/3 15/45
    第三周 89/145 1/4 20/65
    第五周 500/645 1/5 20/85
    第六周 150/795 1/6 20/105

    参考资料

  • 相关阅读:
    dubbo
    Executer invokeAll
    java并发编程实战 java并发编程的艺术 阅读随笔
    小程序如何获取指定类名高度
    一些好用的Swift三方框架
    微信小程序checkbox多选传多个参数的操作
    关于xcode出现An unknown error occurred. See the install log for more details安装失败解决办法
    iOS 针对于13.0和暗黑模式出现的适配问题
    iOS UITextField如何禁止输入表情及特殊字符
    判断iPhoneX适配问题
  • 原文地址:https://www.cnblogs.com/xxy745214935/p/5991420.html
Copyright © 2011-2022 走看看