Como o kernel determina o tamanho da linha de cache em tempo de execução?

Como o kernel determina o tamanho da linha de cache em tempo de execução?

Notei /proc/cpuinfoque 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.

informação relacionada