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

2

Percebi que /proc/cpuinfo 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

Eu estou supondo que o kernel usa uma instrução de CPU (ou um recurso CPUID para x86 / x32 / x64) ou uma tabela de valores compilados offline. Estou interessado em obter um valor preciso no software para impedir alguns ataques de tempo.

Eu também sei que o kernel tem um valor estático usado em tempo de compilação. Por exemplo, o kernel usa um comprimento de linha de cache de 64 para o ARM durante a compilaçã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?

    
por jww 13.10.2015 / 16:15

1 resposta

2

A instrução CPUID com EAX = 2 retorna o cache e as informações de TLB nos registradores EAX, EBX, ECX e EDX.

Veja, por exemplo, link com INPUT EAX = 2, que documenta os valores de retorno.

Note que é possível sobrescrever a instrução CPUID, como dentro de uma VM, embora você possa não se importar com isso.

    
por 13.10.2015 / 16:23