处理器体系结构

Y86指令集体系结构

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

程序员可见的状态

  • Y86程序中的每条指令都会读取或修改处理器状态的某些部分。
  • 程序员:
    • 1.用汇编代码写程序的人。
    • 2.产生机器级代码的编译器。
  • 类似IA32,存在8个程序寄存器。
  • 3个一位的条件码:ZF、SF、OF
  • 程序计数器PC存放当前正在执行指令的地址
  • 存储器,保存程序和数据。Y86用虚拟地址来引用存储器位置
  • 状态码Stat,表明程序执行的总体状态——可行or异常

Y86指令

  • movl指令:

    • irmovl
    • rrmovl
    • mrmovl
    • rmmovl
    • 第一个字母表示源的类型,第二个字母表示目的的类型
    • i-立即数 r-寄存器 m-存储器
  • OPl(整数操作指令):
    • addl
    • subl
    • andl
    • xorl
    • 只对寄存器数据进行操作,不对存储器数据进行操作
    • 将会设置ZF(zero flag)、SF(sign flag)、OF(over flag)
  • 跳转指令:
    • jmp 跳转
    • jle 有符号≤
    • jl 有符号<
    • je 相等/零
    • jne 不相等/非零
    • jge 有符号≥
    • jg 有符号>
  • cmovXX(条件传送指令):
    • cmovle
    • cmovl
    • cmove
    • cmovne
    • cmovge
    • cmovg
    • 仅当条件码满足所需要的约束时,才会更新目的寄存器的值。
    • 需注意条件传送只发生在两个寄存器之间,不会将数据传送到存储器。
  • call:
    • 将返回地址入栈,跳到目的地址
  • ret:
    • 返回地址入PC,并跳到返回地址
  • pushl和popl:
    • 入栈和出栈操作
  • halt:
    • 这个指令将会终止指令的执行。

指令编码

  • 每条指令的第一个字节表明指令的类型

    • 该字节分为两个部分,每个部分4位

      • 高4位是代码部分,取值范围0~0xB
      • 低4位是功能部分
    • 传送指令 代码部分为2
    • 整数部分 代码部分为6
    • 分支指令 代码部分为7
  • 8个程序寄存器每个都有相应的0~7的寄存器标识符
    • 0 —— %eax
    • 1 —— %ecx
    • 2 —— %edx
    • 3 —— %ebx
    • 4 —— %esp
    • 5 —— %ebp
    • 6 —— %esi
    • 7 —— %edi
    • F —— 无寄存器
  • 有些指令需要一个附加的4字节常数字,这个字能作为irmovl的立即数数据mrmmovl和mrmovl的抵制指示符的偏移量,以及分支指令和调用指令的目的地址。(!分支指令和调用指令的目的地址是一个绝对地址)
  • Y86的重要性质:字节编码必须有唯一的解释。

IA32和Y86的不同 详见p235

Y86异常

  • 状态码Stat:

    • AOK —— 程序执行正常
    • HLT —— 处理器执行halt指令
    • ADR —— 遇到非法地址
    • INS —— 遇到非法指令

Y86程序

  • Y86代码与IA32代码的主要区别在于:它可能需要多条指令来执行一条IA32指令所完成的功能。
  • 在Y86代码中,以“.”开头的词为汇编器命令,它们告诉汇编器调整地址,以便在那儿产生代码或插入一些数据
YIS(指令模拟器)
  • 目的是模拟Y86机器代码程序的执行,而不用试图区模拟任何具体处理器实现的行为。
  • 模拟输出的第一行总结了执行以及PC和程序状态的结果值。
  • 模拟器只打印出在模拟过程中被改变了的寄存器或存储器中的字。左边是原始值,右边是最终值。

一些Y86指令的详情

  • pushl 把栈指针减4,并且将一个寄存器值写入存储器。
  • pushl %esp时,处理器的行为是不确定的,通常有两种约定:
    • 压入%esp的原始值
    • 压入减去4的%esp的值

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

  • 要实现一个数字系统需要三个主要的组成部分:

    • 计算对位进行操作的函数的组合逻辑
    • 存储位的存储器元素
    • 控制存储器元素更新的时钟信号
  • HCL
    • 它是一种文本表示,用来描述硬件结构而不是程序行为的。
    • 最常用的语言是verilog,类似C语言
    • 另一种是VHDL,类似Ada

逻辑门

  • 逻辑门是数字电路的基本计算元素。
  • 它们的输出,等于它们输入位值的某个布尔函数。
  • 只对单个位的数进行操作。
    • 所以三个输入的AND门,输入为a、b和c,用HCL表示就是a&&b&&c。
C语言中运算符的逻辑门对应的HCL表达式
  • AND —— &&
  • OR —— ||
  • NOT —— !

组合电路和HCL布尔表达式

  • 将很多的逻辑门组合成一个网,就能构建计算块,称为组合电路。
  • 构建需要两条限制:
    • 两个或多个逻辑门的输出不能连接在一起。否则它们可能会使线上的信号矛盾,可能会导致一个不合法的电压或电路故障;
    • 这个网必须是无环的。也就是在网中不能有路径经过一系列的门而形成一个回路,这样的回路会导致该网络计算的函数有歧义。

多路复用器(MUX)

  • 可以根据输入控制信号的值,从一组不同的数据信号中选出一个。

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

  • 我们设计能对数据字进行操作的电路,有一些位级信号,代表一个整数或一些控制模式。
  • 执行字级计算的组合电路根据输入字的各个位,用逻辑门来计算输出字的各个位。
  • 在HCL中,我们将所有字级的信号都声明为int,不指定字的大小。
  • 在HCL中,多路复用函数是用情况表达式来描述的。
    • 其通用格式为:

        [
      select_1 : expr_1 # words
      select_2 : expr_2 # words
      .
      .
      .
      select_k : expr_k # words
      ]
      select 表明什么时候该选择这种情况
      expr 指明得到的值
      words 表示注释,跟在#后

算术/逻辑单元(ALU)

  • 根据函数输入的设置,该电路会执行四种算术和逻辑运算中的一种

集合关系

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

    • iexpr in {iexpr1,iexpr2,iexpr3,····,iexprk} 此处被测试的值iexpr和待匹配的值iexpr1~iexprk都是整数表达式。
    • 例如bool s1 == code in { 2,3 } 等同于 bool s1 = code == 2 || code == 3

存储器和时钟

  • 组合电路从本质上是不存储任何信息,仅是响应输入信号,产生等于输入的某个函数的输出。
  • 时序电路
    • 有状态并且在这个状态进行计算的系统。
    • 为实现该电路,必须引入按位存储信息的设备。
    • 存储设备由同一个时钟控制,时钟是一个周期性信号。
  • 两类存储器设备:
    • 时钟寄存器(简称寄存器)存储单个位或字。时钟信号控制寄存器加载输入值。

      • 注意区别硬件寄存器和程序寄存器
    • 随机访问存储器(简称存储器)存储多个字,用地址来选择该读或该写哪个字。

寄存器文件

  • 其有两个读端口(A和B),一个写端口(W)。
  • 可随机访问存储器允许同时进行多个读和写操作。
  • 寄存器文件不是组合电路,因为它有内部存储。
  • 向寄存器文件写入字是由时钟信号控制的,控制方式类似于将值加载到时钟寄存器。
  • 在大多数实际系统中,存在具有双端口的存储器:一个用来读指令,另一个用来读或写数据。

Y86的顺序实现

将处理组织成阶段(六个基本阶段)

  • 取指(fetch):取指阶段从存储器读取指令字节,地址位程序计数器(PC)的值。
  • 译码(decode):译码截断从寄存器文件读入最多两个操作数,得到值valA和valB。
  • 执行)(exectue):算术/逻辑单元(ALU)要么执行指令指明的操作(根据ifun的值),计算存储器引用的有效地址,要么增加或减少栈指针。得到的值为valE。
  • 访存(memory):可以将数据写入存储器,或者从存储器独处数据。独处的值位valM。
  • 写回(write back):写回截断最多可以写两个结果到寄存器文件。
  • 更新PC(PC update):将PC设置成下一条指令的抵制。
  • 处理器无限循环,执行这些阶段。
  • 当发生异常时,处理器就会停止。完整的设计中,处理器还将进入异常处理模式,开始执行由异常的类型决定的特殊代码。

Y86指令OPl,rrmovl,irmovl在顺序实现中的计算:

icode:ifun表明指令字节的两个组成部分,rA:rB表明寄存器指示符字节的两个组成部分。符号M1[x]表示访问存储器位置x处的一个字节,而M4[x]表示访问四个字节

Y86指令存储器读写指令rmmovl和mrmovl所需处理:

Y86指令pushl和popl所需处理:

Y86指令三类控制转移指令所需处理:

SEQ硬件结构

硬件单元与各个处理阶段相关联:

  • 取值:将程序计数器寄存器作为地址,指令存储器读取指令的字节。PC曾佳琪计算valP,即增加了的程序计数器。
  • 译码:寄存器文件有两个度端口A和B,从这两个端口同时读寄存器值valA和valB。
  • 执行:执行截断会根据指令的类型,将算术/逻辑单元(ALU)用于不同的目的。对整数的操作,它要执行指令所指定的运算。对其他指令,它会作为一个加法器来计算增加或减少栈指针,或者计算有效地址,或者只是简单地加0,将一个输入传递到输出。
  • 访存:在执行访存操作,数据存储器独处或写入一个存储器字。指令和数据存储器访问的是相同的存储器位置,但是用于不同的目的。
  • 写回:寄存器文件由两个写端口。端口E用来写ALU计算出来的值,而端口M用来写从数据存储器中读出的值。

SEQ画图惯例

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

SEQ的时序

  • 时间寄存器(程序计数器和条件码寄存器)
  • 随机访问存储器(寄存器文件、指令存储器和数据存储器)
  • 组合逻辑补需要任何时序或控制
  • 程序计数器、条件码寄存器、数据存储器和寄存器文件需要对它们的时序进行明确的控制
    • 每个时钟周期,程序计数器都会装在新的指令地址。
    • 只有在执行整数运算指令时,才会装在条件码寄存器。
    • 只有在执行rmmovl、pushl、call指令时,才会写数据存储器。
    • 寄存器端口的两个写端口允许每个时钟周期更新两个程序寄存器,可用特殊的寄存器ID 0xF作为端口地址,来表示在词端口不应该执行写操作。

保持等价性的原则:

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

SEQ阶段的实现

基本的内容与Y86阶段的一致,细节的差异查看教材p263以后的相应内容。

实验练习

根据指令输入



得到结果如下

遇到的问题

在对于Y86模拟器进行安装时,make后出现cannot find -lfl。在答疑小组找到了同样问题的同学,参照老师您给出的解决方法,安装了flex,但再一次make后的结果提示cannot find -ltk cannot find -ltcl。此问题在答疑小组中也有同学出现并提出疑问,链接在此http://group.cnblogs.com/topic/73191.html,我也试着百度下解决问题的方法,得到的结果是缺少libxxx.o,但我不知道需要怎么来填补这个缺少的文件。截至blog发出时,此问题还未解决,劳老师您费心帮忙找到解决的方法。

参考资料

1.《Computer.Systems.A.Programmer's.Perspective.2nd.CN》教材

2.《X86的孪生兄弟,Y86指令体系结构》左潇龙的技术博客 http://www.cnblogs.com/zuoxiaolong/p/computer21.html?utm_source=tuicool&utm_medium=referral

Linux第五次学习笔记的更多相关文章

  1. Linux 第五章 学习笔记

    ---恢复内容开始--- 第五章 系统调用 一.与内核通信 1.系统调用在用户控件进程和硬件设备之间添加了一个中间层. 为用户空间提供了一种硬件的抽象接口 系统调用保证了系统的稳定和安全 每个进程都运 ...

  2. 20135320赵瀚青LINUX第五周学习笔记

    赵瀚青原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 概述 按照刘老师的周从三个角 ...

  3. 《Linux内核设计与实现》课本第五章学习笔记——20135203齐岳

    <Linux内核设计与实现>课本第五章学习笔记 By20135203齐岳 与内核通信 用户空间进程和硬件设备之间通过系统调用来交互,其主要作用有三个. 为用户空间提供了硬件的抽象接口. 保 ...

  4. 《Linux内核设计与实现》第五章学习笔记

    <Linux内核设计与实现>第五章学习笔记 姓名:王玮怡  学号:20135116 一.与内核通信     在Linux中,系统调用是用户空间访问内核的唯一手段:除异常和陷入外,它们是内核 ...

  5. 《Linux内核分析》第五周学习笔记

    <Linux内核分析>第五周学习笔记 扒开系统调用的三层皮(下) 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.c ...

  6. linux内核分析第五周学习笔记

    linux内核分析第五周学习笔记 标签(空格分隔): 20135328陈都 陈都 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.co ...

  7. 20165326 java第五周学习笔记

    第五周学习笔记 ch7 内部类(&外嵌类) 内部类的类体不可以声明类变量和方法 内部类如同类的变量或方法 内部类和外嵌类在编译时生成两个class文件 匿名类 某个类的一个子类没有明显的用类声 ...

  8. Linux第五周学习总结——扒开系统调用的三层皮(下

    Linux第五周学习总结--扒开系统调用的三层皮(下) 作者:刘浩晨 [原创作品转载请注明出处] <Linux内核分析>MOOC课程http://mooc.study.163.com/co ...

  9. Linux——帮助命令简单学习笔记

    Linux帮助命令简单学习笔记: 一: 命令名称:man 命令英文原意:manual 命令所在路径:/usr/bin/man 执行权限:所有用户 语法:man [命令或配置文件] 功能描述:获得帮助信 ...

随机推荐

  1. 原生JS获取各种高度宽度、浏览器窗口滚动条的位置、元素的几何尺寸名

    1)关于 pageX, clienX,offsetX,layerX pageX:鼠标在页面上的位置,从页面左上角开始,即是以页面为参考点,不随滑动条移动而变化 clientX:鼠标在页面上可视区域的位 ...

  2. Effective Java 13 Minimize the accessibility of classes and members

    Information hiding is important for many reasons, most of which stem from the fact that it decouples ...

  3. SpringMVC 返回 html 视图页面,SpringMVC与Servlet,Servlet重定向与转发

    1. SpringMVC与Servlet的关系 SpringMVC框架是建立在Servlet之上的,提供各种功能,各种封装,各种方便的同时,它一点儿也没有限制Servlet,我们完全可以在Spring ...

  4. 关于nginx的限速模块

    nginx 使用 ngx_http_limit_req_module和ngx_http_limit_conn_module 来限制对资源的请求 这种方法,对于CC攻击(Challenge Collap ...

  5. 读书笔记——网络编程与开发技术(3)基于TCP/IP协议的网络编程相关知识

    TCP/IP协议:数据链路层,网络层,传输层,应用层. IP地址分为5类:A类.B类.C类.D类.E类. (A类.B类.C类是基本类,D类多用于多播传送,E类为保留类.) "*"表 ...

  6. ElasticSearch Filter Aggregations

    类似于sql语句中where子句的作用 { "query": { "match_all": {} }, "aggs": { "ag ...

  7. Linux运维式具之pdsh

    做系统运维的时候,我们经常需要同时在多台机器上执行相同的命令,这个时候可以使用类似pssh,pdsh的并行执行shell的工具. 当然,之前在没有使用这些工具之前,如果有ssh无密码互访,我们可以自己 ...

  8. SSH applicationContext.xml文件配置

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  9. 谈MongoDB读取连接超时的异常

    今天在现场的哥们发来异常,让我解决,错误信息如下: HTTP Status 500 - Read operation to server 192.168.1.110:20001 failed on d ...

  10. NOIP2007 T1奖学金 解题报告-S.B.S.

    洛谷P1093 题目描述 某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金.期末,每个学生都有3门课的成绩:语文.数学.英语.先按总分从高到低排序,如果两个同学总分相同, ...