2016-11-18 4 views
0

Im travaillant sur un module noyau Linux dans lequel j'ai besoin de lire le CPUID d'un processeur pour voir si une fonctionnalité est présente. La documentation du chipset indique:CPUID et MSR lit Linux-x86

"Les accès à ce MSR sont pris en charge lorsque CPUID (EAX = 14H, ECX = 0): ECX [bit 0] ou CPUID (EAX = 14H, ECX = 0): ECX [bit2 ] »

Cependant, je suis en utilisant le code suivant pour lire CPUID:

int func() 
{ 
    int a, b; 

    for (a = 0; a < 5; a++) 
    { 
    __asm__("cpuid" 
      :"=a"(b)     // EAX into b (output) 
      :"0"(a)     // a into EAX (input) 
      :"%ebx","%ecx","%edx"); // clobbered registers 

    printk("The code %i gives %llx\n", a, b); 
    } 

    return 0; 
} 

Adapté de: https://en.wikipedia.org/wiki/CPUID#EAX.3D1:_Processor_Info_and_Feature_Bits

mais je ne sais pas comment cela fonctionne ou quels sont les valeurs que je lis. Quelqu'un peut-il m'expliquer comment fonctionne ce code et comment je peux lire les registres CPUID ci-dessus ainsi que EAX = 80000008h.

Merci

+0

utiliser une fonction wrapper CPUID si vous ne comprenez pas en ligne asm-vous. Il y en a plusieurs à choisir. –

+0

@ Peter Cordes. Merci pour cela ... – vitamike

+1

Copie possible de [Processeur Intel: "Si CPUID.06H: EAX. \ [7 \] = 1" Signification?] (Https://stackoverflow.com/questions/45883852/intel-processor- if-cpuid-06heax-7-1-meaning), qui est aussi une question de noyau Linux, et la réponse montre les fonctions de l'encapsuleur CPUID de Linux –

Répondre

0

À moins que vous avez déjà trouvé, un tel utilitaire populaire est appelé simplement « cpuid » et est disponible en paquet rpm dans Fedora et Ubuntu comme un paquet et aussi dans d'autres distros. Cet utilitaire utilise l'instruction "cpuid".

Voir: http://www.etallen.com/cpuid.html