【发布时间】:2021-11-24 03:46:29
【问题描述】:
x86/x86_64 架构的每个现代高性能 CPU 都有一些数据缓存层次结构:L1、L2,有时还有 L3(在极少数情况下还有 L4),从主 RAM 加载/向主 RAM 加载的数据在某些缓存中缓存其中。
有时程序员可能希望某些数据不缓存在某些或所有缓存级别中(例如,当想要 memset 16 GB 的 RAM 并将某些数据仍在缓存中时):有一些非临时(NT ) 类似 MOVNTDQA (https://stackoverflow.com/a/37092http://lwn.net/Articles/255364/) 的说明
但是是否有一种编程方式(对于某些 AMD 或 Intel CPU 系列,如 P3、P4、Core、Core i* 等)来完全(但暂时)关闭部分或所有级别的缓存,以更改每个内存访问指令(全局或对于 RAM 的某些应用程序/区域)如何使用内存层次结构?例如:关闭L1,关闭L1和L2?或者将每个内存访问类型更改为“未缓存”UC(CR0 的 CD+NW 位??? SDM vol3a 页423424、425 和“三级缓存禁用标志,第 6 位IA32_MISC_ENABLE MSR(仅在基于 Intel NetBurst 微架构的处理器中可用)- 允许禁用和启用 L3 缓存,独立于 L1 和 L2 缓存。”)。
我认为此类操作将有助于保护数据免受缓存侧通道攻击/泄漏,例如窃取 AES 密钥、隐蔽缓存通道、Meltdown/Spectre。虽然这种禁用会产生巨大的性能成本。
PS:我记得很多年前在一些技术新闻网站上发布过这样的程序,但现在找不到了。它只是一个 Windows exe,将一些神奇的值写入 MSR,并使每个 Windows 程序在它之后运行非常慢。缓存一直关闭,直到重新启动或使用“撤消”选项启动程序。
【问题讨论】:
-
您好!检查英特尔 SDM 卷的“禁用和启用 L3 缓存”(及周边)和“MTRR”部分。 3a software.intel.com/en-us/articles/intel-sdm - xem.github.io/minix86/manual/intel-x86-and-64-manual-vol3/… xem.github.io/minix86/manual/intel-x86-and-64-manual-vol3/… "第三级缓存禁用标志(IA32_MISC_ENABLE MSR 的第 6 位)允许禁用和启用 L3 缓存,独立于 L1 和 L2 缓存”和 IA32_MISC_ENABLE,第 424 页“表 11-5。缓存操作模式”CR0 reg 的 CD 标志
-
enable/disable cache on intel 64bit machine: CD bit always set? 和 system becomes extremely slow after disable cache 的可能重复项。另外:禁用缓存用于攻击 SGX 飞地:Georgia/MS 2016 1611.06952v1 "Inferring Fine-grained Control Flow Inside SGX Enclaves with Branch Shadowing""Disabling cache. If we want to attack .. short loop"
-
还有:linuxquestions.org/questions/linux-kernel-70/… 和 memtest 的
cache_on/cache_off函数:github.com/vathpela/memtest86-/blob/master/test.h#L206; software.intel.com/en-us/forums/… "缓存可能未使用,但未禁用。" 和 software.intel.com/en-us/forums/… "CR0.CD 的范围为 "core"。"。也用于部分禁用:PCD "page-level cache disable (bit 4 of cr3)"
标签: x86 intel cpu-cache memory-access msr