¿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/cpuinfo
contiene esta información, en la flags
lí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
$ 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 .cpufeatures.h
. Las descripciones se editan para que sean más comprensibles y más informativas cuando alguien se esforzó por hacer eso.features
lo son, no los veo en ese archivo.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 deHWCAP_xxx
banderas. Las cadenas correspondientes están enhwcap_str
etc. 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,
neon
señales SIMD avanzadas; whileasimd
señala Advanced SIMD en máquinas de brazo de 64 bits.swp
:SWP
instrucción ( lectura-modificación-escritura atómica )half
: Cargas y tiendas de media palabrathumb
: Pulgar (conjunto de instrucciones de 16 bits)26bit
: Modelo "26 bits" (registro de estado del procesador plegado en el contador del programa)fastmult
: 32 × 32 → multiplicación de 64 bitsfpa
: Acelerador de coma flotantevfp
: VFP ( instrucciones iniciales de punto flotante de vector SIMD )edsp
: Extensiones DSP (la variante 'e' de las CPU ARM9 y todas las demás anteriores)java
: Jazelle (acelerador de código de bytes Java)iwmmxt
: Instrucciones SIMD similares a Intel MMXcrunch
: Coprocesador MaverickCrunch (si el soporte del núcleo está habilitado)thumbee
: ThumbEEneon
: SIMD / NEON avanzado (asimd
en núcleos AArch64 más antiguos)vfpv3
: VFP versión 3vfpv3d16
: VFP versión 3 con 16 registros Dtls
: Registro TLSvfpv4
: VFP versión 4 con cambio rápido de contextoidiva
:SDIV
yUDIV
división de hardware en modo ARMidivt
:SDIV
yUDIV
división de hardware en modo Thumbvfpd32
: VFP con 32 registros Dlpae
: Ampliación de dirección física grande (> 4 GB de memoria física en arquitectura de 32 bits)evtstrm
: secuencia de eventos del kernel con temporizador genérico diseñadoaes
: AES acelerado por hardware (criptografía de clave secreta)pmull{2}
: 64 × 64 → 128 bits F 2 m multiplicación - aceleración para el modo GCM de cifrado autenticadosha1
: SHA-1 acelerado por hardwaresha2
: SHA-256 acelerado por hardwarecrc32
: CRC-32 acelerado por hardwareMá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/proc
o/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.fuente
x86
Encuéntrelo usted mismo en 4.1.3 x86 y el manual de Intel
arch/x86/include/asm/cpufeature.h
contiene la lista completaLos valores definidos son de tipo:
P.ej:
Las banderas de características, extraídas de CPUID, se almacenan dentro de:
__u32 x86_capability[NCAPINTS + NBUGINTS];
campostruct cpuinfo_x86 boot_cpu_data
x86/kernel/setup.c
que se inicializa a través de
__init
funciones.De dónde
x86_capability
proviene cada elemento de la matriz:Notas:
index
: es el índice dex86_capability
, p. ej.x86_capability[0]
eax
yexc
: son los valores de entrada para CPUID en hexadecimal. Las entradas que usanexc
, que son menos, lo llaman subleaf (de un árbol de 2 niveles coneax
en la raíz).output
: es el registro del que se toma la salida CPUIDfile
: es el archivo donde se definen esos campos. Los caminos son relativos aarch/x86/kernel/cpu/
.transmeta
: era el nombre de un proveedor de CPU https://en.wikipedia.org/wiki/Transmeta que fue adquirido por Novafora https://www.crunchbase.com/organization/novaforacentaur
: era el nombre de un proveedor de CPU https://en.wikipedia.org/wiki/Centaur_Technology que adquirió VIA https://en.wikipedia.org/wiki/VIA_Technologies . Cyrix es otro.Conclusiones:
la mayoría de las entradas provienen directamente de los registros de salida de CPUID y se configuran
common.c
mediante algo como: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_XXX
adentroarch/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.c
con el código: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
proc
configuración del sistema. El punto de entrada es enfs/proc/cpuinfo.c
.x86_cap_flags
las cadenas se generanarch/x86/kernel/cpu/mkcapflags.h
directamente desdearch/x86/include/asm/cpufeature.h
"analizándolas" consed
...El resultado va al
arch/x86/kernel/cpu/capflags.c
directorio de compilación y la matriz resultante se ve así:así, por ejemplo,
X86_FEATURE_FPU
corresponde a la cadena"fpu"
y así sucesivamente.cpu_has
se divide en dos casos con código: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: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
bit
se conoce en el momento de la compilación.Por lo tanto, el
__builtin_constant_p(bit)
que comprueba sibit
es una constante de tiempo de compilación.test_cpu_cap
: esto utilizaCPUID
datos delstruct cpuinfo_x86 boot_cpu_data
globalfuente
cpuid
hace de una manera más conveniente. Hice esa pregunta para tener un lugar donde los nombres estén documentados.O, alternativamente, puede usar el
cpuid
programa, 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.fuente
cpuid
expande las abreviaturas. Realmente no llamaría a sus explicaciones de salida . Saber esoht
significa "Hyper Threading" lo explica en cierta medida, pero saber quemmx
significa "conjunto de instrucciones MMX", no tanto, y esomca
significa "Arquitectura de verificación de máquina", apenas.