2013-01-10 14 views
5

Podczas pisania nowego kodu dla Windows natknąłem się na _cpuinfo() z Windows API. Ponieważ mam do czynienia głównie ze środowiskiem Linux (GCC), chcę mieć dostęp do CPUInfo.Jak wywołać "cpuid" w systemie Linux?

Próbowałem następujące:

#include <iostream> 

int main() 
{ 
    int a, b; 

    for (a = 0; a < 5; a++) 
    { 
    __asm ("mov %1, %%eax; "   // a into eax 
      "cpuid;" 
      "mov %%eax, %0;"    // eax into b 
      :"=r"(b)      // output 
      :"r"(a)      // input 
      :"%eax","%ebx","%ecx","%edx" // clobbered register 
     ); 
    std::cout << "The code " << a << " gives " << b << std::endl; 
    } 

    return 0; 
} 

Ten zespół stosowanie ale nie chcę, aby ponownie wymyślać koła. Czy istnieje inny sposób implementacji CPUInfo bez montażu?

błędy kompilatora:

[email protected]:~/Desktop/prog$ g++ -Wall CPUInfo.cpp 
CPUInfo.cpp: In function ‘int main()’: 
CPUInfo.cpp:10:22: error: expected ‘)’ before ‘;’ token 
CPUInfo.cpp:10:23: error: expected primary-expression before ‘)’ token 
CPUInfo.cpp:10:23: error: expected ‘;’ before ‘)’ token 
CPUInfo.cpp:8:8: warning: unused variable ‘b’ [-Wunused-variable] 
CPUInfo.cpp:12:8: error: expected ‘}’ at end of input 
+1

Tak, to jest g ++, jak sądzę. A x86? Powinieneś powiedzieć. Jakie jest pytanie w każdym razie? Powiedziałeś nam, co robisz, i pokazałeś kod. Ale nie ma wątpliwości. –

+0

@JerryCoffin Używam Linuksa (w tej sekcji Linux będzie określał procesor komputera wykonującego kod). Mam już wersję/sekcję systemu Windows przybite za pomocą funkcji _cpuinfo() z interfejsu API Win. To mój punkt. – TheBlueCat

+0

@DavidHeffernan Zobacz mój zaktualizowany post, zaniedbałem dodanie błędów kompilatora. – TheBlueCat

Odpowiedz

31

Ponieważ jesteś kompilacji z GCC następnie można dołączyć cpuid.h który deklaruje następujące funkcje:

/* Return highest supported input value for cpuid instruction. ext can 
    be either 0x0 or 0x8000000 to return highest supported value for 
    basic or extended cpuid information. Function returns 0 if cpuid 
    is not supported or whatever cpuid returns in eax register. If sig 
    pointer is non-null, then first four bytes of the signature 
    (as found in ebx register) are returned in location pointed by sig. */ 
unsigned int __get_cpuid_max (unsigned int __ext, unsigned int *__sig) 

/* Return cpuid data for requested cpuid level, as found in returned 
    eax, ebx, ecx and edx registers. The function checks if cpuid is 
    supported and returns 1 for valid cpuid information or 0 for 
    unsupported cpuid level. All pointers are required to be non-null. */ 
int __get_cpuid (unsigned int __level, 
    unsigned int *__eax, unsigned int *__ebx, 
    unsigned int *__ecx, unsigned int *__edx) 

nie trzeba do nich, a nie powinny, re- wdrożyć tę funkcjonalność.

+6

+1 Nie wiedziałem, że istnieje nagłówek. Zawsze robiłem to z odrobiną wbudowanego zestawu. – Mysticial

+0

Pewnie. I tak udało mi się skompletować utwór. Niezależnie od tego, dlaczego nie powinienem ponownie wprowadzić tego? Poza oszczędnością czasu? – TheBlueCat

+1

@Mysticial W tym momencie przydatna jest moja całkowita ignorancja GCC i Linux. Musiałem google na odpowiedź! –

7
for (a =0; a < 5; ++a;) 

Tam powinny być tylko dwa średniki. Masz trzy.

To jest podstawowa składnia C/C++; CPUID jest czerwonym śledziem.

+0

literówka. Naprawiłem to przed opublikowaniem, z jakiegoś powodu wróciłem tam. Zmieniłem gałęzie na Git, to jest prawdopodobnie powód. Ale tak, znam tę "podstawową składnię". – TheBlueCat

+7

Ale błędy, które wysłałeś, są spowodowane przez tę literówkę. Jeśli to naprawiłeś i nadal masz problemy, zaktualizuj listę błędów. – user9876

Powiązane problemy