我正在开发一个简单的系统,我需要在启动后确定启用了多少内核和线程,以便我可以向它们发送SIPI事件。我还希望每个线程都知道它是哪个线程。
例如,在启用HT的单核配置中,我们有(例如,Intel Atom):
thread 0 --> core 0 thread 0
thread 1 --> core 0 thread 1
虽然我们没有HT的双核配置(例如,Core 2 Duo):
thread 0 --> core 0 thread 0
thread 1 --> core 1 thread 0
确定这个的最佳方法是什么?
编辑:我发现每个线程如何找到它所在的线程。我还没有找到如何确定有多少核心。
答案 0 :(得分:7)
我研究了一下,并提出了这些事实。 cpuid
eax = 01h
返回EBX[31:24]
中的APIC ID,EDX[28]
中的HT启用。
此代码应该完成工作:
; 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: