¿Cómo el kernel asigna identificadores de CPU a núcleos físicos?

Uno puede encontrar mucha información sobre cómo inspeccionar el layout de los núcleos físicos en un sistema Linux en ejecución, pero me pregunto cómo se asignan los núcleos físicos a una id. De CPU en primer lugar.

Después de experimentar en un par de máquinas, me parece que la asignación es determinista (es decir, el arranque desde el mismo hardware dará como resultado la misma asignación de ID de CPU al núcleo de procesamiento físico). Además, me parece que la asignación funciona de alguna manera "round-robin", de modo que dos núcleos con numbers cercanos están físicamente lejos el uno del otro. Por ejemplo, en un server en el que estoy trabajando (2 sockets x 8 cpus x 2 hyperthreading, x86_64): cpu0 está en socket 0 , cpu1 está en socket 1, luego cpu2 está nuevamente en socket 0 pero está en un núcleo físico diferente de cpu0 ; … continúa así hasta cpu15 , luego cpu16 es hyperthreaded en el mismo núcleo físico que cpu0 .

Diseño de cpus en 2 sockets x86_64

Si esto es deliberado como parece, ¿sabe usted de dónde puedo encontrar documentado este comportamiento? ¿Cuál es la razón detrás de esto?

Especialmente apreciaría cualquier reference a documentation o publicación de lkml, pero incluso un puntero al lugar correcto en las fonts podría ser útil.

Está apenas documentado y depende en gran medida de una plataforma. Para x86, el siguiente id disponible se asigna a la CPU en la function generic_processor_info()

Entonces, para x86, los ID de la CPU dependen del order en el que llamaríamos a esa function. Se invoca cuando se inicializa APIC (controller de interrupción), mientras que la configuration APIC se toma de la tabla ACPI MADT y el BIOS proporciona las tablas ACPI.

Puede intentar decodificarlos usted mismo usando herramientas ACPI (package acpica-tools en CentOS):

 # acpidump > acpi.dat # acpixtract -a acpi.dat # iasl -d apic.dat ... # cat apic.dsl | awk -F: '/Subtable Type/ { st = $2 } /Processor ID/ { id = $2 } /Processor Enabled/ { print id, $2, st } '