¿Qué significan las banderas en / proc / cpuinfo?

212

¿Cómo puedo saber si mi procesador tiene una característica particular? (Conjunto de instrucciones de 64 bits, virtualización asistida por hardware, aceleradores criptográficos, etc.) Sé que el archivo /proc/cpuinfocontiene esta información, en la flagslínea, pero ¿qué significan todas estas abreviaturas crípticas?

Por ejemplo, dado el siguiente extracto de /proc/cpuinfo, ¿tengo una CPU de 64 bits? ¿Tengo virtualización de 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
Gilles
fuente

Respuestas:

275

x86

(32 bits, también conocido como i386 – i686 y 64 bits, también conocido como amd64. En otras palabras, su estación de trabajo, computadora portátil o servidor).

Preguntas frecuentes: ¿Tengo ...

  • 64 bits (x86_64 / AMD64 / Intel64)? lm
  • ¿Virtualización de hardware (VMX / AMD-V)? vmx(Intel), svm(AMD)
  • AES acelerado (AES-NI)? aes
  • TXT (TPM)? smx
  • un hipervisor (anunciado como tal)? hypervisor

La mayoría de las otras características solo son de interés para los autores del compilador o del núcleo.

Todas las banderas

El listado completo está en la fuente del núcleo, en el archivo arch/x86/include/asm/cpufeatures.h.

Funciones de CPU definidas por Intel, nivel de CPUID 0x00000001 (edx)

Consulte también Wikipedia y la tabla 2-27 en la Referencia de programación de Intel Advanced Vector Extensions

Funciones de CPU definidas por AMD, nivel de CPUID 0x80000001

Consulte también Wikipedia y la tabla 2-23 en la Referencia de programación de Intel Advanced Vector Extensions

Funciones de CPU definidas por Transmeta, nivel de CPUID 0x80860001

  • recovery: CPU en modo de recuperación
  • longrun: Control de potencia a largo plazo
  • lrti: Interfaz de tabla LongRun

Otras características, mapeo definido por Linux

  • cxmmx: Extensiones de Cyrix MMX
  • k6_mtrr: MTRR no estándar AMD K6
  • cyrix_arr: ARC de Cyrix (= MTRR)
  • centaur_mcr: MCR de Centauro (= MTRR)
  • constant_tsc: TSC funciona a un ritmo constante
  • up: Núcleo de SMP ejecutándose en UP
  • art: Temporizador siempre en funcionamiento
  • arch_perfmon: Intel Architectural PerfMon
  • pebs: Muestreo basado en eventos precisos
  • bts: Tienda Branch Trace
  • rep_good: el microcódigo de representante funciona bien
  • acc_power: Mecanismo de potencia acumulada AMD
  • nopl: Las instrucciones NOPL (0F 1F)
  • xtopology: extensiones de enumeración de topología de CPU
  • tsc_reliable: Se sabe que TSC es confiable
  • nonstop_tsc: TSC no se detiene en estados C
  • cpuid: La CPU tiene la instrucción CPUID misma
  • extd_apicid: ha extendido APICID (8 bits)
  • amd_dcm: procesador de múltiples nodos
  • aperfmperf: APERFMPERF
  • eagerfpu: Restauración de FPU no perezosa
  • nonstop_tsc_s3: TSC no se detiene en el estado S3
  • tsc_known_freq: TSC tiene frecuencia conocida
  • mce_recovery: La CPU tiene comprobaciones de máquina recuperables

Funciones de CPU definidas por Intel, nivel de CPUID 0x00000001 (ecx)

Consulte también Wikipedia y la tabla 2-26 en la Referencia de programación de Intel Advanced Vector Extensions

Funciones de CPU definidas por VIA / Cyrix / Centaur, nivel de CPUID 0xC0000001

  • rng: Generador de números aleatorios presente (xstore)
  • rng_en: Generador de números aleatorios habilitado
  • ace: cifrado en CPU (xcrypt)
  • ace_en: cifrado en CPU habilitado
  • ace2: Motor de criptografía avanzado v2
  • ace2_en: ACE v2 habilitado
  • phe: Motor PadLock Hash
  • phe_en: PHE habilitado
  • pmm: Multiplicador PadLock Montgomery
  • pmm_en: PMM habilitado

Más indicadores AMD extendidos: CPUID nivel 0x80000001, ecx

  • lahf_lm: Cargue AH desde Banderas (LAHF) y Almacene AH en Banderas (SAHF) en modo largo
  • cmp_legacy: En caso afirmativo, HyperThreading no es válido
  • svm: "Máquina virtual segura": AMD-V
  • extapic: Espacio APIC extendido
  • cr8_legacy: CR8 en modo de 32 bits
  • abm: Manipulación avanzada de bits
  • sse4a: SSE-4A
  • misalignsse: indica si se genera una excepción de protección general (#GP) cuando algunas instrucciones SSE heredadas operan en datos no alineados. También depende de CR0 y el bit de verificación de alineación
  • 3dnowprefetch: Instrucciones de captación previa de 3DNow
  • osvw: indica la solución visible del sistema operativo , que permite que el sistema operativo evite las erratas del procesador.
  • ibs: Muestreo basado en instrucciones
  • xop: instrucciones AVX extendidas
  • skinit: Instrucciones de SKINIT / STGI
  • wdt: Temporizador de vigilancia
  • lwp: Perfiles de peso ligero
  • fma4: 4 operandos instrucciones MAC
  • tce: extensión de caché de traducción
  • nodeid_msr: NodeId MSR
  • tbm: Manipulación de bits finales
  • topoext: Extensiones de topología CPUID leafs
  • perfctr_core: Extensiones de contador de rendimiento central
  • perfctr_nb: NB Extensiones de contador de rendimiento
  • bpext: extensión del punto de corte de datos
  • ptsc: contador de marca de tiempo de rendimiento
  • perfctr_l2: Extensiones de contador de rendimiento L2
  • mwaitx: MWAITextensión ( MONITORX/ MWAITX)

Indicadores auxiliares: definidos por Linux: para funciones dispersas en varios niveles de CPUID

  • ring3mwait: Anillo 3 MONITOR / MWAIT
  • cpuid_fault: Intel CPUID falla
  • cpb: AMD Core Performance Boost
  • epb: Soporte IA32_ENERGY_PERF_BIAS
  • cat_l3: Tecnología de asignación de caché L3
  • cat_l2: Tecnología de asignación de caché L2
  • cdp_l3: Código y priorización de datos L3
  • invpcid_single: efectivamente invpcidyCR4.PCIDE=1
  • hw_pstate: AMD HW-PState
  • proc_feedback: AMD ProcFeedbackInterface
  • sme: Cifrado de memoria segura de AMD
  • pti: Aislamiento de tabla de página de kernel (Kaiser)
  • retpoline: Mitigación de retpoline para la variante 2 de Specter (ramas indirectas)
  • retpoline_amd: Mitigación de AMD Retpoline
  • intel_ppin: Número de inventario del procesador Intel
  • avx512_4vnniw: Instrucciones de red neuronal AVX-512
  • avx512_4fmaps: AVX-512 Acumulación múltiple Precisión simple
  • mba: Asignación de ancho de banda de memoria
  • rsb_ctxsw: Rellenar RSB en cambios de contexto

Indicadores de virtualización: Linux definido

  • tpr_shadow: Intel TPR Shadow
  • vnmi: Intel Virtual NMI
  • flexpriority: Intel FlexPriority
  • ept: Tabla de páginas extendidas de Intel
  • vpid: ID del procesador virtual Intel
  • vmmcall: Prefiera VMMCALLaVMCALL

Funciones de CPU definidas por Intel, nivel de CPUID 0x00000007: 0 (ebx)

Funciones de estado extendidas, nivel de CPUID 0x0000000d: 1 (eax)

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

Sub-hoja de QoS de CPU definida por Intel, nivel de CPUID 0x0000000F: 0 (edx)

  • cqm_llc: LLC QoS

Sub-hoja de QoS de CPU definida por Intel, nivel de CPUID 0x0000000F: 1 (edx)

  • cqm_occup_llc: Monitoreo de ocupación LLC
  • cqm_mbm_total: Monitoreo total de MBM de LLC
  • cqm_mbm_local: Monitoreo local de MBM de LLC

Funciones de CPU definidas por AMD, nivel de CPUID 0x80000008 (ebx)

  • clzero: CLZEROinstrucción
  • irperf: instrucciones retiradas contador de rendimiento
  • xsaveerptr: Guardar / restaurar siempre punteros de error FP

Hoja de gestión térmica y de energía, nivel CPUID 0x00000006 (eax)

  • dtherm(anteriormente dts): sensor térmico digital
  • ida: Aceleración dinámica de Intel
  • arat: Siempre ejecutando APIC Timer
  • pln: Notificación de límite de energía de Intel
  • pts: Estado térmico del paquete Intel
  • hwp: Estados P de hardware Intel
  • hwp_notify: Notificación de HWP
  • hwp_act_window: Ventana de actividad de HWP
  • hwp_epp: Preferencia de rendimiento energético de HWP
  • hwp_pkg_req: Solicitud de nivel de paquete HWP

Identificación de características de AMD SVM, nivel de CPUID 0x8000000a (edx)

  • npt: Soporte de tabla de páginas anidadas de AMD
  • lbrv: Soporte de virtualización AMD LBR
  • svm_lock: AMD SVM bloqueando MSR
  • nrip_save: AMD SVM next_rip save
  • tsc_scale: Soporte de escalamiento AMD TSC
  • vmcb_clean: Soporte de bits limpios AMD VMCB
  • flushbyasid: Compatibilidad con AMD flush-by-ASID
  • decodeassists: Soporte de AMD Decode Assists
  • pausefilter: Intercepción de pausa filtrada AMD
  • pfthreshold: Umbral de filtro de pausa AMD
  • avic: Controlador de interrupción virtual
  • vmsave_vmload: Virtual VMSAVE VMLOAD
  • vgif: GIF virtual

Funciones de CPU definidas por Intel, nivel de CPUID 0x00000007: 0 (ecx)

  • avx512vbmi: Instrucciones de manipulación de bits vectoriales AVX512
  • umip: Protección de instrucciones del modo de usuario
  • pku: Claves de protección para el espacio de usuario
  • ospke: Habilitar claves de protección del sistema operativo
  • avx512_vbmi2: Instrucciones adicionales de manipulación de bits de vectores AVX512
  • gfni: Nuevas instrucciones de campo de Galois
  • vaes: Vector AES
  • vpclmulqdq: Multiplicación doble sin palabras
  • avx512_vnni: Instrucciones de red neuronal vectorial
  • avx512_bitalg: Instrucciones VPOPCNT [B, W] y VPSHUF-BITQMB
  • avx512_vpopcntdq: POPCNT para vectores de DW / QW
  • la57: Tablas de páginas de 5 niveles
  • rdpid: Instrucción RDPID

Funciones de CPU definidas por AMD, nivel de CPUID 0x80000007 (ebx)

  • overflow_recov: Soporte de recuperación de desbordamiento MCA
  • succor: contención y recuperación de errores no corregibles
  • smca: MCA escalable

Errores de CPU detectados (definidos por 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 local mal conocido como 11AP
  • fxsave_leak: FXSAVE pierde FOP / FIP / FOP
  • clflush_monitor: AAI65, CLFLUSH requerido antes de MONITOR
  • sysret_ss_attrs: SYSRET no repara los atributos SS
  • espfix: "" IRET a SS de 16 bits corrompe los bits altos ESP / RSP
  • null_seg: Anular un selector conserva la base
  • swapgs_fence: SWAPGS sin entrada dep en GS
  • monitor: IPI requerido para activar la CPU remota
  • amd_e400: CPU está entre los afectados por Erratum 400
  • cpu_meltdown: La CPU se ve afectada por el ataque de fusión y necesita el aislamiento de la tabla de la página del núcleo
  • spectre_v1: La CPU se ve afectada por el ataque de la variante 1 de Spectre con ramas condicionales
  • spectre_v2: La CPU se ve afectada por el ataque de la variante 2 de Spectre con ramas indirectas
  • spec_store_bypass: La CPU se ve afectada por la vulnerabilidad Speculative Store Bypass (variante 4 de Specter).

PD: Este listado se deriva de arch/x86/include/asm/cpufeatures.hla fuente del núcleo. Las banderas se enumeran en el mismo orden que el código fuente. Ayude agregando enlaces a las descripciones de las características cuando faltan, escribiendo una breve descripción de las características que tienen nombres inexpresivos y actualizando la lista para las nuevas versiones del kernel. La lista actual es de Linux 4.15 más algunas adiciones posteriores.

Gilles
fuente
1
Gracias @Gilles y editores por una pregunta informativa y su respuesta resumida y detallada. Ahora, para comprobar lo capacidades de la CPU, uso el siguiente tomado de NixCraft, por ejemplo, para las CPU Intel: $ egrep -wo ^flags|vmx|ept|vpid|npt|tpr_shadow|flexpriority|vnmi|lm|aes' /proc/cpuinfo --color | sort -u. Y también está la excelente CLI / GUI i-nex .
tuk0z
Excelente colección de explicaciones y enlaces; Gracias a todos los que contribuyeron.
Paul Gear
¿De dónde provienen los datos de errores? No parece estar listado en el archivo cpufeatures.h.
Drazisil
@Drazisil Por lo que recuerdo, todas las entradas son de la versión indicada de cpufeatures.h. Las descripciones se editan para que sean más comprensibles y más informativas cuando alguien se esforzó por hacer eso.
Gilles
@Gilles Ese parece ser el caso para todos menos los errores. Dejando a un lado que esos no featureslo son, no los veo en ese archivo.
Drazisil
71

BRAZO

En los procesadores ARM, se mencionan algunas características en la features:línea. Allí solo se mencionan las características directamente relacionadas con la arquitectura ARM, no las características específicas de un fabricante de silicio o sistema en chip.

Las características se obtienen al buscar la identificación de la CPU read_cpuid()y buscarla en las definiciones de tipo de procesador conocidas en el momento de la compilación, donde las características se expresan como una máscara de HWCAP_xxxbanderas. Las cadenas correspondientes están en hwcap_stretc. ensetup.c .

En la lista a continuación, ARMv6 introdujo instrucciones SIMD y tipos de datos. ARMv7 proporcionó instrucciones SIMD avanzadas y tipos de datos. En máquinas ARM de 32 bits, neonseñales SIMD avanzadas; while asimdseñala Advanced SIMD en máquinas de brazo de 64 bits.

Más allá de eso, la Hardware:línea indica el modelo de procesador. Dependiendo del modelo, puede haber otra información en otros archivos debajo de /proco /sys, o en los mensajes de registro del kernel durante el arranque. Desafortunadamente, cada fabricante de CPU ARM tiene su propio método para informar las características del procesador, si las hay.

Gilles
fuente
11

x86

Encuéntrelo usted mismo en 4.1.3 x86 y el manual de Intel

arch/x86/include/asm/cpufeature.h contiene la lista completa

Los valores definidos son de tipo:

X*32 + Y

P.ej:

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

Las banderas de características, extraídas de CPUID, se almacenan dentro de:

  • __u32 x86_capability[NCAPINTS + NBUGINTS]; campo
  • de struct cpuinfo_x86 boot_cpu_data
  • definido en x86/kernel/setup.c

que se inicializa a través de __initfunciones.

De dónde x86_capabilityproviene cada elemento de la matriz:

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

Notas:

Conclusiones:

  • la mayoría de las entradas provienen directamente de los registros de salida de CPUID y se configuran common.cmediante algo como:

    c->x86_capability[0] = edx;
    

    Esos son fáciles de encontrar en lotes en el manual de Intel para CPUID.

  • los otros están dispersos por toda la fuente y se configuran poco a poco con set_cpu_cap.

    Para encontrarlos, use git grep X86_FEATURE_XXXadentro arch/x86.

    Por lo general, puede deducir a qué bit CPUID corresponden del código circundante.

Otros datos curiosos

  • Las banderas se imprimen realmente arch/x86/kernel/cpu/proc.ccon el código:

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

    Dónde:

    • cpu_has realiza la comprobación principal de la función.
    • x86_cap_flags[i] contiene cadenas que corresponden a cada bandera.

    Esto se pasa como una devolución de llamada a la procconfiguración del sistema. El punto de entrada es en fs/proc/cpuinfo.c.

  • x86_cap_flagslas cadenas se generan arch/x86/kernel/cpu/mkcapflags.hdirectamente desde arch/x86/include/asm/cpufeature.h"analizándolas" con sed...

    El resultado va al arch/x86/kernel/cpu/capflags.cdirectorio de compilación y la matriz resultante se ve así:

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

    así, por ejemplo, X86_FEATURE_FPUcorresponde a la cadena "fpu"y así sucesivamente.

  • cpu_has se divide en dos casos con código:

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

    Son:

    • __builtin_constant_p(bit) && REQUIRED_MASK_BIT_SET(bit): se requiere el indicador para que se ejecute el kernel.

      Esto está determinado por los datos internos required-features.h, que comentan:

      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!
      

      Como se conocen en el momento de la compilación (requisitos del kernel), ya se han verificado al inicio, la verificación se puede resolver en el momento de la compilación si bitse conoce en el momento de la compilación.

      Por lo tanto, el __builtin_constant_p(bit)que comprueba si bites una constante de tiempo de compilación.

    • test_cpu_cap: esto utiliza CPUIDdatos del struct cpuinfo_x86 boot_cpu_dataglobal

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
fuente
3
Explicó cómo pasar de la abreviatura a un nombre más largo, pero a menudo ese nombre más largo no es mucho más comprensible, y lo cpuidhace de una manera más conveniente. Hice esa pregunta para tener un lugar donde los nombres estén documentados.
Gilles
@Gilles esto es principalmente para aquellos que quieren hacer las tablas / no pueden encontrar su función en la tabla, como yo :-) Pero aún así, para la mayoría de los casos, una vez que mira el punto correcto de la fuente, el mapa a CPUID es inmediato.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
10

O, alternativamente, puede usar el cpuidprograma, debe estar en el repositorio de Debian. Vuelca toda la información posible sobre su CPU con algunas explicaciones, para que no obtenga esas oscuras banderas.

hurufu
fuente
cpuidexpande las abreviaturas. Realmente no llamaría a sus explicaciones de salida . Saber eso htsignifica "Hyper Threading" lo explica en cierta medida, pero saber que mmxsignifica "conjunto de instrucciones MMX", no tanto, y eso mcasignifica "Arquitectura de verificación de máquina", apenas.
Gilles
66
@Gilles ... y, sin embargo, "Machine Check Architecture" es ciertamente una mejor consulta de Google que "mca";)
Alois Mahdal