Как ядро ​​определяет размер строки кэша во время выполнения?

Как ядро ​​определяет размер строки кэша во время выполнения?

Я заметил, /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 (или функцию CPUID для x86/x32/x64) или таблицу значений, скомпилированную в автономном режиме. Мне интересно получить точное значение в программном обеспечении, чтобы помешать некоторым атакам по времени.

Я также знаю, что ядро ​​имеет статическое значение, используемое во время компиляции. Например,ядро использует длину строки кэша 64 для ARMво время сборки, но также переключается на динамическое значение во время выполнения.

Как именно ядро ​​определяет размер строки кэша?

Предоставляет ли ядро ​​API для его извлечения?

Всегда ли это точно?

решение1

Инструкция CPUID с EAX=2 возвращает информацию кэша и TLB в регистрах EAX, EBX, ECX и EDX.

См. например,http://x86.renejeschke.de/html/file_module_x86_id_45.htmlс INPUT EAX=2, который документирует возвращаемые значения.

Обратите внимание, что можно переопределить инструкцию CPUID, например, внутри виртуальной машины, хотя вас это может не волновать.

Связанный контент