Форум по Delphi программированию



Вернуться   Форум по Delphi программированию > Прочие языки программирования > Assembler
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #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 - то ли кол-во физ. ядер, то ли лог. ядер. Непонятно. С АМДой-то как то попроще будет. Прав ли я?
Ответить с цитированием
  #2  
Старый 03.09.2012, 18:45
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Все просто. Получить 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 таблицы.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 03.09.2012 в 19:10.
Ответить с цитированием
Ответ



Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 09:40.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2021

ВКонтакте   Facebook   Twitter   Ссылка на Telegram