核心如何在運行時確定快取行大小?

核心如何在運行時確定快取行大小?

我注意到/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.htmlINPUT EAX=2 記錄了傳回值。

請注意,可以覆寫 CPUID 指令(例如在虛擬機器內部),儘管您可能不關心這種情況。

相關內容