Que signifient les drapeaux dans / proc / cpuinfo?

212

Comment savoir si mon processeur possède une fonctionnalité particulière? (Jeu d’instructions 64 bits, virtualisation assistée par matériel, accélérateurs cryptographiques, etc.) Je sais que le fichier /proc/cpuinfocontient ces informations flags, mais que signifient toutes ces abréviations cryptiques?

Par exemple, étant donné l'extrait suivant de /proc/cpuinfo, ai-je un processeur 64 bits? Ai-je une virtualisation matérielle?

model name      : Intel(R) Core(TM)2 Duo CPU     E8400  @ 3.00GHz
…
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts rep_good aperfmperf pni dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm sse4_1 lahf_lm tpr_shadow vnmi flexpriority
Gilles
la source

Réponses:

275

x86

(32 bits alias i386 – i686 et 64 bits alias amd64. En d’autres termes, votre station de travail, votre ordinateur portable ou votre serveur.)

FAQ: Est-ce que j'ai…

  • 64 bits (x86_64 / AMD64 / Intel64)? lm
  • Virtualisation matérielle (VMX / AMD-V)? vmx(Intel), svm(AMD)
  • AES accéléré (AES-NI)? aes
  • TXT (TPM)? smx
  • un hyperviseur (annoncé comme tel)? hypervisor

La plupart des autres fonctionnalités n’intéressent que les auteurs du compilateur ou du noyau.

Tous les drapeaux

La liste complète se trouve dans la source du noyau, dans le fichier arch/x86/include/asm/cpufeatures.h.

Fonctions de processeur définies par Intel, niveau de CPUID 0x00000001 (edx)

Voir également Wikipedia et le tableau 2-27 de la référence de programmation Intel Advanced Vector Extensions

Fonctions de processeur définies par AMD, niveau de CPUID 0x80000001

Voir également Wikipedia et le tableau 2-23 du manuel Référence de programmation Intel Advanced Vector Extensions.

Fonctions de processeur définies par Transmeta, niveau de CPUID 0x80860001

  • recovery: CPU en mode de récupération
  • longrun: Contrôle de la puissance à long terme
  • lrti: Interface de table LongRun

Autres fonctionnalités, mappage défini par Linux

  • cxmmx: Extensions Cyrix MMX
  • k6_mtrr: MTRR non standard AMD K6
  • cyrix_arr: Cyrix ARR (= MTRR)
  • centaur_mcr: Centaur MCR (= MTRR)
  • constant_tsc: Le TSC est à taux constant
  • up: Noyau SMP fonctionnant sous UP
  • art: Minuterie toujours en marche
  • arch_perfmon: Intel Architectural PerfMon
  • pebs: Échantillonnage basé sur un événement précis
  • bts: Magasin de trace de succursale
  • rep_good: le microcode rep fonctionne bien
  • acc_power: Mécanisme de la puissance accumulée AMD
  • nopl: Les instructions NOPL (0F 1F)
  • xtopology: extensions d'énumération de topologie cpu
  • tsc_reliable: TSC est connu pour être fiable
  • nonstop_tsc: TSC ne s'arrête pas dans les états C
  • cpuid: La CPU a l'instruction CPUID elle-même
  • extd_apicid: a étendu APICID (8 bits)
  • amd_dcm: processeur multi-nœud
  • aperfmperf: APERFMPERF
  • eagerfpu: Restauration de FPU non paresseuse
  • nonstop_tsc_s3: TSC ne s'arrête pas dans l'état S3
  • tsc_known_freq: TSC a une fréquence connue
  • mce_recovery: La machine a des vérifications récupérables

Fonctions de processeur définies par Intel, niveau de CPUID 0x00000001 (ecx)

Voir également Wikipedia et le tableau 2-26 du manuel Référence de programmation Intel Advanced Vector Extensions.

Fonctions de processeur définies par VIA / Cyrix / Centaur, niveau de CPUID 0xC0000001

  • rng: Générateur de nombre aléatoire présent (xstore)
  • rng_en: Générateur de nombres aléatoires activé
  • ace: crypto sur la CPU (xcrypt)
  • ace_en: crypto sur CPU activé
  • ace2: Moteur de cryptographie avancé v2
  • ace2_en: ACE v2 activé
  • phe: Moteur de hachage PadLock
  • phe_en: PHE activé
  • pmm: Multiplicateur PadLock Montgomery
  • pmm_en: PMM activé

Drapeaux AMD plus étendus: niveau de CPUID 0x80000001, ecx

  • lahf_lm: Chargez AH depuis les drapeaux (LAHF) et stockez AH dans les drapeaux (SAHF) en mode long
  • cmp_legacy: Si oui, HyperThreading n'est pas valide
  • svm: «Machine virtuelle sécurisée»: AMD-V
  • extapic: Espace APIC étendu
  • cr8_legacy: CR8 en mode 32 bits
  • abm: Manipulation de bits avancée
  • sse4a: SSE-4A
  • misalignsse: indique si une exception de protection générale (#GP) est générée lorsque certaines instructions SSE héritées fonctionnent sur des données non alignées. Dépend également de CR0 et du bit de vérification de l'alignement
  • 3dnowprefetch: Instructions de pré-extraction 3DNow
  • osvw: indique une solution de contournement du système d’exploitation visible , qui permet au système d’exploiter les erreurs du processeur.
  • ibs: Échantillonnage basé sur les instructions
  • xop: instructions étendues AVX
  • skinit: Instructions SKINIT / STGI
  • wdt: Minuterie de surveillance
  • lwp: Profil léger
  • fma4: 4 opérandes instructions MAC
  • tce: extension du cache de traduction
  • nodeid_msr: NodeId MSR
  • tbm: Manipulation des bits de fuite
  • topoext: Extensions de topologie CPUID leafs
  • perfctr_core: Core Performance Counter Extensions
  • perfctr_nb: Extensions de compteur de performance NB
  • bpext: extension de point d'arrêt de données
  • ptsc: compteur d'horodatage
  • perfctr_l2: Extensions de compteur de performances L2
  • mwaitx: MWAITextension ( MONITORX/ MWAITX)

Drapeaux auxiliaires: définis par Linux - Pour les fonctionnalités dispersées dans différents niveaux de CPUID

  • ring3mwait: Bague 3 MONITOR / MWAIT
  • cpuid_fault: Défaut CPUID Intel
  • cpb: Boost Performance AMD Core
  • epb: Prise en charge de IA32_ENERGY_PERF_BIAS
  • cat_l3: Technologie d'allocation de cache L3
  • cat_l2: Technologie d'allocation de cache L2
  • cdp_l3: Priorisation du code et des données L3
  • invpcid_single: efficacement invpcidetCR4.PCIDE=1
  • hw_pstate: AMD HW-PState
  • proc_feedback: AMD ProcFeedbackInterface
  • sme: Cryptage de la mémoire sécurisée AMD
  • pti: Isolation de table de pages de noyau (Kaiser)
  • retpoline: Atténuation de la rétine pour la variante 2 du spectre (branches indirectes)
  • retpoline_amd: Atténuation par AMD Retpoline
  • intel_ppin: Numéro d'inventaire du processeur Intel
  • avx512_4vnniw: Instructions sur le réseau de neurones AVX-512
  • avx512_4fmaps: AVX-512 Multiply Accumulation Simple précision
  • mba: Allocation de bande passante mémoire
  • rsb_ctxsw: Remplir RSB sur les changements de contexte

Drapeaux de virtualisation: définis par Linux

  • tpr_shadow: Intel TPR Shadow
  • vnmi: Intel Virtual NMI
  • flexpriority: Intel FlexPriority
  • ept: Tableau de pages étendu Intel
  • vpid: ID de processeur virtuel Intel
  • vmmcall: Préférer VMMCALLàVMCALL

Fonctions de processeur définies par Intel, niveau de CPUID 0x00000007: 0 (ebx)

Fonctionnalités à l'état étendu, niveau CPUID 0x0000000d: 1 (eax)

  • xsaveopt: Optimisé XSAVE
  • xsavec: XSAVEC
  • xgetbv1: XGETBVavec ECX = 1
  • xsaves: XSAVES/XRSTORS

Sous-feuille QoS de la CPU définie par Intel, CPUID niveau 0x0000000F: 0 (edx)

  • cqm_llc: LLC QoS

Sous-feuille QoS de la CPU définie par Intel, CPUID niveau 0x0000000F: 1 (edx)

  • cqm_occup_llc: Surveillance de l'occupation LLC
  • cqm_mbm_total: Surveillance totale de la MBM par LLC
  • cqm_mbm_local: Surveillance de MBM locale LLC

Fonctions de processeur définies par AMD, niveau de CPUID 0x80000008 (ebx)

  • clzero: CLZEROinstruction
  • irperf: instructions retraitées compteur de performance
  • xsaveerptr: Toujours enregistrer / restaurer les pointeurs d’erreur de FP

Feuille Thermal and Power Management, niveau de CPUID 0x00000006 (eax)

  • dtherm(anciennement dts): capteur thermique numérique
  • ida: Intel Dynamic Acceleration
  • arat: Toujours en cours de minuterie APIC
  • pln: Notification de limite de puissance Intel
  • pts: État thermique du package Intel
  • hwp: P-États matériels Intel
  • hwp_notify: Notification HWP
  • hwp_act_window: Fenêtre d'activité HWP
  • hwp_epp: Préférence de performance énergétique HWP
  • hwp_pkg_req: Demande de paquet HWP

Identification de la fonctionnalité AMD SVM, niveau CPUID 0x8000000a (edx)

  • npt: Prise en charge de la table de pages imbriquée AMD
  • lbrv: Prise en charge de la virtualisation AMD LBR
  • svm_lock: AMD SVM verrouillant MSR
  • nrip_save: AMD SVM next_rip save
  • tsc_scale: Prise en charge de la mise à l'échelle d'AMD TSC
  • vmcb_clean: Prise en charge des bits propres AMD VMCB
  • flushbyasid: Prise en charge d'AMD flush-by-ASID
  • decodeassists: Assistance AMD Decode Assists
  • pausefilter: Interception de pause filtrée par AMD
  • pfthreshold: Seuil de filtre de pause AMD
  • avic: Contrôleur d'interruption virtuel
  • vmsave_vmload: Virtual VMSAVE VMLOAD
  • vgif: GIF virtuel

Fonctions de processeur définies par Intel, niveau de CPUID 0x00000007: 0 (ecx)

  • avx512vbmi: Instructions de manipulation de bits vectoriels AVX512
  • umip: Protection des instructions en mode utilisateur
  • pku: Clés de protection pour l'espace utilisateur
  • ospke: Activer les clés de protection du système d'exploitation
  • avx512_vbmi2: Instructions supplémentaires sur la manipulation de bits vectoriels AVX512
  • gfni: Nouvelles instructions du champ de Galois
  • vaes: Vecteur AES
  • vpclmulqdq: Quadword double sans multiplication
  • avx512_vnni: Instructions du réseau neuronal vectoriel
  • avx512_bitalg: Instructions VPOPCNT [B, W] et VPSHUF-BITQMB
  • avx512_vpopcntdq: POPCNT pour les vecteurs de DW / QW
  • la57: Tables de pages à 5 niveaux
  • rdpid: Instruction RDPID

Fonctions de processeur définies par AMD, niveau de CPUID 0x80000007 (ebx)

  • overflow_recov: Support de récupération de débordement MCA
  • succor: limitation des erreurs non corrigibles et récupération
  • smca: MCA évolutif

Bogues détectés du processeur (définis par Linux)

  • f00f: Intel F00F
  • fdiv: CPU FDIV
  • coma: Cyrix 6x86 coma
  • amd_tlb_mmatch: tlb_mmatchAMD Erratum 383
  • amd_apic_c1e: apic_c1eAMD Erratum 400
  • 11ap: Bad local APIC aussi nommé 11AP
  • fxsave_leak: FXSAVE fuit / FIP / FOP
  • clflush_monitor: AAI65, CLFLUSH requis avant MONITOR
  • sysret_ss_attrs: SYSRET ne corrige pas les attrs SS
  • espfix: "" IRET sur 16 bits SS corrompt les bits élevés ESP / RSP
  • null_seg: La suppression d'un sélecteur préserve la base
  • swapgs_fence: SWAPGS sans entrée dépend de GS
  • monitor: IPI requis pour réveiller le processeur distant
  • amd_e400: La CPU fait partie des personnes affectées par Erratum 400
  • cpu_meltdown: Le processeur est affecté par une attaque par fusion et nécessite l'isolation de la table de pages du noyau
  • spectre_v1: Le processeur est affecté par l' attaque de la variante 1 du spectre avec des branches conditionnelles
  • spectre_v2: Le processeur est affecté par l' attaque de la variante 2 du spectre avec des branches indirectes
  • spec_store_bypass: Le processeur est affecté par la vulnérabilité spéculative de stockage en magasin (variante 4 de Spectre).

PS Cette liste est dérivée de arch/x86/include/asm/cpufeatures.hla source du noyau. Les drapeaux sont listés dans le même ordre que le code source. Aidez-nous en ajoutant des liens vers les descriptions des fonctionnalités manquantes, en écrivant une brève description des fonctionnalités dont le nom est inexpressif et en mettant à jour la liste pour les nouvelles versions du noyau. La liste actuelle provient de Linux 4.15 plus quelques ajouts ultérieurs.

Gilles
la source
1
Merci @Gilles et les rédacteurs pour une question informative et sa réponse résumée et détaillée. Maintenant, pour vérifier ce que les capacités CPU, j'utiliser les éléments suivants pris de NixCraft, par exemple pour les processeurs Intel: $ egrep -wo ^flags|vmx|ept|vpid|npt|tpr_shadow|flexpriority|vnmi|lm|aes' /proc/cpuinfo --color | sort -u. Et il y a aussi l'excellent i-nex CLI / GUI .
tuk0z
Collection exceptionnelle d'explications et de liens; merci à tous ceux qui ont contribué.
Paul Gear
D'où proviennent les données sur les bugs? Il ne semble pas être répertorié dans le fichier cpufeatures.h.
Drazisil
@Drazisil Pour autant que je m'en souvienne, toutes les entrées proviennent de la version indiquée de cpufeatures.h. Les descriptions sont éditées pour les rendre plus compréhensibles et plus informatives lorsque quelqu'un a fait l'effort de le faire.
Gilles
@ Gilles Cela semble être le cas pour tous sauf les insectes. Mis à part que ceux-ci ne sont pas, featuresje ne les vois pas dans ce dossier.
Drazisil
71

BRAS

Sur les processeurs ARM, quelques fonctionnalités sont mentionnées dans la features:ligne. Seules les caractéristiques directement liées à l'architecture ARM y sont mentionnées, pas les caractéristiques propres à un fabricant de silicium ou à un système sur puce.

Les fonctionnalités sont obtenues en recherchant l'ID de la CPU avec read_cpuid()et dans les définitions de type de processeur connues au moment de la compilation, où les fonctionnalités sont exprimées sous la forme d'un masque d' HWCAP_xxxindicateurs. Les chaînes correspondantes sont dans hwcap_stretc. danssetup.c .

Dans la liste ci-dessous, ARMv6 a introduit les instructions SIMD et les types de données. ARMv7 a fourni des instructions SIMD avancées et des types de données. Sur les machines ARM 32 bits, les neonsignaux Advanced SIMD; while asimdsignale Advanced SIMD sur des machines à bras 64 bits.

Au-delà, la Hardware:ligne indique le modèle de processeur. Selon le modèle, il peut y avoir d'autres informations dans d'autres fichiers sous /procou /sys, ou dans les messages du journal du noyau au démarrage. Malheureusement, chaque fabricant de processeurs ARM dispose de sa propre méthode de génération de rapports sur les fonctionnalités du processeur, le cas échéant.

Gilles
la source
11

x86

Trouvez-le vous-même dans 4.1.3 x86 et le manuel Intel

arch/x86/include/asm/cpufeature.h contient la liste complète.

Les valeurs définies sont de type:

X*32 + Y

Par exemple:

#define X86_FEATURE_FPU     ( 0*32+ 0) /* Onboard FPU */

Les indicateurs de caractéristiques, extraits de CPUID, sont stockés dans le:

  • __u32 x86_capability[NCAPINTS + NBUGINTS]; champ
  • de struct cpuinfo_x86 boot_cpu_data
  • défini à x86/kernel/setup.c

qui est initialisé par des __initfonctions.

D'où x86_capabilityprovient chaque élément du tableau:

| index | eax      | ecx | output | file        |
|-------|----------|-----|--------|-------------|
|     0 |        1 |   0 | edx    | common.c    |
|     1 | 80000001 |     | edx    | common.c    |
|     2 | 80860001 |     | edx    | transmeta.c |
|     3 |          |     |        |             |
|     4 |        1 |   0 | ecx    | common.c    |
|     5 | C0000001 |     | edx    | centaur.c   |
|     6 | 80000001 |     | ecx    | common.c    |
|     7 |          |     |        | scattered.c |
|     8 |          |     |        |             |
|     9 |        7 |   0 | ebx    | common.c    |
|    10 |        D |   1 | eax    | common.c    |
|    11 |        F |   0 | edx    | common.c    |
|    12 |        F |   1 | edx    | common.c    |

Remarques:

Conclusions:

  • la plupart des entrées proviennent directement des registres de sortie CPUID et sont définies common.ccomme suit:

    c->x86_capability[0] = edx;
    

    Ceux-ci sont faciles à trouver en lot sur le manuel Intel pour CPUID.

  • les autres sont dispersés dans toute la source et sont définis petit à petit avec set_cpu_cap.

    Pour les trouver, utilisez à l' git grep X86_FEATURE_XXXintérieur arch/x86.

    Vous pouvez généralement déduire à quel bit CPUID ils correspondent du code environnant.

Autres faits amusants

  • Les drapeaux sont réellement imprimés arch/x86/kernel/cpu/proc.cavec le code:

    seq_puts(m, "flags\t\t:");
    for (i = 0; i < 32*NCAPINTS; i++)
        if (cpu_has(c, i) && x86_cap_flags[i] != NULL)
            seq_printf(m, " %s", x86_cap_flags[i]);
    

    Où:

    • cpu_has fait la vérification principale pour la fonctionnalité.
    • x86_cap_flags[i] contient des chaînes qui correspondent à chaque drapeau.

    Ceci est transmis en tant que rappel à la procconfiguration du système. Le point d'entrée est à fs/proc/cpuinfo.c.

  • x86_cap_flagsLes chaînes sont générées par arch/x86/kernel/cpu/mkcapflags.hdirectement à partir arch/x86/include/asm/cpufeature.hde "l'analyse" avec sed...

    La sortie va dans arch/x86/kernel/cpu/capflags.cle répertoire de construction, et le tableau résultant ressemble à ceci:

    const char * const x86_cap_flags[NCAPINTS*32] = {
        [X86_FEATURE_FPU]        = "fpu",
        [X86_FEATURE_VME]        = "vme",
    

    Ainsi, par exemple, X86_FEATURE_FPUcorrespond à la chaîne "fpu"et ainsi de suite.

  • cpu_has se décompose en deux cas avec code:

    #define cpu_has(c, bit)                         \
        (__builtin_constant_p(bit) && REQUIRED_MASK_BIT_SET(bit) ? 1 :  \
        test_cpu_cap(c, bit))
    

    Elles sont:

    • __builtin_constant_p(bit) && REQUIRED_MASK_BIT_SET(bit): l'indicateur est requis pour que le noyau s'exécute.

      Ceci est déterminé par les données internes required-features.h, qui commentent:

      Define minimum CPUID feature set for kernel These bits are checked
      really early to actually display a visible error message before the
      kernel dies.  Make sure to assign features to the proper mask!
      

      Étant donné que ceux-ci sont connus au moment de la compilation (configuration requise du noyau) et ont déjà été vérifiés au démarrage, le contrôle peut être résolu au moment de la compilation s'il bitest connu au moment de la compilation.

      Ainsi, le __builtin_constant_p(bit)qui vérifie si bitest une constante de temps de compilation.

    • test_cpu_cap: cela utilise les CPUIDdonnées du struct cpuinfo_x86 boot_cpu_datamonde

Ciro Santilli 改造 中心 六四 事件
la source
3
Vous avez expliqué comment passer de l'abréviation à un nom plus long, mais souvent ce nom plus long n'est pas beaucoup plus compréhensible et le cpuidfait d'une manière plus pratique. J'ai posé cette question pour avoir un endroit où les noms sont documentés.
Gilles
@Gilles c'est surtout pour ceux qui veulent faire les tables / ne trouvent pas leur fonction dans la table, comme moi :-) immédiat.
Ciro Santilli a annoncé le lundi
10

Ou bien vous pouvez utiliser le cpuidprogramme, il doit être dans le référentiel Debian. Il affiche toutes les informations possibles sur votre processeur avec quelques explications, afin que vous n'obteniez pas ces drapeaux obscurs.

Hurufu
la source
cpuidélargit les abréviations. Je n'appellerais pas vraiment ses explications de sortie . Savoir que cela htsignifie «Hyper Threading» explique cela dans une certaine mesure, mais sachant que cela mmxsignifie «ensemble d'instructions MMX», pas tellement, et cela mcasignifie «Architecture de contrôle de machine», à peine.
Gilles
6
@Gilles ... et pourtant, "Machine Check Architecture" est certainement une meilleure requête Google que "mca";)
Alois Mahdal