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 просто не правильно, я сделал что-то не так или как?

0

Решение

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

CPUID с EAX = 0 результатов

4

Другие решения

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

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

3

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

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

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

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

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

1