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) за подробности. (За свободно определение на странност; тя не е отбелязана като такава, но лесно се пренебрегва.)

Връща първите 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 зависи от вашия CPU, така че след като получите основна информация за CPU, трябва да използвате специфичните функции на CPUID, за да научите повече за функциите на CPU и т.н. За това ви е необходим конкретен документ за CPU, описващ CPUID.

anderas вече ви даде CPUID pdf за Intel. Тук можете да получите за AMD:

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

person Artur    schedule 21.07.2015