¿Cómo determina el kernel el tamaño de la línea de caché en tiempo de ejecución?

¿Cómo determina el kernel el tamaño de la línea de caché en tiempo de ejecución?

Noté que /proc/cpuinfoofrece un tamaño de línea de caché:

# 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

Supongo que el kernel usa una instrucción de CPU (o una función CPUID para x86/x32/x64) o una tabla de valores compilada sin conexión. Estoy interesado en obtener un valor preciso en el software para frustrar algunos ataques de sincronización.

También sé que el kernel tiene un valor estático utilizado en el momento de la compilación. Por ejemplo, elEl kernel utiliza una longitud de línea de caché de 64 para ARM.durante la compilación, pero también cambia a un valor dinámico en tiempo de ejecución.

¿Cómo determina exactamente el núcleo el tamaño de la línea de caché?

¿El kernel expone una API para recuperarlo?

¿Es siempre exacto?

Respuesta1

La instrucción CPUID con EAX=2 devuelve información de caché y TLB en los registros EAX, EBX, ECX y EDX.

Ver por ejemplo,http://x86.renejeschke.de/html/file_module_x86_id_45.htmlcon INPUT EAX=2 que documenta los valores de retorno.

Tenga en cuenta que es posible anular la instrucción CPUID, por ejemplo, dentro de una máquina virtual, aunque es posible que ese caso no le importe.

información relacionada