2017-2018-1 20179226 《深入理解计算机系统》第4周学习总结

教材学习知识点总结

本章主要介绍了处理器硬件的设计。

4.1 Y86-64 指令集体系结构

1.Y86-64 有8个程序寄存器:%rax,%rcx,%rdx,%rbx,%rsi,%rdi,%rsp,%rbp 和 %r8 到 %r14(少了 %r15)。%rsp 被入栈、出栈、调用和返回指令作为栈指针,其它寄存器没有固定的含义或固定值。
2.每条指令的第一个字表明指令的类型,高4位是代码部分,低4位是功能部分。
3.rmmovq %rsp,0x123456789abcd(%rdx)中偏移量要放在8字节的常数字中,所以得先填充0变成8字节,然后再按反序输出,最后字节编码为 4042cdab896745230100。

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

1.要实现一个数字系统需要三个主要组成部分:
1)计算对位进行操作的函数的组合逻辑
2)存储位的存储器单元
3)控制存储器单元更新的时钟信号
2.逻辑门是数字电路的基本计算单元,只对单个位的数字进行操作,而不是整个字。
3.将很多的逻辑门组合成一个网,就能构建计算块,称为组合电路。构建这些网时,两个或多个逻辑门的输出不能连在一起且这个网必须是无环的。
4.为了产生时序电路,必须引入按位存储信息的设备。一类是时钟寄存器(简称寄存器),储存单个位或字。另一类是随机访问储存器(简称储存器):储存多个字,用地址选择该读/写哪个字,例子包括处理器的虚拟内存系统和寄存器文件。
5.每当每个时钟到达上升沿时,值才会从寄存器的输入传送到输出。
6.如果我们试图同时读和写同一个寄存器会发生什么?我们会看到一个从旧值到新值的变化。

4.3 Y86-64的顺序实现

1.处理一条指令包含很多操作,将它们组织成某个特殊的阶段序列。分为以下几个阶段:
1)取指:取指阶段从存储器读取指令字节,地址为程序计数器(PC)的值
2)译码:译码阶段从寄存器文件读入最多两个操作数,得到val A 和 / 或 val B
3)执行:执行阶段,算术/逻辑单元要么执行指令明确的操作(根据ifun的值),计算存储器引用的有效地址,要么增加或减少栈指针。得到的值为valE
4)访存:访存阶段可将数据写入存储器或从存储器读出数据
5)写回:最多可写两个结果到寄存器文件
6)更新PC:将PC设置成下一指令的地址
2.要控制处理器中活动的时序,只需要寄存器和内存的时钟控制。通过时钟周期来控制元素的更新,通过组合逻辑来传播,每次时钟周期由低到高时,处理器开始执行一条新指令。处理器从来不需要为了完成一条指令的执行而去读该指令更新了的状态。

4.4 流水线的通用原理

1.流水线阶段之间的指令转移是由时钟信号来控制的。每隔120ps信号从0上升至1,开始下一组流水线阶段的计算。
2.流水线的局限性:
1)不一致的划分:由于阶段的延迟并不一样,这样空闲的空间就增加了延迟
2)流水线过深,收益反而下降

4.5 Y86-64 的流水线实现

1.对SEQ中五个阶段的顺序进行调整,使得更新PC阶段在一个时钟周期开始时执行,而不是在结束时才执行。
2.数据相关和控制相关可能会导致流水线产生计算错误,成为冒险。首先关心数据冒险,然后再考虑控制冒险。
3.避免数据冒险的方法:
1)暂停:将指令阻滞在译码阶段,相当于加入一条nop指令,直到产生它的源操作数指令通过了写会阶段。
2)转发:将结果值直接从一个流水线阶段传到较早阶段。
4.异常处理方法:
1)由流水线最深的指令引起的异常,优先级最高
2)多条分支中有异常,取消预测指令
3)根据状态码stat发现异常,禁止其他指令更新程序状态

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

  • 问题1:rmmovq %rcx,-3(%rbx)的机器码是4013fdffffffffffffff,为什么?
  • 问题1解决方案:因为-3对应的十六进制为0xfffffffffffffffd,转换的方法第二章讲过了,然后得到的结果再反序就可以了。
原文地址:https://www.cnblogs.com/9226ryf/p/8461170.html