我正在学习gem5上程序的运行过程。并且读了一些书。但是我仍然对程序执行中的部分感到困惑。我下面的理解正确吗?
- 首先将计算机指令放入ICache,由计算机CPU控制指令的取指,将取指的指令放入指令队列。然后从指令队列中取出指令,将指令解码为微操作. 这些微操作将被发送到重新排序缓冲区。如果重新排序缓冲区中的微操作是加载/存储,则将其发送到加载/存储队列。如果是加减法等运算,则直接发送给执行单元。在这个过程中,每个执行单元都有一个保留站用于寄存器重命名。微操作完成后,会返回reorder buffer。当微操作到达reorder buffer的头部时,可以将其写回Cache或CPU外的内存中。
- 加载队列将从缓存中获取数据。缓存一般是虚拟地址索引和物理地址标签。加载操作将并行从缓存中获取并执行虚拟地址转换。如果 Cache 未命中,加载操作将被发送到 MSHR。MSHR 将获取的数据发送到内存。如果数据在内存中,则先将数据取到Cache中,再将取到的数据返回到MSHR,再返回到加载队列。如果数据不在内存中,操作系统会发出缺页,然后将数据从硬盘中取出到内存中,从Cache中取出,然后返回到MSHR,再返回到加载队列。
问题:
- 微操作是指解码时的mov、add等操作吗?
- 指令发出是指发送到重排序缓冲区还是从重排序缓冲区发送到执行单元的微操作?指令解码后,是直接送到reorder buffer吗?
- dispatch 和 issue 指的是同一个过程吗?
- 我还看到了一些队列,例如浮点数队列或其他队列。这是指指令从reorder buffer发送到执行单元时,由于执行单元不足而临时存放指令的地方吗?这些队列与 Tomasulo 算法中的预约站指的是同一个东西吗?