2009-04-26 24 views
5

Estoy trabajando en un sistema escueto en el que tengo que determinar en algún momento después del arranque cuántos núcleos y subprocesos están habilitados, para poder enviar ellos eventos SIPI. También quiero que cada hilo sepa qué hilo es.Instrucciones de ensamblaje para encontrar cuántos hilos están habilitados en un sistema multi-core

Por ejemplo, en una configuración de un solo núcleo con HT activado, tenemos (por ejemplo, Intel Atom):

thread 0 --> core 0 thread 0 
thread 1 --> core 0 thread 1 

Mientras que en una configuración de doble núcleo sin HT tenemos (por ejemplo, Core 2 Duo):

thread 0 --> core 0 thread 0 
thread 1 --> core 1 thread 0 

¿Cuál es la mejor manera de determinarlo?

Edit: He encontrado cómo cada hilo puede encontrar qué hilo es. Todavía no he encontrado cómo determinar cuántos núcleos hay.

Respuesta

7

Investigué un poco y presenté estos hechos. cpuid con eax = 01h devuelve el ID de APIC en EBX[31:24] y habilitar HT en EDX[28].

Este código debe hacer el trabajo:

; this code will put the thread id into ecx 
    ; and the core id into ebx 

    mov eax, 01h 
    cpuid 
    ; get APIC ID from EBX[31:24] 
    shr ebx, 24 
    and ebx, 0ffh; not really necessary but makes the code nice 

    ; get HT enable bit from EDX[28] 
    test edx, 010000000h 
    jz ht_off 

    ; HT is on 
    ; bit 0 of EBX is the thread 
    ; bits 7:1 are the core 
    mov ecx, ebx 
    and ecx, 01h 
    shr ebx, 1 

    jmp done 

ht_off: 
    ; the thread is always 0 
    xor ecx, ecx 

done: 
Cuestiones relacionadas