2

Я заметил, что /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 ответ1

2

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .