|
|
Регистрация | << Правила форума >> | 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; Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#2
|
||||
|
||||
Все просто. Получить ID проще всего действительно через ЦПУИД. Можно считать из АПИКа. Номер процессора обычно равен номеру его Local APIC (хотя в таблице ACPI 2 номера - один ACPI CPU ID , и второй для его LAPIC'а; но делать их разными не имеет смысла). А HTT - который HyperThreading? Если да, то по спецификации SMP от интела для системы нет разницы между разными процессорами, разными ядрами одного камня и разными тредами процессора. LAPIC'у каждого из них назначается свой ID, по которому он уже работает.
Проверял своей осью на компе. 4 ядра, гипертрединг. Нашлось 8 нормальных ядер и 8 заблокированных (в таблице ACPI помечены недоступными). [offtop]Что, кстати, подтверждает слухи о том, что у интела один конвеер на серверные 8-ми ядерные процы и на остальные. Просто ядра блокируются для десктопов.[/offtop] Я, например, в обработчике прерывания локального таймера использую такое определение: Код:
LOCAL_APIC_ID_REG = 20h mov rbx, [LAPICAddr] mov eax, [rbx+LOCAL_APIC_ID_REG] shr eax, 24 ; Get LAPICID Где LAPICAddr - виртуальный адрес страницы, которая отображена на пространство MMIO локал апика. Физический адрес я получаю при инициализации системы из ACPI таблицы. jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 03.09.2012 в 19:10. |