Привет всем!
Ситуация такова: код у меня расположен на нулевом кольце, это код обработки прерывания. Процессор, предположим попался двухядрёный. Как программно узнать, какой именно из пары камней выполняет данный код?
Трамблёрить пытался, но к сожалению, почти безрезультатно, нашёл только про Local APIC ID:
Код:
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
Потом догуглил, что правильнее будет считывать базу APIC из MSR 0x0000001Bh, а только затем выдёргивать один байт по адресу BASE_APIC + 23H, ибо cpuid сбрасывает конвейера процессора в аут. В результате нарисовался код:
Код:
movl $1, %eax
cpuid
movl %ebx, cpuid_ebx
Число ядер лежит в битах 16..23 включительно переменной cpuid_ebx, т.е. регистра ebx. В Си это число вроде выделяется так:
Код:
int procnum = (cpuid_ebx >> 16) & 0xFF;
Но наверное, ещё надо учитывать поддержку HTT. Я до сих пор так и не смог понять что енто поле означает для интеловских процев с HTT - то ли кол-во физ. ядер, то ли лог. ядер. Непонятно. С АМДой-то как то попроще будет. Прав ли я?