Maison  >  Article  >  développement back-end  >  Comment accéder aux informations sur le processeur sous Linux à l'aide de l'instruction « cpuid » ?

Comment accéder aux informations sur le processeur sous Linux à l'aide de l'instruction « cpuid » ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-31 11:56:02980parcourir

How to Access CPU Information in Linux Using the `cpuid` Instruction?

Accès aux informations sur le processeur sous Linux à l'aide de l'instruction cpuid

Dans cette question, un développeur cherche à accéder aux informations sur le processeur dans un environnement Linux à l'aide d'un méthode semblable à la fonction _cpuinfo() de l’API Windows. Le code fourni tente d'utiliser les instructions d'assemblage (cpuid) pour récupérer ces informations, mais le développeur souhaite éviter d'avoir besoin d'un assemblage manuel.

La solution réside dans l'utilisation du fichier d'en-tête cpuid.h disponible lors de la compilation du code avec CCG. Cet en-tête déclare deux fonctions :

<code class="c">unsigned int __get_cpuid_max(unsigned int __ext, unsigned int *__sig);
int __get_cpuid(unsigned int __level, unsigned int *__eax, unsigned int *__ebx, unsigned int *__ecx, unsigned int *__edx);</code>

La fonction __get_cpuid_max renvoie la valeur d'entrée prise en charge la plus élevée pour l'instruction cpuid. Vous pouvez spécifier __ext comme 0x0 pour les informations de base ou 0x8000000 pour les informations étendues.

La fonction __get_cpuid récupère les informations CPU pour un niveau spécifié et renvoie les données dans les registres eax, ebx, ecx et edx. Il renvoie une valeur non nulle en cas de succès et zéro si le niveau demandé n'est pas pris en charge.

Exemple d'utilisation :

<code class="c">#include <stdio.h>
#include <cpuid.h>

int main() {
  unsigned int eax, ebx, ecx, edx;

  // Get maximum supported CPUID level
  unsigned int max_level = __get_cpuid_max(0x0, NULL);

  // Iterate over different CPUID levels
  for (unsigned int level = 0; level <= max_level; level++) {
    // Retrieve CPUID data for the current level
    __get_cpuid(level, &eax, &ebx, &ecx, &edx);

    printf("Level %u: EAX=%u, EBX=%u, ECX=%u, EDX=%u\n", level, eax, ebx, ecx, edx);
  }

  return 0;
}</code>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn