假设我们故意破坏了 DTLB,并希望继续使用clflush
与 TLB 条目指向的地址不相交的内存区域从 L1-3 刷新特定的缓存行;这实际上会将我们正在刷新的高速缓存行的页面基地址带回 TLB 吗?
简而言之,是否clflush
触及 TLB?我假设由于这条指令尊重一致性,它随后会将该行写回内存(显然需要 TLB 查找。)
假设我们故意破坏了 DTLB,并希望继续使用clflush
与 TLB 条目指向的地址不相交的内存区域从 L1-3 刷新特定的缓存行;这实际上会将我们正在刷新的高速缓存行的页面基地址带回 TLB 吗?
简而言之,是否clflush
触及 TLB?我假设由于这条指令尊重一致性,它随后会将该行写回内存(显然需要 TLB 查找。)
来自英特尔® 64 和 IA-32 架构软件开发人员手册,第 2A 卷:指令集参考,AL:“使包含由所有级别的处理器缓存层次结构(数据和指令)的源操作数指定的线性地址的缓存行无效。”
由于它使用线性(虚拟)地址,因此需要转换地址,这意味着在 TLB 未命中时需要进行页表遍历。(即使对于将缓存条目推送到更高级别缓存的不同类型的指令,通常也会出现这种情况,因为 L1 缓存通常是针对 x86 进行物理标记的。通常,使用虚拟地址进行标记已不受欢迎。使用标签的物理地址意味着需要物理地址来检查缓存是否命中,因此即使它没有发送到内存,也需要进行转换。)
虽然可以避免为此类访问加载 TLB,但鉴于 CLFLUSH 不常用,这种特殊情况处理的额外复杂性几乎肯定不会被视为值得费心。