Comment savoir si mon processeur possède une fonctionnalité particulière? (Jeu d’instructions 64 bits, virtualisation assistée par matériel, accélérateurs cryptographiques, etc.) Je sais que le fichier /proc/cpuinfo
contient ces informations flags
, mais que signifient toutes ces abréviations cryptiques?
Par exemple, étant donné l'extrait suivant de /proc/cpuinfo
, ai-je un processeur 64 bits? Ai-je une virtualisation matérielle?
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
. Et il y a aussi l'excellent i-nex CLI / GUI .cpufeatures.h
. Les descriptions sont éditées pour les rendre plus compréhensibles et plus informatives lorsque quelqu'un a fait l'effort de le faire.features
je ne les vois pas dans ce dossier.BRAS
Sur les processeurs ARM, quelques fonctionnalités sont mentionnées dans la
features:
ligne. Seules les caractéristiques directement liées à l'architecture ARM y sont mentionnées, pas les caractéristiques propres à un fabricant de silicium ou à un système sur puce.Les fonctionnalités sont obtenues en recherchant l'ID de la CPU avec
read_cpuid()
et dans les définitions de type de processeur connues au moment de la compilation, où les fonctionnalités sont exprimées sous la forme d'un masque d'HWCAP_xxx
indicateurs. Les chaînes correspondantes sont danshwcap_str
etc. danssetup.c
.Dans la liste ci-dessous, ARMv6 a introduit les instructions SIMD et les types de données. ARMv7 a fourni des instructions SIMD avancées et des types de données. Sur les machines ARM 32 bits, les
neon
signaux Advanced SIMD; whileasimd
signale Advanced SIMD sur des machines à bras 64 bits.swp
:SWP
instruction ( lecture-modification-écriture atomique )half
: Charges et magasins à demi-motsthumb
: Thumb (jeu d'instructions 16 bits)26bit
: Modèle "26 bits" (registre d'état du processeur replié dans le compteur de programme)fastmult
: Multiplication 32 × 32 → 64 bitsfpa
: Accélérateur à virgule flottantevfp
: VFP (premières instructions de virgule flottante vectorielles SIMD )edsp
: Extensions DSP (la variante 'e' des CPU ARM9 et toutes les autres ci-dessus)java
: Jazelle (accélérateur de bytecode Java)iwmmxt
: Instructions SIMD similaires à Intel MMXcrunch
: Coprocesseur MaverickCrunch (si la prise en charge du noyau est activée)thumbee
: ThumbEEneon
: SIMD / NEON avancé (asimd
sur les noyaux anciens AArch64)vfpv3
: VFP version 3vfpv3d16
: VFP version 3 avec 16 registres Dtls
: Registre TLSvfpv4
: VFP version 4 avec changement rapide de contexteidiva
:SDIV
etUDIV
division du matériel en mode ARMidivt
:SDIV
etUDIV
division du matériel en mode Thumbvfpd32
: VFP avec 32 registres Dlpae
: Extension d'adresse physique volumineuse (> 4 Go de mémoire physique sur une architecture 32 bits)evtstrm
: flux d'événements du noyau utilisant un minuteur générique architecturéaes
: AES (cryptographie à clé secrète) à accélération matériellepmull{2}
: 64 × 64 → Multiplication F 2 m 128 bits - accélération pour le mode de chiffrement authentifié GCMsha1
: SHA-1 à accélération matériellesha2
: SHA-256 à accélération matériellecrc32
: CRC-32 à accélération matérielleAu-delà, la
Hardware:
ligne indique le modèle de processeur. Selon le modèle, il peut y avoir d'autres informations dans d'autres fichiers sous/proc
ou/sys
, ou dans les messages du journal du noyau au démarrage. Malheureusement, chaque fabricant de processeurs ARM dispose de sa propre méthode de génération de rapports sur les fonctionnalités du processeur, le cas échéant.la source
x86
Trouvez-le vous-même dans 4.1.3 x86 et le manuel Intel
arch/x86/include/asm/cpufeature.h
contient la liste complète.Les valeurs définies sont de type:
Par exemple:
Les indicateurs de caractéristiques, extraits de CPUID, sont stockés dans le:
__u32 x86_capability[NCAPINTS + NBUGINTS];
champstruct cpuinfo_x86 boot_cpu_data
x86/kernel/setup.c
qui est initialisé par des
__init
fonctions.D'où
x86_capability
provient chaque élément du tableau:Remarques:
index
: est l'indice dex86_capability
, par exemplex86_capability[0]
eax
etexc
: sont les valeurs d'entrée pour CPUID en hexadécimal. Les entrées qui utilisentexc
, qui sont moins nombreuses, l’appellent la sous- feuille (d’une arborescence à 2 niveaux aveceax
à la racine).output
: est le registre à partir duquel la sortie CPUID est prisefile
: est le fichier où ces champs sont définis. Les chemins sont relatifs àarch/x86/kernel/cpu/
.transmeta
: était le nom d'un fournisseur d'unité centrale https://en.wikipedia.org/wiki/Transmeta qui avait été acheté par Novafora https://www.crunchbase.com/organization/novaforacentaur
: était le nom d'un fournisseur d'unité centrale https://en.wikipedia.org/wiki/Centaur_Technology acquis par VIA https://en.wikipedia.org/wiki/VIA_Technologies . Cyrix est un autre.Conclusions:
la plupart des entrées proviennent directement des registres de sortie CPUID et sont définies
common.c
comme suit:Ceux-ci sont faciles à trouver en lot sur le manuel Intel pour CPUID.
les autres sont dispersés dans toute la source et sont définis petit à petit avec
set_cpu_cap
.Pour les trouver, utilisez à l'
git grep X86_FEATURE_XXX
intérieurarch/x86
.Vous pouvez généralement déduire à quel bit CPUID ils correspondent du code environnant.
Autres faits amusants
Les drapeaux sont réellement imprimés
arch/x86/kernel/cpu/proc.c
avec le code:Où:
cpu_has
fait la vérification principale pour la fonctionnalité.x86_cap_flags[i]
contient des chaînes qui correspondent à chaque drapeau.Ceci est transmis en tant que rappel à la
proc
configuration du système. Le point d'entrée est àfs/proc/cpuinfo.c
.x86_cap_flags
Les chaînes sont générées pararch/x86/kernel/cpu/mkcapflags.h
directement à partirarch/x86/include/asm/cpufeature.h
de "l'analyse" avecsed
...La sortie va dans
arch/x86/kernel/cpu/capflags.c
le répertoire de construction, et le tableau résultant ressemble à ceci:Ainsi, par exemple,
X86_FEATURE_FPU
correspond à la chaîne"fpu"
et ainsi de suite.cpu_has
se décompose en deux cas avec code:Elles sont:
__builtin_constant_p(bit) && REQUIRED_MASK_BIT_SET(bit)
: l'indicateur est requis pour que le noyau s'exécute.Ceci est déterminé par les données internes
required-features.h
, qui commentent:Étant donné que ceux-ci sont connus au moment de la compilation (configuration requise du noyau) et ont déjà été vérifiés au démarrage, le contrôle peut être résolu au moment de la compilation s'il
bit
est connu au moment de la compilation.Ainsi, le
__builtin_constant_p(bit)
qui vérifie sibit
est une constante de temps de compilation.test_cpu_cap
: cela utilise lesCPUID
données dustruct cpuinfo_x86 boot_cpu_data
mondela source
cpuid
fait d'une manière plus pratique. J'ai posé cette question pour avoir un endroit où les noms sont documentés.Ou bien vous pouvez utiliser le
cpuid
programme, il doit être dans le référentiel Debian. Il affiche toutes les informations possibles sur votre processeur avec quelques explications, afin que vous n'obteniez pas ces drapeaux obscurs.la source
cpuid
élargit les abréviations. Je n'appellerais pas vraiment ses explications de sortie . Savoir que celaht
signifie «Hyper Threading» explique cela dans une certaine mesure, mais sachant que celammx
signifie «ensemble d'instructions MMX», pas tellement, et celamca
signifie «Architecture de contrôle de machine», à peine.