Notei /proc/cpuinfo
que oferece um tamanho de linha de cache:
# 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
Suponho que o kernel usa uma instrução de CPU (ou um recurso CPUID para x86/x32/x64) ou uma tabela de valores compilada offline. Estou interessado em obter um valor preciso em software para impedir alguns ataques de temporização.
Também sei que o kernel possui um valor estático usado em tempo de compilação. Por exemplo, okernel usa um comprimento de linha de cache de 64 para ARMdurante a construção, mas também muda para um valor dinâmico em tempo de execução.
Como exatamente o kernel determina o tamanho da linha de cache?
O kernel expõe uma API para recuperá-lo?
É sempre preciso?
Responder1
A instrução CPUID com EAX=2 retorna informações de cache e TLB nos registradores EAX, EBX, ECX e EDX.
Veja, por exemplo,http://x86.renejeschke.de/html/file_module_x86_id_45.htmlcom INPUT EAX=2 que documenta os valores de retorno.
Observe que é possível substituir a instrução CPUID, como dentro de uma VM, embora você possa não se importar com esse caso.