CPUID, возвращающий GenuntellineI для процессора Intel

Я пытаюсь получить функцию, которая выводит имя/поставщика ЦП, но когда я пытаюсь это сделать, я получаю «GenuntellineI».

Вот функция:

void PrintProcessingDeviceType()
{
    uint32_t regs[4];

    #ifdef _WIN32
    __cpuid((int*)regs, 0);
    #else
    asm volatile ("cpuid" : "=a" (regs[0]), "=b" (regs[1]), "=c" (regs[2]), "=d" (regs[3]) : "a" (0), "c" (0));
    #endif

    std::cout << std::string((const char*)&regs, 16) << std::endl;
}

Оба пути (с определенным _WIN32 и без него) приводят к возникновению этой ошибки. Это проблема с неверным CPUID, я что-то не так сделал или что?


person Therhang    schedule 21.07.2015    source источник
comment
Попробуйте запустить пример msdn и посмотрите, сохраняется ли ошибка: msdn.microsoft.com/en-us/library/   -  person Beta Carotin    schedule 21.07.2015
comment
@BetaCarotin Когда я пытаюсь скомпилировать пример MSDN, я получаю сообщение об ошибке __cpuidex не было объявлено в этой области. Так что это исключено.   -  person Therhang    schedule 21.07.2015


Ответы (3)


Почему вы ожидаете чего-то другого?
Обратитесь к руководствам Intel, если вам кажется, что инструкция ведет себя не так, как вы ожидали.

CPUID с результатами EAX=0

person Community    schedule 22.07.2015

Похоже, это особенность функции CPUID, см. http://www.microbe.cz/docs/CPUID.pdf (раздел 2.1.1) для получения подробной информации. (Для расплывчатого определения quirk; оно не помечено как таковое, но его легко не заметить.)

Он возвращает первые 4 байта в регистре EBX, следующие 4 байта в EDX и последние байты в ECX. Обратите внимание на две вещи: во-первых, результат EAX (regs[0]) не содержит никаких символов имени модели, поэтому вы должны печатать его только начиная с regs[1]. Во-вторых, порядок последних двух регистров «обратный». Если вы поменяете местами соответствующие записи вашего массива, вы должны получить правильную строку (т.е. regs[2]и regs[3]).

person anderas    schedule 21.07.2015
comment
Интересно, что хотя замена regs[2] и regs[3] работала, делая единственным видимым текстом, выводящимся на консоль, GenuineIntel (кроме каких-то странных интервалов), удаление regs[0] или выполнение любой другой модификации приводит к тому, что строка резко меняется, иногда даже сжимается (или около того). он появляется из окна консоли). - person Therhang; 21.07.2015
comment
Странный. Но тогда я не смог попробовать это прямо сейчас и хотел поделиться тем, что мне удалось найти в PDF :-) Если вы узнаете, почему происходит странное поведение, пожалуйста, опубликуйте это! - person anderas; 21.07.2015

Вы можете думать об инструкции CPUID как о функции, которая принимает в качестве аргумента значение, переданное через регистр EAX, т.е. то, что возвращает CPUID, зависит исключительно от того, что находится в вашем EAX до выполнения CPUID.

В вашем случае перед выполнением CPUID ваш EAX был равен 0. Таким образом, CPUID возвращает базовую информацию о процессоре, которая была GenuinIntel на вашем компьютере. Процессоры AMD вернут AuthenticAMD в том же сценарии.

Поскольку каждый процессор немного отличается, поведение CPUID зависит от вашего процессора, поэтому после получения базовой информации о процессоре вы должны использовать специальные функции CPUID, чтобы узнать больше о функциях процессора и т. д. Для этого вам нужен конкретный документ ЦП, описывающий CPUID.

anderas уже предоставил вам PDF-файл CPUID для Intel. Здесь вы можете получить за AMD:

http://support.amd.com/TechDocs/25481.pdf#search=cpuid

person Artur    schedule 21.07.2015