Все просто. Получить 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
(синтаксис - FASM)
Где LAPICAddr - виртуальный адрес страницы, которая отображена на пространство MMIO локал апика. Физический адрес я получаю при инициализации системы из ACPI таблицы.