Cosa significano le bandiere in / proc / cpuinfo?


212

Come posso sapere se il mio processore ha una caratteristica particolare? (Set di istruzioni a 64 bit, virtualizzazione assistita da hardware, acceleratori crittografici, ecc.) So che il file /proc/cpuinfocontiene queste informazioni, nella flagsriga, ma cosa significano tutte queste abbreviazioni criptiche?

Ad esempio, dato il seguente estratto da /proc/cpuinfo, ho una CPU a 64 bit? Ho la virtualizzazione hardware?

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

Risposte:


275

X 86

(32-bit aka i386 – i686 e 64-bit aka amd64. In altre parole, workstation, laptop o server.)

FAQ: Ho ...

  • 64 bit (x86_64 / AMD64 / Intel64)? lm
  • Virtualizzazione hardware (VMX / AMD-V)? vmx(Intel), svm(AMD)
  • AES accelerato (AES-NI)? aes
  • TXT (TPM)? smx
  • un hypervisor (annunciato come tale)? hypervisor

La maggior parte delle altre funzionalità sono interessanti solo per gli autori di compilatori o kernel.

Tutte le bandiere

L'elenco completo è nel sorgente del kernel, nel file arch/x86/include/asm/cpufeatures.h.

Funzionalità CPU definite da Intel, livello CPUID 0x00000001 (edx)

Vedi anche Wikipedia e la tabella 2-27 nella Guida di riferimento alla programmazione delle estensioni vettoriali avanzate Intel

Funzionalità CPU definite da AMD, livello CPUID 0x80000001

Vedi anche Wikipedia e la tabella 2-23 nella Guida di riferimento per la programmazione di estensioni vettoriali avanzate Intel

Funzionalità CPU definite da Transmeta, livello CPUID 0x80860001

  • recovery: CPU in modalità di ripristino
  • longrun: Controllo di potenza Longrun
  • lrti: Interfaccia della tabella LongRun

Altre caratteristiche, mappatura definita da Linux

  • cxmmx: Estensioni Cyrix MMX
  • k6_mtrr: MTRR AMD K6 non standard
  • cyrix_arr: Cyrix ARRs (= MTRRs)
  • centaur_mcr: MCR Centaur (= MTRR)
  • constant_tsc: Tick TSC a velocità costante
  • up: Kernel SMP in esecuzione su UP
  • art: Timer sempre attivo
  • arch_perfmon: Intel Architectural PerfMon
  • pebs: Campionamento basato su eventi precisi
  • bts: Branch Trace Store
  • rep_good: rep microcode funziona bene
  • acc_power: Meccanismo di potenza accumulata AMD
  • nopl: Le istruzioni NOPL (0F 1F)
  • xtopology: estensioni enum topologia cpu
  • tsc_reliable: TSC è noto per essere affidabile
  • nonstop_tsc: TSC non si ferma negli stati C.
  • cpuid: La CPU ha l'istruzione CPUID stessa
  • extd_apicid: ha esteso APICID (8 bit)
  • amd_dcm: processore multi-nodo
  • aperfmperf: APERFMPERF
  • eagerfpu: Ripristino FPU non pigro
  • nonstop_tsc_s3: TSC non si ferma nello stato S3
  • tsc_known_freq: TSC ha una frequenza nota
  • mce_recovery: CPU ha controlli macchina recuperabili

Funzionalità CPU definite da Intel, livello CPUID 0x00000001 (ecx)

Vedi anche Wikipedia e la tabella 2-26 nella Guida di riferimento per la programmazione di estensioni vettoriali avanzate Intel

Funzionalità CPU definite VIA / Cyrix / Centaur, livello CPUID 0xC0000001

  • rng: Generatore di numeri casuali presente (xstore)
  • rng_en: Generatore di numeri casuali abilitato
  • ace: crittografia su CPU (xcrypt)
  • ace_en: crittografia su CPU abilitato
  • ace2: Advanced Cryptography Engine v2
  • ace2_en: ACE v2 abilitato
  • phe: PadLock Hash Engine
  • phe_en: PHE abilitato
  • pmm: Moltiplicatore Montgomery PadLock
  • pmm_en: PMM abilitato

Flag AMD più estesi: livello CPUID 0x80000001, ecx

  • lahf_lm: Carica AH dalle bandiere (LAHF) e conserva AH nelle bandiere (SAHF) in modalità lunga
  • cmp_legacy: Se sì, HyperThreading non è valido
  • svm: "Macchina virtuale sicura": AMD-V
  • extapic: Spazio APIC esteso
  • cr8_legacy: CR8 in modalità 32 bit
  • abm: Manipolazione avanzata dei bit
  • sse4a: SSE-4A
  • misalignsse: indica se viene generata un'eccezione di protezione generale (#GP) quando alcune istruzioni SSE legacy operano su dati non allineati. Dipende anche da CR0 e dal bit di controllo allineamento
  • 3dnowprefetch: Istruzioni di prefetch 3DNow
  • osvw: indica la soluzione visibile al sistema operativo , che consente al sistema operativo di aggirare gli errori del processore.
  • ibs: Campionamento basato su istruzioni
  • xop: istruzioni AVX estese
  • skinit: Istruzioni SKINIT / STGI
  • wdt: Timer watchdog
  • lwp: Profilatura leggera
  • fma4: 4 operandi istruzioni MAC
  • tce: estensione della cache di traduzione
  • nodeid_msr: NodeId MSR
  • tbm: Manipolazione di bit finali
  • topoext: Estensioni topologia Foglie CPUID
  • perfctr_core: Estensioni del contatore delle prestazioni principali
  • perfctr_nb: NB: estensioni del contatore delle prestazioni
  • bpext: estensione del punto di interruzione dei dati
  • ptsc: contatore di timestamp delle prestazioni
  • perfctr_l2: Estensioni contatore prestazioni L2
  • mwaitx: MWAITextension ( MONITORX/ MWAITX)

Flag ausiliari: definito da Linux - Per funzionalità sparse in vari livelli CPUID

  • ring3mwait: Anello 3 MONITOR / MWAIT
  • cpuid_fault: Errore CPUID Intel
  • cpb: AMD Core Performance Boost
  • epb: Supporto IA32_ENERGY_PERF_BIAS
  • cat_l3: Tecnologia di allocazione della cache L3
  • cat_l2: Tecnologia di allocazione della cache L2
  • cdp_l3: Priorità e priorità dei dati L3
  • invpcid_single: efficacemente invpcideCR4.PCIDE=1
  • hw_pstate: AMD HW-PState
  • proc_feedback: AMD ProcFeedbackInterface
  • sme: AMD Secure Memory Encryption
  • pti: Kernel Page Table Isolation (Kaiser)
  • retpoline: Mitigazione della retolina per la variante 2 di spettro (rami indiretti)
  • retpoline_amd: Mitigazione AMD Retpoline
  • intel_ppin: Numero di inventario del processore Intel
  • avx512_4vnniw: AVX-512 Istruzioni per la rete neurale
  • avx512_4fmaps: AVX-512 Accumulo di moltiplicazioni Precisione singola
  • mba: Allocazione della larghezza di banda della memoria
  • rsb_ctxsw: Riempire RSB sugli switch di contesto

Flag di virtualizzazione: Linux definito

  • tpr_shadow: Intel TPR Shadow
  • vnmi: Intel Virtual NMI
  • flexpriority: Intel FlexPriority
  • ept: Tabella di pagine estese Intel
  • vpid: ID processore virtuale Intel
  • vmmcall: Preferiscono VMMCALLaVMCALL

Funzionalità CPU definite da Intel, livello CPUID 0x00000007: 0 (ebx)

Funzionalità di stato estese, livello CPUID 0x0000000d: 1 (eax)

  • xsaveopt: Ottimizzato XSAVE
  • xsavec: XSAVEC
  • xgetbv1: XGETBVcon ECX = 1
  • xsaves: XSAVES/XRSTORS

Sotto-foglia CPU QoS definita da Intel, livello CPUID 0x0000000F: 0 (edx)

  • cqm_llc: LLC QoS

Sub-leaf CPU QoS definita da Intel, livello CPUID 0x0000000F: 1 (edx)

  • cqm_occup_llc: Monitoraggio dell'occupazione LLC
  • cqm_mbm_total: Monitoraggio totale MBM LLC
  • cqm_mbm_local: Monitoraggio MBM locale LLC

Funzionalità CPU definite da AMD, livello CPUID 0x80000008 (ebx)

  • clzero: CLZEROistruzione
  • irperf: istruzioni contatore delle prestazioni ritirato
  • xsaveerptr: Salva / ripristina sempre i puntatori di errore FP

Foglio di gestione termica e dell'alimentazione, livello CPUID 0x00000006 (eax)

  • dtherm(precedentemente dts): sensore termico digitale
  • ida: Intel Dynamic Acceleration
  • arat: Sempre in esecuzione APIC Timer
  • pln: Notifica Intel Power Limit
  • pts: Stato termico del pacchetto Intel
  • hwp: Stati P hardware Intel
  • hwp_notify: Notifica HWP
  • hwp_act_window: Finestra attività HWP
  • hwp_epp: Preferenza di prestazione energetica HWP
  • hwp_pkg_req: Richiesta a livello di pacchetto HWP

Identificazione delle funzioni SVD AMD, livello CPUID 0x8000000a (edx)

  • npt: Supporto tabella pagine nidificate AMD
  • lbrv: Supporto per la virtualizzazione AMD LBR
  • svm_lock: MSD blocco AMD SVM
  • nrip_save: AMD SVM next_rip save
  • tsc_scale: Supporto di ridimensionamento AMD TSC
  • vmcb_clean: Supporto bit puliti AMD VMCB
  • flushbyasid: Supporto AMD flush-by-ASID
  • decodeassists: Decodifica AMD Supporta il supporto
  • pausefilter: Intercettazione pausa filtrata AMD
  • pfthreshold: Soglia filtro pausa AMD
  • avic: Virtual Interrupt Controller
  • vmsave_vmload: Virtual VMSAVE VMLOAD
  • vgif: GIF virtuale

Funzionalità CPU definite da Intel, livello CPUID 0x00000007: 0 (ecx)

  • avx512vbmi: AVX512 Istruzioni per la manipolazione dei bit vettoriali
  • umip: Protezione istruzioni in modalità utente
  • pku: Chiavi di protezione per Userspace
  • ospke: Abilita chiavi di protezione del sistema operativo
  • avx512_vbmi2: Istruzioni aggiuntive per la manipolazione di bit vettoriali AVX512
  • gfni: Galois Field Nuove istruzioni
  • vaes: Vector AES
  • vpclmulqdq: Doppia parola chiave a moltiplicazione senza carry
  • avx512_vnni: Istruzioni per la rete neurale vettoriale
  • avx512_bitalg: Istruzioni VPOPCNT [B, W] e VPSHUF-BITQMB
  • avx512_vpopcntdq: POPCNT per vettori di DW / QW
  • la57: Tabelle di pagine a 5 livelli
  • rdpid: Istruzione RDPID

Funzionalità CPU definite da AMD, livello CPUID 0x80000007 (ebx)

  • overflow_recov: Supporto per il recupero di overflow MCA
  • succor: contenimento e recupero di errori non corretti
  • smca: MCA scalabile

Bug della CPU rilevati (definiti da Linux)

  • f00f: Intel F00F
  • fdiv: CPU FDIV
  • coma: Coma Cyrix 6x86
  • amd_tlb_mmatch: tlb_mmatchAMD Erratum 383
  • amd_apic_c1e: apic_c1eAMD Erratum 400
  • 11ap: APIC locale non valido noto anche come 11AP
  • fxsave_leak: FXSAVE perde FOP / FIP / FOP
  • clflush_monitor: AAI65, CLFLUSH richiesto prima del MONITOR
  • sysret_ss_attrs: SYSRET non corregge gli attrs SS
  • espfix: "" IRET su SS a 16 bit corrompe i bit alti ESP / RSP
  • null_seg: Annullando un selettore si preserva la base
  • swapgs_fence: SWAPGS senza input dep su GS
  • monitor: IPI richiesto per riattivare la CPU remota
  • amd_e400: La CPU è tra le interessate da Erratum 400
  • cpu_meltdown: La CPU è influenzata dall'attacco di fusione e necessita dell'isolamento della tabella delle pagine del kernel
  • spectre_v1: La CPU è influenzata dall'attacco variante 1 di Spettro con rami condizionali
  • spectre_v2: La CPU è influenzata dall'attacco della variante 2 Spectre con diramazioni indirette
  • spec_store_bypass: La CPU è interessata dalla vulnerabilità di esclusione dello store speculativo (variante Spectre 4).

PS Questo elenco è stato derivato dal arch/x86/include/asm/cpufeatures.hsorgente del kernel. I flag sono elencati nello stesso ordine del codice sorgente. Aiutate aggiungendo i collegamenti alle descrizioni delle funzionalità quando mancano, scrivendo una breve descrizione delle funzionalità che hanno nomi inespressivi e aggiornando l'elenco per le nuove versioni del kernel. L'elenco attuale è di Linux 4.15 più alcune aggiunte successive.


1
Grazie a @Gilles e ai redattori per una domanda informativa e la sua risposta sintetica e dettagliata. Ora, per controllare qualunque capacità di CPU, Io uso il seguente tratto da NixCraft, ad esempio per le CPU Intel: $ egrep -wo ^flags|vmx|ept|vpid|npt|tpr_shadow|flexpriority|vnmi|lm|aes' /proc/cpuinfo --color | sort -u. E c'è anche l'eccellente i-nex CLI / GUI .
tuk0z,

Eccezionale raccolta di spiegazioni e collegamenti; grazie a tutti quelli che hanno contribuito.
Paul Gear,

Da dove provengono i dati sui bug? Non sembra essere elencato nel file cpufeatures.h.
Drazisil,

@Drazisil Per quanto ricordo tutte le voci provengono dalla versione indicata di cpufeatures.h. Le descrizioni sono modificate per renderle più comprensibili e più istruttive laddove qualcuno si è sforzato di farlo.
Gilles,

@Gilles Questo sembra essere il caso di tutti tranne i bug. A parte il fatto che quelli non lo featuressono non li vedo in quel file.
Drazisil,

71

BRACCIO

Sui processori ARM, alcune funzionalità sono menzionate nella features:linea. Qui vengono menzionate solo le funzionalità direttamente correlate all'architettura ARM, non quelle specifiche per un produttore di silicio o un sistema su chip.

Le funzionalità si ottengono cercando l'ID CPU read_cpuid()e cercandolo nelle definizioni del tipo di processore note al momento della compilazione in cui le funzionalità sono espresse come una maschera di HWCAP_xxxflag. Le stringhe corrispondenti sono in hwcap_streccsetup.c . In .

Nell'elenco seguente, ARMv6 ha introdotto istruzioni e tipi di dati SIMD. ARMv7 ha fornito istruzioni e tipi di dati SIMD avanzati. Su macchine ARM a 32 bit, neonsegnala Advanced SIMD; while asimdsegnala Advanced SIMD su macchine arm a 64 bit.

Oltre a ciò, la Hardware:linea indica il modello di processore. A seconda del modello, potrebbero esserci altre informazioni in altri file sotto /proco /sys, o nei messaggi di log del kernel all'avvio. Sfortunatamente, ogni produttore di CPU ARM ha il proprio metodo per segnalare eventuali funzioni del processore.



11

X 86

Trovalo tu stesso in 4.1.3 x86 e nel manuale Intel

arch/x86/include/asm/cpufeature.h contiene l'elenco completo.

I valori di definizione sono di tipo:

X*32 + Y

Per esempio:

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

I flag delle funzionalità, estratti da CPUID, sono memorizzati all'interno di:

  • __u32 x86_capability[NCAPINTS + NBUGINTS]; campo
  • di struct cpuinfo_x86 boot_cpu_data
  • definito a x86/kernel/setup.c

che è inizializzato attraverso le __initfunzioni.

Da dove x86_capabilityproviene ciascun elemento dell'array:

| 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    |

Appunti:

conclusioni:

  • la maggior parte delle voci provengono direttamente dai registri di uscita CPUID e sono impostate common.cda qualcosa del tipo:

    c->x86_capability[0] = edx;
    

    Questi sono facili da trovare in batch nel manuale Intel per CPUID.

  • gli altri sono sparsi in tutta la sorgente e sono impostati a poco a poco con set_cpu_cap.

    Per trovarli, usa git grep X86_FEATURE_XXXdentro arch/x86.

    Di solito è possibile dedurre il bit CPUID a cui corrispondono dal codice circostante.

Altri fatti divertenti

  • Le bandiere sono effettivamente stampate arch/x86/kernel/cpu/proc.ccon il codice:

    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]);
    

    Dove:

    • cpu_has fa il controllo principale per la funzione.
    • x86_cap_flags[i] contiene stringhe che corrispondono a ciascun flag.

    Questo viene passato come callback procall'installazione del sistema. Il punto di ingresso è a fs/proc/cpuinfo.c.

  • x86_cap_flagsle stringhe sono generate arch/x86/kernel/cpu/mkcapflags.hdirettamente arch/x86/include/asm/cpufeature.hda "analizzandole" con sed...

    L'output passa alla arch/x86/kernel/cpu/capflags.cdirectory di generazione e la matrice risultante è simile a:

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

    quindi ad esempio X86_FEATURE_FPUcorrisponde alla stringa "fpu"e così via.

  • cpu_has si divide in due casi con il codice:

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

    Loro sono:

    • __builtin_constant_p(bit) && REQUIRED_MASK_BIT_SET(bit): il flag è necessario per l'esecuzione del kernel.

      Questo è determinato dai dati all'interno required-features.h, che commentano:

      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!
      

      Poiché quelli noti al momento della compilazione (requisiti del kernel), sono già stati controllati all'avvio, il controllo può essere risolto al momento della compilazione se bitè noto al momento della compilazione.

      Quindi il __builtin_constant_p(bit)quale controlla se bitè una costante di tempo di compilazione.

    • test_cpu_cap: questo utilizza i CPUIDdati dal struct cpuinfo_x86 boot_cpu_dataglobale


3
Hai spiegato come passare dall'abbreviazione a un nome più lungo, ma spesso quel nome più lungo non è molto più comprensibile e lo cpuidfa in un modo più conveniente. Ho fatto quella domanda per avere un posto dove sono documentati i nomi.
Gilles,

@Gilles questo è principalmente per coloro che vogliono creare le tabelle / non riescono a trovare le loro caratteristiche nella tabella, come me :-) Ma comunque, nella maggior parte dei casi, una volta che guardi nel punto giusto della fonte, la mappa a CPUID è immediato.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

10

O in alternativa puoi usare il cpuidprogramma, deve essere nel repository debian. Scarica tutte le informazioni possibili sulla tua CPU con alcune spiegazioni, quindi non ottieni quelle bandiere oscure.


cpuidespande le abbreviazioni. Non chiamerei davvero le sue spiegazioni sull'output . Sapere che htsignifica "Hyper Threading" lo spiega in una certa misura, ma sapere che mmxsignifica "set di istruzioni MMX", non tanto, e che mcasignifica "Machine Check Architecture", quasi.
Gilles,

6
@Gilles ... eppure, "Machine Check Architecture" è sicuramente una query di Google migliore di "mca";)
Alois Mahdal,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.