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/cpuinfo
contém essas informações, na flags
linha, 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
$ 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 .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.features
, não os vejo nesse arquivo.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 deHWCAP_xxx
sinalizadores. As cadeias correspondentes estão emhwcap_str
etc. 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,
neon
sinaliza SIMD avançado; enquantoasimd
sinaliza SIMD avançado em máquinas de braço de 64 bits.swp
:SWP
instrução ( leitura-modificação-gravação atômica )half
: Cargas e lojas de meia palavrathumb
: Thumb (conjunto de instruções de 16 bits)26bit
: Modelo "26 Bit" (registro de status do processador dobrado no contador do programa)fastmult
: 32 × 32 → multiplicação de 64 bitsfpa
: Acelerador de ponto flutuantevfp
: VFP ( instruções iniciais do ponto flutuante do vetor SIMD )edsp
: Extensões DSP (a variante 'e' das CPUs ARM9 e todas as outras acima)java
: Jazelle (acelerador de bytecode Java)iwmmxt
: Instruções SIMD semelhantes ao Intel MMXcrunch
: Coprocessador MaverickCrunch (se o suporte ao kernel estiver ativado)thumbee
: ThumbEEneon
: SIMD / NEON avançado (asimd
em kernels mais antigos do AArch64)vfpv3
: VFP versão 3vfpv3d16
: VFP versão 3 com 16 registros Dtls
: Registro TLSvfpv4
: VFP versão 4 com troca rápida de contextoidiva
:SDIV
eUDIV
divisão de hardware no modo ARMidivt
:SDIV
eUDIV
divisão de hardware no modo Thumbvfpd32
: VFP com 32 registros Dlpae
: Extensão de endereço físico grande (> 4 GB de memória física na arquitetura de 32 bits)evtstrm
: fluxo de eventos do kernel usando o cronômetro arquitetado genéricoaes
: AES acelerado por hardware (criptografia de chave secreta)pmull{2}
: 64 × 64 → multiplicação de F 2 m de 128 bits - aceleração para o modo GCM de criptografia autenticadasha1
: SHA-1 acelerado por hardwaresha2
: SHA-256 acelerado por hardwarecrc32
: CRC-32 acelerado por hardwareAlém disso, a
Hardware:
linha indica o modelo do processador. Dependendo do modelo, pode haver outras informações em outros arquivos em/proc
ou/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.fonte
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:
Por exemplo:
Os sinalizadores de recursos, extraídos do CPUID, são armazenados dentro de:
__u32 x86_capability[NCAPINTS + NBUGINTS];
campostruct cpuinfo_x86 boot_cpu_data
x86/kernel/setup.c
que é inicializado através de
__init
funções.De onde
x86_capability
vem cada elemento da matriz:Notas:
index
: é o índice dex86_capability
, por exemplox86_capability[0]
eax
eexc
: são os valores de entrada para CPUID em hexadecimal. As entradas que usamexc
, que são menos, chamam de sub - folha (de uma árvore de 2 níveis comeax
a raiz).output
: é o registro do qual a saída CPUID é obtidafile
: é o arquivo em que esses campos são definidos. Os caminhos são relativos aarch/x86/kernel/cpu/
.transmeta
: era o nome de um fornecedor de CPU https://en.wikipedia.org/wiki/Transmeta que foi adquirido pela Novafora https://www.crunchbase.com/organization/novaforacentaur
: era o nome de um fornecedor de CPU https://en.wikipedia.org/wiki/Centaur_Technology que foi adquirido pela VIA https://en.wikipedia.org/wiki/VIA_Technologies . Cyrix é outro.Conclusões:
a maioria das entradas vem diretamente dos registros de saída CPUID e são definidas
common.c
por algo como:É 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_XXX
dentroarch/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.c
com o código: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
proc
configuração do sistema. O ponto de entrada é emfs/proc/cpuinfo.c
.x86_cap_flags
seqüências de caracteres são geradasarch/x86/kernel/cpu/mkcapflags.h
diretamente dearch/x86/include/asm/cpufeature.h
"analisando" comsed
...A saída vai para
arch/x86/kernel/cpu/capflags.c
o diretório de construção e a matriz resultante se parece com:assim, por exemplo,
X86_FEATURE_FPU
corresponde à string"fpu"
e assim por diante.cpu_has
divide-se em dois casos com código: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: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
bit
for conhecida no momento da compilação.Assim, o
__builtin_constant_p(bit)
que verifica sebit
é uma constante de tempo de compilação.test_cpu_cap
: isso usaCPUID
dados dostruct cpuinfo_x86 boot_cpu_data
globalfonte
cpuid
faz de uma maneira mais conveniente. Fiz essa pergunta para ter um lugar onde os nomes estão documentados.Ou, alternativamente, você pode usar o
cpuid
programa, 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.fonte
cpuid
expande as abreviações. Eu realmente não chamaria suas explicações de saída . Saber queht
significa "Hyper Threading" explica até certo ponto, mas saber quemmx
significa "conjunto de instruções MMX", nem tanto, e quemca
significa "Machine Check Architecture", dificilmente.