¿De qué manera el BIOS y otras rutinas de bajo nivel enumeran / identifican / cuentan los cpus?

4

¿Por qué mecanismo es un BIOS o un kernel capaz de "ver" (enumerar, identificar, cualquiera que sea el término correcto) otras CPU en un sistema SMP? ¿Cómo puede la CPU de arranque inicializar y luego "iniciar" la segunda o tercera, cuarta CPU?

Esto no es una pregunta sobre cómo un programa de usuario tiene su subproceso programado en otra cpu, afinidad de subprocesos, etc., pero realmente hasta el mecanismo de nivel más bajo por el cual funciona.

Cómo entiendo vagamente que esto podría funcionar es que una MMU mantiene la segunda CPU en espera temporalmente hasta que la primera se haya inicializado todo por sí misma, luego la segunda CPU, luego recibe una señal de la CPU principal para iniciar la otra. . Aún así, no es seguro que lo primero sea que la otra CPU se ejecute en un sistema de inteligencia; es decir, ¿también se iniciaría primero en el modo 8086, requiriendo que ejecute la rutina que habilita A20 y salta a PM?

He codificado en ASM en una vida anterior, por lo que puedo entender respuestas teóricas bien explicadas, pero tengo muy poca experiencia en codificación en la vida real, por lo que me redireccioné a la fuente del kernel de Linux (que de todos modos ya voy a intentar) no será una respuesta a mi Q :-)

    
pregunta

2 respuestas

4

La solución simple es que los procesadores físicos se identifican mediante una conexión por cable. Cuando pones tu CPU en la placa base, hay muchos pines en ella. Un par de ellos pueden simplemente conectarse en corto dentro de la CPU y usarse para decir "Estoy conectado".

Se pueden obtener núcleos de CPU adicionales dentro de un solo procesador físico ejecutando una instrucción especial de código de máquina. La CPU siempre sabe quién es y está lista para decirnos cuándo usamos la instrucción de código de máquina "mágica".

La solución concreta depende del sistema informático en particular, BIOS, familia de CPU, etc. El BIOS debe saber exactamente qué diferentes CPU posibles pueden esperar en la placa base. (No es posible colocar una CPU de 2 núcleos en una placa base antigua que no fue diseñada para las CPU de 2 núcleos).

Puede encontrar información muy detallada sobre las CPU x86 / x64 en www.intel.com .

    
respondido por el Al Kepp
2

En un sistema Intel, la ejecución siempre comienza en cpu-0 en una dirección predefinida. Las otras CPU están en estado de parada, no hacen nada más que esperar una interrupción especial. En un solo socket, la CPU multinúcleo este comportamiento está cableado: si enciendes una CPU de este tipo, solo la CPU-0 comenzará la ejecución.

El cpu-0 que ejecuta el BIOS enumera luego el hardware básico (especialmente información sobre otros cpus) y lo almacena en las tablas ACPI.

Otros núcleos se inician a través de la función ACPI. La función emite un IPI (Interprocessor Interrupt) a un procesador lógico detenido, luego comienza a ejecutar el código (el nuevo subproceso) en una dirección especificada como parte del IPI.

Si realmente desea ver los detalles sangrientos, hay un ejemplo en enlace .

Encontrará más información y documentación en el Manual del desarrollador de software para arquitecturas Intel® 64 e IA-32, volumen 3 (Guía de programación del sistema), capítulo 8.6. Como Intel sigue cambiando aleatoriamente el enlace, es mejor que lo encuentres en google.

    
respondido por el Gunther Piez

Lea otras preguntas en las etiquetas