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