内核如何在运行时确定缓存行大小?

内核如何在运行时确定缓存行大小?

我注意到/proc/cpuinfo提供了一个缓存行大小:

# cat /proc/cpuinfo | egrep "(cache|clflush)"
cache size  : 6144 KB
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat
pse36 clflush dts mmx fxsr sse sse2 ss syscall nx rdtscp lm constant_tsc arch_perfmon
pebs bts nopl xtopology tsc_reliable nonstop_tsc aperfmperf eagerfpu pni pclmulqdq
ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt aes xsave avx hypervisor lahf_lm ida arat
epb pln pts dtherm xsaveopt
clflush size    : 64
cache_alignment : 64

我猜内核使用 CPU 指令(或 x86/x32/x64 的 CPUID 功能)或离线编译的值表。我感兴趣的是在软件中获取准确的值以阻止某些计时攻击。

我还知道内核有一个在编译时使用的静态值。例如,内核对 ARM 使用 64 长度的缓存行在构建期间,但它也会在运行时切换到动态值。

内核究竟如何确定缓存行大小?

内核是否公开了 API 来检索它?

它总是准确的吗?

答案1

EAX=2 的 CPUID 指令返回 EAX、EBX、ECX 和 EDX 寄存器中的缓存和 TLB 信息。

例如,http://x86.renejeschke.de/html/file_module_x86_id_45.html使用 INPUT EAX=2 来记录返回值。

请注意,可以覆盖 CPUID 指令(例如在 VM 内部),尽管您可能不关心这种情况。

相关内容