![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Привет всем!
Ситуация такова: код у меня расположен на нулевом кольце, это код обработки прерывания. Процессор, предположим попался двухядрёный. Как программно узнать, какой именно из пары камней выполняет данный код? Трамблёрить пытался, но к сожалению, почти безрезультатно, нашёл только про 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 Код:
int procnum = (cpuid_ebx >> 16) & 0xFF; |