我注意到/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 指令(例如在虛擬機器內部),儘管您可能不關心這種情況。