gem5 中的缓存方式是显式的还是 implied/derived 来自缓存集的数量和缓存大小?

Are cache ways in gem5 explicit or are they implied/derived from the number of cache sets and cache size?

我正在尝试实现 HYBCACHE 中描述的 HybCache 的 gem5 版本:用于可信执行环境的混合侧通道弹性缓存(可以在 https://www.usenix.org/system/files/sec20spring_dessouky_prepub.pdf).

HybCache 的一个简短总结是所有缓存的一个子集被保留供安全进程使用并被隔离。这是通过在进程处于 'isolated' 模式时使用有限的缓存方式子集来实现的。非隔离进程正常使用缓存操作,可以访问整个缓存并使用配置中给定的替换策略和关联性。缓存路的隔离子集使用随机替换策略并且是完全关联的。这是展示这个想法的图片。

6路和7路是灰色的,代表独立的缓存路。

因此,我需要以这些方式操纵数据的放置。我的问题是,因为我没有发现gem5 代码中提到缓存方式,这是否意味着缓存方式仅在逻辑上存在?也就是说,我是否必须手动计算每个缓存方式的位置?如果在 gem5 中使用了缓存方式,那么它们被使用了吗?文件名是什么?

如有任何帮助,我们将不胜感激。

此答案仅适用于 Classic cache model (src/mem/cache/).

在 gem5 中,缓存方式的数量是根据缓存大小和关联性自动确定的。检查src/mem/cache/tags/indexing_policies/中的文件是否有相关代码(具体来说,base.cc[=的构造函数54=]).

您可以通过两种方式解决此实施问题:

1 - 创建一个继承自 BaseTags 的新 class(例如,HybCacheTags)。 class 将决定它是否应该在安全模式下工作,以及如何工作(即何时调用哪个索引和替换策略)。根据本文中提出的任何其他建议,您可能还需要从 Cache 派生以创建 HybCache.

  • 新标签每个操作模式需要一个 indexing policy。一种是常规的(SetAssociative),另一种是派生自SetAssociative,其中参数assoc使 numSets 变为 1(使其完全关联)。派生的还必须覆盖至少一个函数 getPossibleEntries(),以仅允许选择您想要的方式。您可以查看 skewed_assoc.cc 以获取更复杂的位置选择示例。

  • 新标签每个操作模式需要一个 replacement policy。您可能只使用 replacement_policies 文件夹中的那些。

2 - 您可以基于 Cache class 创建一个 HybCache,它有两个标签,一个是常规标签(即, BaseSetAssoc), 另一个基于 FALRU class (重写为 FARandom).

我认为第一个选项更容易,而且硬编码更少。 FALRU 尚未拆分为索引策略和替换策略,因此如果您需要更改其中之一,则必须重新实现它。

在实施过程中您可能会遇到连贯性错误。如果发生这种情况,很可能是索引逻辑中的问题,我不会考虑尝试在一致性模型中查找问题。