CSAPP学习笔记 -- 第四章 处理器体系结构(二)

4.3 Y86-64的顺序实现

4.3.1 将处理组织成阶段
  • 取指
    • 从内存中读取指令字节,地址为PC的值
    • 取出包括指令代码、指令功能、寄存器操作数、常数字操作数
    • 计算PC更新后的值
  • 译码
    • 取出(取址阶段取出的)寄存器rA、rB内的值
  • 执行
    • ALU执行指令指明的操作
    • 设置条件码
    • 更新目标寄存器
    • 对一条跳转指令来说,这个阶段决定是不是应该选择分支
  • 访存
    • 从内存中读出数据
    • 将数据写入内存
  • 写回
    • 将结果写回寄存器(最多两个)
  • 更新PC
    • 将PC设置成下一条指令的地址
    • 进入下一条指令执行阶段
 
跟踪指令执行
    • 参数顺序与x86-64一致
    • 计算在执行阶段发生,计算结果在写回阶段写回
  • 跟踪subq指令执行(rrmovq,irmovq类似)
    • rrmovq指令类似,不需要取第二操作数,将第一操作数和0相加,结果写回第二操作数即可
    • irmovq指令类似,除了第一个数是常数值,长指令格式使PC+10
  • 跟踪rmmovq,mrmovq指令执行
  • 跟踪pushq,popq指令执行
    • 栈指针的更新(写回阶段)实际上是在内存读写操作(访存阶段)完成之后才完成的
    • popq指令在译码阶段要读两次栈指针,一次作为内存访问地址,一次作为栈指针更新地址
  • 跟踪控制转移指令jXX,call,ret的执行
    • call,ret指令和pushq,popq指令类似
 
4.3.2 SEQ硬件结构
  • 硬件图约定
    • 白色方框表示时钟寄存器。程序计数器PC是SEQ中唯一的时钟寄存器。
    • 浅蓝色方框表示硬件单元。这包括内存、ALU等等。在我们所有的处理器实现中,都会使用这一组基本的单元。我们把这些单元当作“黑盒子”,不关心它们的细节设计。
    • 控制逻辑块用灰色圆角矩形表示。这些块用来从一组信号源中进行选择,或者用来计算一些布尔函数。我们会非常详细地分析这些块,包括给出HCL描述。线路的名字在白色圆圈中说明。它们只是线路的标识,而不是什么硬件单元。
    • 宽度为字长的数据连接用中等粗度的线表示。每条这样的线实际上都代表一簇·64根线,并列地连在一起,将一个字从硬件的一个部分传送到另一部分。
    • 宽度为字节或更窄的数据连接用细线表示。根据线上要携带的值的类型,每条这样的线实际上都代表一簇4根或8根线。
    • 单个位的连接用虚线来表示。这代表芯片上单元与块之间传递的控制值。
 
4.3.3 SEQ的时序
SEQ的实现包括组合逻辑和两种存储器设备:时钟寄存器(程序计数器和条件码寄存器),随机访问存储器(寄存器文件、指令内存和数据内存)
  • 组合逻辑不需要任何时序或控制
    • 只要输入变化了,值就通过逻辑门网络传播
    • 将读随机访问存储器看成和组合逻辑一样的操作
    • 由于指令内存只用来读指令,因此我们可以将这个单元看成是组合逻辑
  • 还剩四个硬件单元需要对它们的时序进行明确的控制——程序计数器、条件码寄存器、数据内存和寄存器文件
    • 每个时钟周期,程序计数器都会装载新的指令地址。
    • 只有在执行整数运算指令时,才会装载条件码寄存器。只有在执行rmmovq、pushg或cal1指令时,才会写数据内存。
    • 寄存器文件的两个写端口允许每个时钟周期更新两个程序寄存器,不过我们可以用特殊的寄存器IDOxF作为端口地址,来表明在此端口不应该执行写操作
  • 要控制处理器中活动的时序,只需要寄存器和内存的时钟控制
 
从不回读原则——处理器从来不需要为了完成一条指令的执行而去读由该指令更新了的状态。
  • pushq指令先执行写操作后更新%rsp的值
  • 没有指令同时设置和读取条件码
 
跟踪SEQ执行周期
  • 在周期3末尾点②处,虽然组合逻辑已经被addq指令更新了,但是只有在时钟上升后(周期4点③处),条件码寄存器、程序计数器、寄存器文件才能更新
  • 用时钟来控制状态单元的更新,以及值通过组合逻辑来传播,足够控制我们SEQ实现中每条指令执行的计算了。每次时钟由低变高时,处理器开始执行一条新指令
posted @ 2020-08-18 21:54  Yoke_cc  阅读(316)  评论(0编辑  收藏  举报