Wie bestimmt der Kernel die Cache-Zeilengröße zur Laufzeit?

Wie bestimmt der Kernel die Cache-Zeilengröße zur Laufzeit?

Mir ist aufgefallen, /proc/cpuinfodass es eine Cache-Zeilengröße gibt:

# 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

Ich vermute, der Kernel verwendet einen CPU-Befehl (oder eine CPUID-Funktion für x86/x32/x64) oder eine offline kompilierte Wertetabelle. Ich bin daran interessiert, einen genauen Wert in der Software zu erhalten, um einige Timing-Angriffe zu vereiteln.

Ich weiß auch, dass der Kernel einen statischen Wert hat, der zur Kompilierzeit verwendet wird. Zum Beispiel derKernel verwendet eine Cache-Zeilenlänge von 64 für ARMwährend des Builds, wechselt aber auch zur Laufzeit zu einem dynamischen Wert.

Wie genau bestimmt der Kernel die Cache-Zeilengröße?

Stellt der Kernel eine API zum Abrufen bereit?

Ist es immer genau?

Antwort1

Der CPUID-Befehl mit EAX=2 gibt Cache- und TLB-Informationen in den Registern EAX, EBX, ECX und EDX zurück.

Siehe zum Beispielhttp://x86.renejeschke.de/html/file_module_x86_id_45.htmlmit INPUT EAX=2, welches die Rückgabewerte dokumentiert.

Beachten Sie, dass es möglich ist, die CPUID-Anweisung beispielsweise innerhalb einer VM zu überschreiben, auch wenn dieser Fall für Sie möglicherweise nicht von Belang ist.

verwandte Informationen