Показать сообщение отдельно
  #1  
Старый 11.08.2012, 03:11
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию Определение № ядра процессора

Привет всем!
Ситуация такова: код у меня расположен на нулевом кольце, это код обработки прерывания. Процессор, предположим попался двухядрёный. Как программно узнать, какой именно из пары камней выполняет данный код?

Трамблёрить пытался, но к сожалению, почти безрезультатно, нашёл только про 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 - то ли кол-во физ. ядер, то ли лог. ядер. Непонятно. С АМДой-то как то попроще будет. Прав ли я?
Ответить с цитированием