zoukankan      html  css  js  c++  java
  • 20125337——信息安全系统设计基础第五周学习笔记

    第四章 处理器体系结构

    知识点

    ISA:指令集体系结构——一个处理器支持的指令和指令的字节级编码。
    HCL:硬件控制语言——一种描述硬件系统控制部分的简单语言。

    1.Y86指令集体系结构

    a.就是ISA的一个子集。

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

    c.可见状态: 寄存器、存储器、条件码、PC、程序状态。

    寄存器:8个,每一个寄存器可以存储一个字,也就是一个32位二进制。
    条件码:一个一位二进制的寄存器,保存着最近的算术或逻辑运算所造成的影响的信息。
    PC:程序计数器,记录当前正在执行的指令的地址。
    存储器:很大的字节数组,保存着程序和数据,用虚拟地址来访问存储器,硬件和操作系统会将虚拟地址翻译为实际的(或物理)地址。
    状态码:stat表明程序执行的总体状态(正常还是出现某种异常)。
    

    d.指令

    xxmovl:数据传送指令,其中r代表寄存器,m代表存储器,i代表立即数。比如rrmovl指令,则代表将一个寄存器的值,赋给另外一个寄存器。
    *不允许:存储器地址直接传给存储器地址;立即数传给存储器。
    
    opl:操作指令,只对寄存器数据进行操作,设置三个条件码zf、sf、of。
    
    jxx:条件跳转指令,根据分支指令类型和条件码设置进行跳转。
    
    cmovxx:条件传送指令,后面的xx代表的是条件。
    *只发生在两个寄存器之间,不会将数据传送到存储器。
    
    call:将返回地址入栈,并跳到目标地址。
    ret:将返回地址入PC,并跳到返回地址。
    
    push与pop:入栈和出栈操作。
    
    halt:终止指令的执行。
    *处理器停止,并将状态码设置成HLT。
    

    e.指令编码

    • 性质(无二义性):字节编码必须有唯一的解释。任意一个字节序列要么是一个唯一的指令序列的编码,要么就不是一个合法的字节序列。
    • 每条指令的第一个字节表明指令的类型:(功能值只有在一组相关指令共用一个代码时才有用)
    高4位:代码部分(例:6是整数操作)
    低4位:功能部分(例:0是整数中的加法指令) 
    *60合起来即为add指令。
    
    • 程序寄存器存在CPU中的一个寄存器文件中。这个寄存器文件就是一个小的,以寄存器ID作为地址的随机访问存储器。当需要指明不应访问任何寄存器时,就用ID值0xF表示。
    • 当有附加的寄存器指示符字节,指定一个或者两个寄存器。这些寄存器字段为rA和rB。
    • 根据指令类型,1.指令可指定用于数据源和目的寄存器;2.用于地址计算的基址寄存器。
    call:没有寄存器操作数,就没有寄存器指示符字节。
    irmovl、pushl、popl:只需一个寄存器操作数,将另一个寄存器指示符设为0xF。
    
    • 当需要一个附加的4字节常数字。这个字可作为:1.irmovl的立即数;2.rmmovl、mrmovl的地址指示符偏移量;3.分支指令、调用指令的目的地址(绝对地址)。

    f.异常

    1.状态码stat:描述程序执行的总体状态

    1:AOK,正常操作
    2:HLT,处理器执行halt指令
    3:ADR,遇到非法地址
    4:INS,遇到非法指令
    

    遇到异常,处理器停止执行指令。

    2.Y86代码与IA32代码主要区别:

    Y86需要多条指令来执行一条IA32指令完成的功能。
    Y86没有伸缩寻址模式。

    3.Y86汇编代码

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

    2.逻辑设计和硬件语言HCL

    • 数字系统三部分组成:组合逻辑、存储器元素、时钟信号。
    • HCL:硬件控制语言,描述不同处理器设计的控制逻辑。

    a.逻辑门

    1.HCL表示与、或、非:a&&b、a||b、!a。每个门产生的输出等于他输入的某个布尔函数。

    2.将很多逻辑门组合成一个网,就能构建计算块,称为组合电路。

    限制:1.两个及以上逻辑门的输出不能连接在一起(会产生信号矛盾)。
    2.网必须是无环的,不可以有路径经一系列门而形成回路。
    
    如:检测位相等:bool eq=(a&&b)||(!a&&!b);
    

    3.MUX:多路复用器,根据输入控制信号的值,从一组不同的数据信号中选出一个。

    如:bool out=(s&&a)||(!a&&b);(s是控制信号)
    

    4.组合逻辑电路和C语言中逻辑表达式区别:

    组合电路:逻辑门组成;输出会持续响应输入变化;只对0、1进行操作。
    C语言逻辑表达式:只在程序执行过程中遇到时进行求值;允许参数是任何数;可能只被部分求值,如果第一个参数可以确定值,第二个参数就不用操作了。
    

    5.多路复用函数用情况表达式。格式:

    [
    	s_1:e_1
    	s_2:e_2
    	...
    	s_k:e_k
    	1:无情况,则选这。
    ]
    *s_i:布尔表达式,指明何时该选;e_i:整数表达式,得到的值。
    

    6.选择表达式:可任意布尔表达式,使得情况表达式能描述带复杂选择标准的、多种输入信号的块。
    (关于逻辑门的知识同上学期学的EDA很类似)

    7.ALU:算术/逻辑单元,一种很重要的组合电路,这个电路有三个输入:两个数据输入及一个控制输入。

    b.存储器和时钟

    • 组合电路从本质上讲,不存储任何信息。它们只是简单地响应输入信号,产生等于输入的某个函数的输出。
    • 为了产生时序电路,也就是有状态并且在这个状态上进行计算的系统,我们必须引入按位存储信息的设备。
    • 存储设备都是由同一个时钟控制,时钟是一个周期性信号,决定了什么时候要把新值加载到设备中。
    • 大多数时候,寄存器都保持在稳定状态(x),产生的输出等于它的当前状态。信号沿着寄存器前面的组合逻辑传播,这时,产生了一个新的寄存器输入(y),但只要时钟是低电位的,寄存器的输出就仍然保持不变。当时钟变成高电位的时候,输入信号才加载到寄存器中,成为下一个状态y,直至下一个时钟的上升沿。
    • 寄存器是作为电路不同部分中的组合逻辑之间的屏障。每当每个时钟到达上升沿时,值才会从寄存器的输入传送到输出。

    3.Y86顺序实现

    a.各阶段及其内执行操作

    • 取指

    从存储器读取指令字节,放到指令存储器(CPU中)中,地址为程序计数器(PC)的值。

    按顺序的方式计算当前指令的下一条指令的地址(即PC的值加上已取出指令的长度)

    • 译码

    从寄存器文件读入最多两个操作数。读入指令rA、rB字段指明的寄存器。

    • 执行

    根据指令的类型,将算数/逻辑单元(ALU)用于不同的目的。

    计算增加或减少栈指针;
    计算有效地址;
    只是简单地加0,将一个输入传递到输出;
    也可能设置条件码;
    
    • 访存

    将数据写入存储器;或从存储器读出数据。
    数据存储器(CPU中)读出或写入一个存储器字。指令和数据存储器访问的是相同的存储器位置,但是用于不同的目的。

    • 写回

    最多可以写两个结果到寄存器文件。

    寄存器文件有两个写端口。端口E用来写ALU计算出来的值,而端口M用来写从数据存储器中读出的值。

    • 更新PC

    将PC设置成下一条指令的地址。

    b.SEQ时序

    1.SEQ的实现包括:组合逻辑和两种存储器设备

    时钟寄存器:程序计数器、条件码寄存器
    随机访问存储器:寄存器文件、指令存储器、数据存储器
    

    2.需要用时序进行明确控制:程序计数器、条件码寄存器、寄存器文件、数据存储器。

    3.每个时钟周期,程序计数器都会装载新的指令地址。

    只有在执行整数运算指令时,才会装载条件码寄存器。

    只有在执行mov、push、call指令时,才会写数据存储器。

    遇到问题及解决

    1.我们不支持第二变址寄存器和任何寄存器值的伸缩.

    • 解决:第一,我理解的伸缩是没有像IA32,如%eax32位,可以划分出%ax16位,还可以划分出%al,%ah。
      第二,参考答疑小组[3]知道,第二变址寄存器是指这是和IA32的比较,P113页有Imm(Eb,Es,s)的通用寻址方式,Y86不支持。

    2.对于如何将汇编码转换成字节编码,只看看文字依然不懂。

    • 解决:在练习题中实践。

    以练习题1为例.如irmovl $15,%ebx
    irmovl:i表示立即数,r表示寄存器;即是将一立即数付给寄存器。
    由ir可知:第一个字节:30
    由$15可知:不访问任何寄存器,指示符字节F。
    由%ebx可知:指示符字节3。
    根据小端法,将15的十六进制反向写开为0f 00 00 00
    因此,该句的字节编码是30f30f000000。
    

    3.字节编码中,左边一列的地址偏移量如何确定?

    • 解决:在练习题中实践。

    以练习题2为例.如0x100:30f3fcffffff/406300080000/00(/自己划分的)分三块
    *第一块30f3fcffffff
    30:irmovl(6字节,下一个地址偏移量是6,所以下一个地址是0x106;6字节,所以划分到4前面)
    f:立即数
    3:%ebx
    fcffffff:(小端法)反向写为fffffffc,即是-4
    *第二块406300080000(分析方法同第一块)
    *第三块00,即是halt停止
    故,本条指令前的地址偏移量是依据上一条指令所占字节确定的。
    

    总结:关于Y86指令,主要通过练习题4.1和4.2,学会看书上的图4-2,4-3,4-4。

    4.在学习顺序实现时,参考网络上的博客,关于执行(execute),根据目的不同,其中一个目的是:只是简单地加0,将一个输入传递到输出。对于描述的这项功能不明白。

    • 解决:看课本,做练习。

     1.如课本图4-18第二列:rrmovl rA,rB
    	valE<——0+vlaA
     *分析:不需要取第二个寄存器操作数,将第二个输入设为0,把它和第一个操作数相加,得到valE=0+valA=valA
    
     2.如练习题4.11:irmovl $128,%esp
    	valE<——0+128=128
     *分析:和rrmovl处理方式类似。
    

    5.关于顺序实现中的计算课本图4-18,开始时始终不明白valP=PC值+已取指令长度。

    • 解决:参考了网络达人的博客[2],并反复读书,联系第一节的知识。

    已取指令长度:指令所占字节编码,即是字节数。
    如rrmovl rA,rB
    	valP<——PC+2(分析:rrmovl指令长度2字节,所以+2)
    

    总结:Y86顺序实现这节内容其实是将第一节练习题,如何做,怎么想,即做题思路进行计算机内部操作阶段的讲述。

    6.不是每个阶段都会进行,一些指令会跳过中间的某些阶段。

    • 我的理解(根据对各阶段的功能描述):

    译码:从寄存器文件读入。
    	如irmovl指令,立即数寻址,用不到寄存器,所以不用译码阶段。
    访存:写入或读出数据从存储器。
    	如rmmovl指令,需要将寄存器值valA写到存储器,或从存储器中读出valM,所以经历访存阶段。
    

    其他

    ##########实验

    构建YIS环境:



    YIS测试:

    使用vim查看asuml.yo汇编内容:

    ##########参考资料
    [1]《深入理解计算机系统》

    [2]http://blog.csdn.net/yang_yulei/article/details/22529437

    [3]http://group.cnblogs.com/topic/73168.html

  • 相关阅读:
    大四实习有点晚[转载]
    .net2.0数据绑定语法
    明天要去南京了
    Master & Content Page Relation(Event Ordering)
    在验证中使用图像和声音(ErrorMessage)
    设置FLash透明
    Basic Skill in .net2.0
    教育研究方法
    程序员是如何捕猎大象的[转]
    My lost card
  • 原文地址:https://www.cnblogs.com/zzzz5/p/4889360.html
Copyright © 2011-2022 走看看