Я заметил, /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, например, внутри виртуальной машины, хотя вас это может не волновать.