2009-04-26 7 views
5

Ich arbeite an einem nackten Knochen-System, in dem ich irgendwann nach dem Start feststellen muss, wie viele Kerne und Threads aktiviert sind, so dass ich senden kann sie SIPI-Ereignisse. Ich möchte auch, dass jeder Thread weiß, welcher Thread es ist.Assembly Anweisungen zu finden, wie viele Threads in einem Multi-Core-System aktiviert sind

Zum Beispiel in einer Single-Core-Konfiguration mit HT aktiviert ist, wir haben (zum Beispiel Intel Atom):

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

Während in einer Dual-Core-Konfiguration ohne HT wir (zum Beispiel haben, Core 2 Duo):

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

Was ist der beste Weg, um dies zu bestimmen?

Edit: Ich fand, wie jeder Thread finden kann, welcher Thread es ist. Ich habe immer noch nicht herausgefunden, wie man bestimmt, wie viele Kerne es gibt.

Antwort

7

Ich erforschte es ein wenig und kam mit diesen Fakten. cpuid mit eax = 01h gibt die APIC-ID in EBX[31:24] zurück und aktiviert HT in EDX[28].

Dieser Code die Arbeit tun sollte:

; 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: