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!