zoukankan      html  css  js  c++  java
  • 20179215 《深入理解操作系统》第四章 处理器体系结构

    《深入理解计算机系统》第四章 读书笔记

     这章首先定义一个简单的指令集Y86-64,之后建立在对布尔函数和位级操作的基础上,介绍了硬件控制语言HCL,然后介绍了Y86-64的顺序实现,以及以该顺序设计为基础,创建了一个流水化的处理器,介绍了其顺序的具体实现。

    一、Y86-64 指令集体系结构





    Y86-64 指令集:


    注:

    • OPq 是 addq、subq、andq、xorq,只对寄存器数据进行操作,而 X86-64 还允许对内存数据进行此类操作
    • jXX代表 jmp、jle、jl、je、jne、jge、jg。

    比较:

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

    1.数字系统需要三个主要组成部分:

    • 计算对位进行操作的函数的组合逻辑
    • 存储位的存储器单元
    • 控制存储器单元更新的时钟信号

    2.逻辑门:
    AND用&&表示,OR用||表示,而NOT用!表示。逻辑门只对单个位的数进行操作。逻辑门总是活动的,输入变化输出很快就跟着变化。

    3.组合电路和HCL布尔表达式:

    用HCL来写这个网的函数:bool eq = (a && b) || (!a && !b)

    多路复用器(根据s的值选择是输出a或者b)用HCL来描述:out = (s && a) || (!s && b)

    将很多的逻辑门组合成一个网,就能构建计算块,称为组合电路。构建这些网时,两个或多个逻辑门的输出不能连在一起且这个网必须是无环的。通常设计的是能对字进行操作的电路:

    在HCL中,所有字级的信号都声明为int,不指定字的大小。此电路的函数在字级上表达成 bool Eq = ( A == B )

    三、Y86-64的顺序实现

    1.处理一条指令包含很多操作,将它们组织成某个特殊的阶段序列。分为以下几个阶段:

    • 取指:取指阶段从存储器读取指令字节,地址为程序计数器(PC)的值
    • 译码:译码阶段从寄存器文件读入最多两个操作数,得到val A 和 / 或 val B
    • 执行:执行阶段,算术/逻辑单元要么执行指令明确的操作(根据ifun的值),计算存储器引用的有效地址,要么增加或减少栈指针。得到的值为valE
    • 访存:访存阶段可将数据写入存储器或从存储器读出数据
    • 写回:最多可写两个结果到寄存器文件
    • 更新PC:将PC设置成下一指令的地址



    内存读写指令rmmovq和mrmovq所需要的处理:

    处理pushq和popq指令所需的步骤:

    三类控制转移指令的处理:各种跳转、call和ret。

    3.SEQ硬件结构


    四、流水线的通用原理

    1.计算流水线

    流水线阶段之间的指令转移是由时钟信号来控制的。每隔120ps信号从0上升至1,开始下一组流水线阶段的计算。

    五、Y86-64的流水线实现

    1.重新安排计算阶段

    作为实现流水线化设计的过渡步骤,需要调整SEQ中五个阶段的顺序,使得更新PC阶段在一个时钟周期开始时执行,而不是结束时才执行。这种修改过程称为“SEQ+”.

    2.插入流水线寄存器

    在 SEQ+ 的各个阶段之间插入流水线寄存器,并对信号重新排列,得到PIPE-处理器

    流水线寄存器按如下方式标号

    F : 保存pc预测值

    D :位于取指和译码之间,保存最新的指令信息,即将由译码阶段处理

    E :位于译码和执行之间,保存最新译码指令和从寄存器读出的值,即将由执行阶段处理

    M :位于执行和访存之间,保存最新执行指令的结果,条件分支和分支目标,即将由访存处理

    W :位于访存和反馈之间,提供给寄存器文件写,完成ret指令,向pc提供返回地址

    3.对序号进行重新排列和标号

    顺序实现SEQ和SEQ+在一个时刻只处理一条指令,因此注入valC、srcA和valE这样的信号值有唯一的值。在流水线化的设计中,与各个指令相关联的这些值有多个版本,会随着指令一起流过系统。

    采取的命名机制,通过在信号名前面加上大写的流水线寄存器名字作为前缀,存储在流水线寄存器中的信号可以唯一地被标识。还需要引用某些在一个阶段内刚刚计算出来的信号。它们的命名是在信号名前面加上小写的阶段名的第一个字母作为前缀。

    4.预测下一个PC

    流水线化设计的目的就是每个时钟周期都发射一条新指令,也就是说每个时钟周期都有一条新指令进入执行阶段并最终完成。

    5.流水线冒险

    冒险分为两类,数据冒险和控制冒险

    用暂停来避免数据冒险、用转发来避免数据冒险、加载/使用数据冒险、避免控制冒险。

    6.异常处理

    我们的指令集体系结构包括三种不同的内部产生的异常:halt指令,有非法指令和功能码组合的指令,取指或数据读写试图访问一个非法地址。

    由流水线最深的指令引起的异常,优先级最高

    多条分支中有异常,取消预测指令

    根据状态码stat发现异常,禁止其他指令更新程序状态

    7.PIPE各阶段的实现

    PC选择和取址阶段

    当预测错误分支进入访存阶段,PC选择逻辑会选择M_ valA中读出该指令valP的值(下一条指令的地址);当ret指令进入写回阶段时从W _ valM中读出的返回地址;其他情况下选择F_ predPC。

    译码和写回阶段

    执行阶段

    访存阶段

    8.实现多周期指令可以简单扩展执行阶段逻辑的功能,添加一些整数和浮点算术运算单元;用暂停来处理短时间的高速缓存不命中和用异常处理来处理长时间的缺页结合起来能够顾及到存储器访问时由于存储器层次结构引起的所有不可预测性。

  • 相关阅读:
    基于Furion的.NET5 WebApi开发框架
    由react的todolist想到的
    react第三节-基础概念梳理
    uniapp引入字体图标与uniapp传入事件对象与自定义参数
    (react+tsx)函数式组件传参问题
    关于git正确clone指定分支
    关于‘react-app-rewried 不是内部或外部命令’的深度解析
    flex下的多行对齐与预处理器中使用nth-child选择器
    webpack(2)--webapck自身的配置
    webpack解析(1)
  • 原文地址:https://www.cnblogs.com/yl-930/p/8469827.html
Copyright © 2011-2022 走看看