O que significam os sinalizadores em / proc / cpuinfo?

212

Como posso saber se meu processador tem um recurso específico? (Conjunto de instruções de 64 bits, virtualização assistida por hardware, aceleradores criptográficos etc.) Sei que o arquivo /proc/cpuinfocontém essas informações, na flagslinha, mas o que significam todas essas abreviações criptográficas ?

Por exemplo, dada a seguinte extração de /proc/cpuinfo, eu tenho uma CPU de 64 bits? Eu tenho virtualização 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
fonte

Respostas:

275

x86

(Também conhecido como i386 – i686 de 32 bits e amd64 de 64 bits. Em outras palavras, sua estação de trabalho, laptop ou servidor.)

FAQ: Eu tenho…

  • 64 bits (x86_64 / AMD64 / Intel64)? lm
  • Virtualização de hardware (VMX / AMD-V)? vmx(Intel), svm(AMD)
  • AES acelerado (AES-NI)? aes
  • TXT (TPM)? smx
  • um hipervisor (anunciado como tal)? hypervisor

A maioria dos outros recursos é de interesse apenas dos autores do compilador ou do kernel.

Todas as bandeiras

A lista completa está no fonte do kernel, no arquivo arch/x86/include/asm/cpufeatures.h.

Recursos de CPU definidos pela Intel, nível de CPUID 0x00000001 (edx)

Consulte também Wikipedia e tabela 2-27 em Referência de programação de extensões avançadas de vetores Intel

Recursos de CPU definidos pela AMD, nível de CPUID 0x80000001

Consulte também Wikipedia e tabela 2-23 em Referência de programação de extensões avançadas de vetores Intel

Recursos de CPU definidos pela Transmeta, nível de CPUID 0x80860001

  • recovery: CPU no modo de recuperação
  • longrun: Controle de potência Longrun
  • lrti: Interface da tabela LongRun

Outros recursos, mapeamento definido pelo Linux

  • cxmmx: Extensões Cyrix MMX
  • k6_mtrr: MTRRs fora do padrão AMD K6
  • cyrix_arr: ARRs Cyrix (= MTRRs)
  • centaur_mcr: MCRs do Centauro (= MTRRs)
  • constant_tsc: TSC tiquetaqueia a uma taxa constante
  • up: Kernel SMP em execução no UP
  • art: Temporizador sempre em execução
  • arch_perfmon: Intel Architectural PerfMon
  • pebs: Amostragem baseada em eventos precisos
  • bts: Loja de rastreamento de filiais
  • rep_good: rep microcode funciona bem
  • acc_power: Mecanismo de energia acumulada da AMD
  • nopl: As instruções NOPL (0F 1F)
  • xtopology: extensões de enumeração de topologia da CPU
  • tsc_reliable: TSC é conhecido por ser confiável
  • nonstop_tsc: TSC não para nos estados C
  • cpuid: CPU possui a própria instrução CPUID
  • extd_apicid: estendeu o APICID (8 bits)
  • amd_dcm: processador de vários nós
  • aperfmperf: APERFMPERF
  • eagerfpu: Restauração de FPU não preguiçosa
  • nonstop_tsc_s3: TSC não para no estado S3
  • tsc_known_freq: TSC tem frequência conhecida
  • mce_recovery: CPU tem verificações de máquinas recuperáveis

Recursos de CPU definidos pela Intel, nível de CPUID 0x00000001 (ecx)

Consulte também a Wikipedia e a tabela 2-26 na Referência de programação de extensões avançadas de vetores Intel

Recursos de CPU definidos por VIA / Cyrix / Centaur, nível de CPUID 0xC0000001

  • rng: Gerador de número aleatório presente (xstore)
  • rng_en: Gerador de número aleatório ativado
  • ace: criptografia na CPU (xcrypt)
  • ace_en: criptografia na CPU ativada
  • ace2: Mecanismo de criptografia avançado v2
  • ace2_en: ACE v2 ativado
  • phe: Motor PadLock Hash
  • phe_en: PHE ativado
  • pmm: Multiplicador PadLock Montgomery
  • pmm_en: PMM ativado

Sinalizadores AMD mais estendidos: nível de CPUID 0x80000001, ecx

  • lahf_lm: Carregar AH de sinalizadores (LAHF) e armazenar AH em sinalizadores (SAHF) no modo longo
  • cmp_legacy: Se sim, HyperThreading inválido
  • svm: “Máquina virtual segura”: AMD-V
  • extapic: Espaço APIC estendido
  • cr8_legacy: CR8 no modo de 32 bits
  • abm: Manipulação avançada de bits
  • sse4a: SSE-4A
  • misalignsse: indica se uma exceção de proteção geral (#GP) é gerada quando algumas instruções SSE herdadas operam com dados não alinhados. Também depende do CR0 e do bit de verificação de alinhamento
  • 3dnowprefetch: Instruções de pré-busca do 3DNow
  • osvw: indica solução alternativa visível do sistema operacional , que permite que o sistema operacional resolva as erratas do processador.
  • ibs: Amostragem baseada em instruções
  • xop: instruções estendidas do AVX
  • skinit: Instruções SKINIT / STGI
  • wdt: Temporizador do cão de guarda
  • lwp: Perfil leve
  • fma4: 4 operandos instruções MAC
  • tce: extensão do cache de tradução
  • nodeid_msr: NodeId MSR
  • tbmPróximo : Manipulação de bits à direita
  • topoext: Folhas de CPUID das extensões de topologia
  • perfctr_corePróximo: Extensões do contador de desempenho principal
  • perfctr_nb: Extensões de contador de desempenho NB
  • bpext: extensão de ponto de interrupção de dados
  • ptsc: contador de registro de data e hora do desempenho
  • perfctr_l2: Extensões do contador de desempenho L2
  • mwaitx: MWAITextensão ( MONITORX/ MWAITX)

Sinalizadores auxiliares: definido pelo Linux - para recursos espalhados em vários níveis de CPUID

  • ring3mwait: Anel 3 MONITOR / MWAIT
  • cpuid_fault: Falha no CPUID da Intel
  • cpb: AMD Core Performance Boost
  • epb: Suporte IA32_ENERGY_PERF_BIAS
  • cat_l3: Tecnologia de alocação de cache L3
  • cat_l2: Tecnologia de alocação de cache L2
  • cdp_l3: Priorização de código e dados L3
  • invpcid_single: efetivamente invpcideCR4.PCIDE=1
  • hw_pstate: AMD HW-PState
  • proc_feedback: AMD ProcFeedbackInterface
  • sme: Criptografia de memória segura AMD
  • pti: Isolamento da tabela de páginas do kernel (Kaiser)
  • retpoline: Mitigação da retpolina para a variante 2 do espectro (ramificações indiretas)
  • retpoline_amd: Mitigação do AMD Retpoline
  • intel_ppin: Número do inventário do processador Intel
  • avx512_4vnniw: Instruções de rede neural AVX-512
  • avx512_4fmaps: Acumulação de multiplicação AVX-512 Precisão única
  • mba: Alocação de largura de banda de memória
  • rsb_ctxsw: Preencher RSB em comutadores de contexto

Sinalizadores de virtualização: Linux definido

  • tpr_shadow: Intel TPR Shadow
  • vnmi: Intel Virtual NMI
  • flexpriority: Intel FlexPriority
  • ept: Tabela de páginas estendidas da Intel
  • vpid: ID do processador virtual Intel
  • vmmcall: Prefira VMMCALLaVMCALL

Recursos de CPU definidos pela Intel, nível de CPUID 0x00000007: 0 (ebx)

Recursos de estado estendido, nível de CPUID 0x0000000d: 1 (eax)

  • xsaveopt: Otimizado XSAVE
  • xsavec: XSAVEC
  • xgetbv1: XGETBVcom ECX = 1
  • xsaves: XSAVES/XRSTORS

Sub-folha de QoS da CPU definida pela Intel, nível de CPUID 0x0000000F: 0 (edx)

  • cqm_llc: LLC QoS

Sub-folha de QoS da CPU definida pela Intel, nível de CPUID 0x0000000F: 1 (edx)

  • cqm_occup_llc: Monitoramento de ocupação LLC
  • cqm_mbm_total: Monitoramento total de MBM da LLC
  • cqm_mbm_local: Monitoramento MBM local da LLC

Recursos de CPU definidos pela AMD, nível de CPUID 0x80000008 (ebx)

  • clzero: CLZEROinstrução
  • irperf: instruções aposentado contador de desempenho
  • xsaveerptr: Sempre salve / restaure indicadores de erro FP

Folha Gerenciamento térmico e de energia, nível de CPUID 0x00000006 (eax)

  • dtherm(anteriormente dts): sensor térmico digital
  • ida: Aceleração dinâmica da Intel
  • arat: Sempre executando o temporizador APIC
  • pln: Notificação do limite de energia da Intel
  • pts: Status térmico do pacote Intel
  • hwp: P-estados da Intel Hardware
  • hwp_notify: Notificação de HWP
  • hwp_act_window: Janela de Atividade HWP
  • hwp_epp: Preferência de desempenho energético de HWP
  • hwp_pkg_req: Solicitação no nível do pacote HWP

Identificação de recurso AMD SVM, nível de CPUID 0x8000000a (edx)

  • npt: Suporte à tabela de páginas aninhadas da AMD
  • lbrv: Suporte à virtualização AMD LBR
  • svm_lock: AMD SVM travando MSR
  • nrip_save: AMD SVM next_rip salvar
  • tsc_scale: Suporte à escala AMD TSC
  • vmcb_clean: Suporte a bits limpos do AMD VMCB
  • flushbyasid: Suporte AMD flush-by-ASID
  • decodeassists: Suporte à decodificação AMD
  • pausefilter: Interceptação de pausa filtrada da AMD
  • pfthreshold: Limite do filtro de pausa da AMD
  • avic: Controlador de interrupção virtual
  • vmsave_vmload: Virtual VMSAVE VMLOAD
  • vgif: GIF virtual

Recursos de CPU definidos pela Intel, nível de CPUID 0x00000007: 0 (ecx)

  • avx512vbmi: Instruções de manipulação de bits de vetor AVX512
  • umip: Proteção de instruções no modo de usuário
  • pku: Chaves de proteção para o espaço do usuário
  • ospke: Chaves de proteção do SO ativadas
  • avx512_vbmi2: Instruções adicionais sobre manipulação de bits de vetor AVX512
  • gfni: Novas instruções do campo de Galois
  • vaes: Vetor AES
  • vpclmulqdq: Multiplicação sem carga Quadword duplo
  • avx512_vnni: Instruções de rede neural vetorial
  • avx512_bitalg: Instruções VPOPCNT [B, W] e VPSHUF-BITQMB
  • avx512_vpopcntdq: POPCNT para vetores de DW / QW
  • la57: Tabelas de páginas de 5 níveis
  • rdpid: Instrução RDPID

Recursos de CPU definidos pela AMD, nível de CPUID 0x80000007 (ebx)

  • overflow_recov: Suporte à recuperação de estouro de MCA
  • succor: Contenção e recuperação incorreta de erros
  • smca: MCA escalável

Erros de CPU detectados (definidos pelo 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 ruim aka 11AP
  • fxsave_leak: FXSAVE vaza FOP / FIP / FOP
  • clflush_monitor: AAI65, CLFLUSH necessário antes do MONITOR
  • sysret_ss_attrs: SYSRET não corrige atributos de SS
  • espfix: "" O IRET para SS de 16 bits corrompe os bits altos do ESP / RSP
  • null_seg: Anular um seletor preserva a base
  • swapgs_fence: SWAPGS sem dep de entrada no GS
  • monitor: IPI necessário para ativar a CPU remota
  • amd_e400: CPU está entre os afetados pelo Erratum 400
  • cpu_meltdown: CPU é afetada por ataque de colapso e precisa de isolamento da tabela de páginas do kernel
  • spectre_v1: CPU é afetado por Specter variante 1 ataque com desvios condicionais
  • spectre_v2: CPU é afetada pelo ataque da variante 2 do Spectre com ramificações indiretas
  • spec_store_bypass: A CPU é afetada pela vulnerabilidade de desvio de armazenamento especulativo (variação 4 do espectro).

PS Esta listagem foi derivada da arch/x86/include/asm/cpufeatures.hfonte do kernel. Os sinalizadores são listados na mesma ordem que o código-fonte. Por favor, ajude adicionando links às descrições dos recursos em falta, escrevendo uma breve descrição dos recursos com nomes inexpressivos e atualizando a lista para novas versões do kernel. A lista atual é do Linux 4.15, além de algumas adições posteriores.

Gilles
fonte
1
Obrigado @Gilles e editores por uma pergunta informativa e sua resposta resumida e detalhada. Agora, para verificar qualquer capacidade CPU, eu uso o seguinte tirada NixCraft, por exemplo, para CPUs Intel: $ egrep -wo ^flags|vmx|ept|vpid|npt|tpr_shadow|flexpriority|vnmi|lm|aes' /proc/cpuinfo --color | sort -u. E também há o excelente i-nex da CLI / GUI .
tuk0z
Excelente coleção de explicações e links; Obrigado a todos que contribuíram.
Paul Engrenagem
De onde vieram os dados dos bugs? Não parece estar listado no arquivo cpufeatures.h.
Drazisil
@Drazisil Tanto quanto me lembro, todas as entradas são da versão indicada cpufeatures.h. As descrições são editadas para torná-las mais compreensíveis e mais informativas onde alguém se esforçou para fazer isso.
Gilles
@ Gilles Esse parece ser o caso de todos, exceto dos bugs. Deixando de lado que não são features, não os vejo nesse arquivo.
21318 Drazisil
71

BRAÇO

Nos processadores ARM, alguns recursos são mencionados na features:linha. Somente os recursos diretamente relacionados à arquitetura do ARM são mencionados aqui, não os específicos de um fabricante de silício ou de um sistema no chip.

Os recursos são obtidos consultando o ID da CPU read_cpuid()e nas definições de tipo de processador conhecidas no momento da compilação, onde os recursos são expressos como uma máscara de HWCAP_xxxsinalizadores. As cadeias correspondentes estão em hwcap_stretc. emsetup.c .

Na lista abaixo, o ARMv6 introduziu instruções e tipos de dados SIMD. O ARMv7 forneceu instruções e tipos de dados SIMD avançados. Em máquinas ARM de 32 bits, neonsinaliza SIMD avançado; enquanto asimdsinaliza SIMD avançado em máquinas de braço de 64 bits.

Além disso, a Hardware:linha indica o modelo do processador. Dependendo do modelo, pode haver outras informações em outros arquivos em /procou /sys, ou em mensagens de log do kernel no momento da inicialização. Infelizmente, cada fabricante de CPU ARM possui seu próprio método para relatar os recursos do processador, se houver.

Gilles
fonte
11

x86

Encontre você mesmo no 4.1.3 x86 e no manual da Intel

arch/x86/include/asm/cpufeature.h contém a lista completa.

Os valores definidos são do tipo:

X*32 + Y

Por exemplo:

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

Os sinalizadores de recursos, extraídos do CPUID, são armazenados dentro de:

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

que é inicializado através de __initfunções.

De onde x86_capabilityvem cada elemento da 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:

Conclusões:

  • a maioria das entradas vem diretamente dos registros de saída CPUID e são definidas common.cpor algo como:

    c->x86_capability[0] = edx;
    

    É fácil encontrá-los em lote no manual da Intel para CPUID.

  • os outros estão espalhados pela fonte e são definidos pouco a pouco com set_cpu_cap.

    Para encontrá-los, use git grep X86_FEATURE_XXXdentro arch/x86.

    Geralmente, você pode deduzir a qual bit CPUID eles correspondem no código ao redor.

Outros fatos divertidos

  • As bandeiras são realmente impressas arch/x86/kernel/cpu/proc.ccom o 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]);
    

    Onde:

    • cpu_has faz a verificação principal do recurso.
    • x86_cap_flags[i] contém cadeias que correspondem a cada sinalizadores.

    Isso é passado como retorno de chamada para a procconfiguração do sistema. O ponto de entrada é em fs/proc/cpuinfo.c.

  • x86_cap_flagsseqüências de caracteres são geradas arch/x86/kernel/cpu/mkcapflags.hdiretamente de arch/x86/include/asm/cpufeature.h"analisando" com sed...

    A saída vai para arch/x86/kernel/cpu/capflags.co diretório de construção e a matriz resultante se parece com:

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

    assim, por exemplo, X86_FEATURE_FPUcorresponde à string "fpu"e assim por diante.

  • cpu_has divide-se em dois casos com código:

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

    Eles são:

    • __builtin_constant_p(bit) && REQUIRED_MASK_BIT_SET(bit): o sinalizador é necessário para a execução do kernel.

      Isso é determinado pelos dados internos required-features.h, que comentam:

      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 esses são conhecidos no momento da compilação (requisitos do kernel), já foram verificados na inicialização, a verificação pode ser resolvida no momento da compilação, se bitfor conhecida no momento da compilação.

      Assim, o __builtin_constant_p(bit)que verifica se bité uma constante de tempo de compilação.

    • test_cpu_cap: isso usa CPUIDdados do struct cpuinfo_x86 boot_cpu_dataglobal

Ciro Santilli adicionou uma nova foto
fonte
3
Você explicou como passar da abreviação para um nome mais longo, mas geralmente esse nome mais longo não é muito mais compreensível e o cpuidfaz de uma maneira mais conveniente. Fiz essa pergunta para ter um lugar onde os nomes estão documentados.
Gilles
@Gilles isso é principalmente para quem quer fazer as tabelas / não consegue encontrar seus recursos na tabela, como eu :-) Mas ainda assim, na maioria dos casos, quando você olha para o ponto certo da fonte, o mapa para CPUID é imediato.
Ciro Santilli新疆改造中心法轮功六四事件
10

Ou, alternativamente, você pode usar o cpuidprograma, ele deve estar no repositório debian. Ele despeja todas as informações possíveis sobre sua CPU com algumas explicações, para que você não receba esses sinalizadores obscuros.

hurufu
fonte
cpuidexpande as abreviações. Eu realmente não chamaria suas explicações de saída . Saber que htsignifica "Hyper Threading" explica até certo ponto, mas saber que mmxsignifica "conjunto de instruções MMX", nem tanto, e que mcasignifica "Machine Check Architecture", dificilmente.
Gilles
6
@Gilles ... e, no entanto, "Machine Check Architecture" é certamente melhor consulta Google do que "MCA";)
Alois Mahdal