0%

Zicbom 与 mcache 指令对比

zicbom 提供的 cache 指令

Zicbom 指令 作用
CBO.FLUSH l1 & l2 cache 内容刷新到主存, 并将 cache line 状态置为无效, 下次访问该地址时, 会从主存 load 回来
CBO.CLEAN cache line 处于修改状态, 会将 cache line 的内容刷新回主存, 不改变该 cache line 的状态
CBO.INVAL 将 cache line 置为无效, 再次访问地址时, 会从主存上 load 回来

mcache

缓存操作用于控制操作,如初始化、失效、驱逐等。以下是缓存操作的简要描述:

  1. 索引写回失效(Index Writeback Invalidate):如果指定索引处的缓存行状态为有效且脏,该行将被写回到由缓存标记指定的内存地址。完成该操作后,缓存行的状态将设置为无效。如果行有效但不脏,则将行的状态设置为无效。
  2. 命中失效(Hit Invalidate):如果缓存包含指定地址,该缓存行的状态将设置为无效。
  3. 命中写回失效(Hit Writeback Inv):如果缓存包含指定地址且该行有效且脏,该行的内容将写回到主存。完成该操作后,缓存行的状态将设置为无效。如果行有效但不脏,则将行的状态设置为无效。
  4. 命中写回(Hit Writeback):如果缓存包含指定地址且该行有效且脏,该行的内容将写回到主存。完成操作后,行的状态保持有效,但脏状态被清除。
  5. 获取并锁定(Fetch And Lock):如果缓存包含指定地址,锁定该行。如果缓存不包含指定地址,从主存重新填充该行,然后锁定该行。 (只对 l2 cache 有效)

对比

对应于 cbo 指令:

  • mcache Hit Invalidate 与 CBO.INVAL 等效
  • mcache Hit Writeback 与 CBO.CLEAN 等效
  • mcache Hit WriteBack Inv 与 CBO.FLUSH 等效

不同:

  1. cbo 的三条指令针对的是所有 cache (l1 l2)等,
    mcache 的这三条指令粒度更细, 需要分别指定 l1 和 l2 进行操作
    如:
    Hit Writeback 有 Hit_Writeback_D 和 Hit_Writeback_S 两个操作 type, 分别用来 writeback l1 cache 和 l2 cache

  2. CBO 的三条指令是可以在 S-mode 及 M-mode 下执行的
    而 mcache 指令只能在 M-mode 下执行, S-mode 需要 cache 相关操作只能通过陷入到 M-mode 的 opensbi 来完成.

  3. mcache 另外提供了 index 操作, 主要方便用来回写并清空所有 l1 l2 cache line(不需要知道具体地址, 只需要按 index 覆盖 cacheline 内存范围即可)
    另外还提供了 Index invalidate icache Hit invalidate icache 和 fill icache 以及 fetch & lock l2 cache 的行为.