題 內核如何在運行時確定緩存行大小?


我注意到 /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來檢索它?

它總是準確的嗎?


2
2017-10-13 14:15


起源


你應該贊成你認為有用的答案,或者只是重要的答案。此外,既然你是原始問題的海報,你應該接受它,如果它真的完全解決你的查詢。 - MariusMatutiae
@Marius - 我知道Stack Exchange網絡是如何工作的,所以我不確定你的觀點是什麼......三個問題中有兩個沒有答案。 - jww


答案:


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

例如,見 http://x86.renejeschke.de/html/file_module_x86_id_45.html INPUT EAX = 2,記錄返回值。

請注意,可以覆蓋CPU內部的CPUID指令,儘管您可能不關心這種情況。


2
2017-10-13 14:23



謝謝。我最感興趣的處理器是ARM​​,因為(1)我們有x86 / x32 / x64代碼,(2)ARM是移動設備中流行的CPU。我們也支持MIPS和較少的知識,如S / 390。因此我想知道內核是否提供了一個API來檢索它;如果是的話 真 準確(或只是估計)。 - jww