カーネルは実行時にキャッシュ ライン サイズをどのように決定しますか?

カーネルは実行時にキャッシュ ライン サイズをどのように決定しますか?

/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 を使用すると、戻り値が文書化されます。

VM 内部などで CPUID 命令をオーバーライドすることは可能ですが、その場合は気にしないほうがよいことに注意してください。

関連情報