Mode opérationnel CPU 32 bits, 64 bits sous Linux

15

Je suis confus. L'exécution de Fedora Linux lscpudonne:

Architecture:            i686
CPU op-mode(s):          32-bit, 64-bit
...

Mais lorsque j'essaie d'installer un programme 64 bits (Chrome), j'obtiens une erreur comme:

Le package /....x86_64.rpm a une architecture incompatible x86_64. Les architectures valides sont ['i686', 'i586', 'i486', i386 ']

Je suis moins intéressé à pouvoir installer Chrome et plus intéressé par la raison pour lscpulaquelle mon processeur peut fonctionner en mode 64 bits; clairement, cela ne signifie pas que je peux exécuter des programmes 64 bits. Quelqu'un peut-il clarifier?

Zak
la source
pouvez-vous partager la sortie de cat /proc/cpu, je pense qu'au démarrage, vous pouvez sélectionner si vous voulez démarrer en mode 64 ou 32 bits
Raza
1
Utilisez-vous un système d'exploitation 32 bits ou 64 bits?
Renan
@Salton j'en ai un /proc/cpuinfo. Mais cela soulève des questions plus curieuses. Les *_lmdrapeaux indiquent que mes deux processeurs prennent en charge le mode long, mais les tailles d'adresse sont "physiques 36 bits".
Zak

Réponses:

32

lscpuvous indique que votre architecture est i686 (un processeur Intel 32 bits) et que votre processeur prend en charge les modes de fonctionnement 32 bits et 64 bits. Vous ne pourrez pas installer d'applications construites x64 car elles sont conçues spécifiquement pour les architectures x64.

Votre processeur particulier peut gérer les packages intégrés i386 ou i686. Il existe plusieurs façons de vérifier vos préférences d'architecture et de système d'exploitation.

lscpu

Comme vous le savez déjà, vous pouvez utiliser la commande lscpu. Il fonctionne bien pour vous donner une idée approximative de ce dont votre processeur est capable.

$ lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
CPU(s):                4
Thread(s) per core:    2
Core(s) per socket:    2
CPU socket(s):         1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 37
Stepping:              5
CPU MHz:               1199.000
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              3072K
NUMA node0 CPU(s):     0-3

/ proc / cpuinfo

Il s'agit en fait des données fournies par le noyau que la plupart des outils tels que les lscpuutilisent pour afficher. Je trouve cette sortie un peu agréable dans le fait qu'elle vous montre des informations sur le numéro de modèle de votre processeur particulier. Il vous montrera également une section pour chaque cœur que votre processeur peut avoir.

Voici la sortie pour un seul cœur:

$ cat /proc/cpuinfo 
processor   : 0
vendor_id   : GenuineIntel
cpu family  : 6
model       : 37
model name  : Intel(R) Core(TM) i5 CPU       M 560  @ 2.67GHz
stepping    : 5
cpu MHz     : 1466.000
cache size  : 3072 KB
physical id : 0
siblings    : 4
core id     : 0
cpu cores   : 2
apicid      : 0
initial apicid  : 0
fpu     : yes
fpu_exception   : yes
cpuid level : 11
wp      : yes
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 rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm sse4_1 sse4_2 popcnt aes lahf_lm ida arat tpr_shadow vnmi flexpriority ept vpid
bogomips    : 5319.74
clflush size    : 64
cache_alignment : 64
address sizes   : 36 bits physical, 48 bits virtual
power management:

Voici à quoi ressemblent les 3 premières lignes de chaque section pour un noyau:

$ grep processor -A 3 /proc/cpuinfo
processor   : 0
vendor_id   : GenuineIntel
cpu family  : 6
model       : 37
--
processor   : 1
vendor_id   : GenuineIntel
cpu family  : 6
model       : 37
--
processor   : 2
vendor_id   : GenuineIntel
cpu family  : 6
model       : 37
--
processor   : 3
vendor_id   : GenuineIntel
cpu family  : 6
model       : 37

La sortie de /proc/cpuinfopeut également vous indiquer le type d'architecture que votre processeur fournit à travers les différents indicateurs qu'il affiche. Notez ces lignes de la commande ci-dessus:

$ grep /proc/cpuinfo | head -1
    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 rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm sse4_1 sse4_2 popcnt aes lahf_lm ida arat tpr_shadow vnmi flexpriority ept vpid

Les drapeaux qui se terminent par _lmvous indiquent que votre processeur prend en charge le "mode long". Le mode long est un autre nom pour 64 bits.

ton nom

Cette commande peut être utilisée pour déterminer quelle plateforme votre noyau a été conçu pour prendre en charge. Par exemple:

Noyau 64 bits

$ uname -a
Linux grinchy 2.6.35.14-106.fc14.x86_64 #1 SMP Wed Nov 23 13:07:52 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux

Noyau 32 bits

$ uname -a
Linux skinner.bubba.net 2.6.18-238.19.1.el5.centos.plus #1 SMP Mon Jul 18 10:07:01 EDT 2011 i686 i686 i386 GNU/Linux

Cette sortie peut être affiné un peu plus loin en utilisant les commutateurs, [-m|--machine], [-p|--processor]et [-i|--hardware-platform].

Voici cette sortie pour les mêmes systèmes ci-dessus.

64 bits

$ uname -m; uname -p; uname -i
x86_64
x86_64
x86_64

32 bits

$ uname -m; uname -p; uname -i
i686
i686
i386

NOTE: Il y a aussi une version abrégée de uname -mce que vous pouvez exécuter en tant que commande autonome, arch. Il renvoie exactement la même chose que uname -m. Vous pouvez en savoir plus sur la archcommande dans la documentation coreutils .

extrait

arch imprime le nom du matériel de la machine et équivaut à «uname -m».

hwinfo

Le meilleur outil pour analyser votre matériel doit probablement être hwinfo. Ce package peut vous montrer à peu près tout ce que vous voulez / devez savoir sur n'importe quel matériel, directement depuis le terminal. Cela me fait gagner des dizaines de fois lorsque j'aurais besoin d'informations sur une puce de la carte mère d'un système ou pour connaître la révision d'une carte dans un emplacement PCI.

Vous pouvez l'interroger sur les différents sous-systèmes d'un ordinateur. Dans notre cas, nous examinerons le cpusous - système.

$ hwinfo --cpu
01: None 00.0: 10103 CPU                                        
  [Created at cpu.301]
  Unique ID: rdCR.a2KaNXABdY4
  Hardware Class: cpu
  Arch: X86-64
  Vendor: "GenuineIntel"
  Model: 6.37.5 "Intel(R) Core(TM) i5 CPU       M 560  @ 2.67GHz"
  Features: 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,rdtscp,lm,constant_tsc,arch_perfmon,pebs,bts,rep_good,xtopology,nonstop_tsc,aperfmperf,pni,pclmulqdq,dtes64,monitor,ds_cpl,vmx,smx,est,tm2,ssse3,cx16,xtpr,pdcm,sse4_1,sse4_2,popcnt,aes,lahf_lm,ida,arat,tpr_shadow,vnmi,flexpriority,ept,vpid
  Clock: 2666 MHz
  BogoMips: 5319.74
  Cache: 3072 kb
  Units/Processor: 16
  Config Status: cfg=new, avail=yes, need=no, active=unknown

Encore une fois, semblable à /proc/cpuinfocette commande vous montre la composition de chaque cœur individuel dans un système multicœur. Voici la première ligne de chaque section d'un noyau, juste pour vous donner une idée.

$ hwinfo --cpu | grep CPU
01: None 00.0: 10103 CPU
  Model: 6.37.5 "Intel(R) Core(TM) i5 CPU       M 560  @ 2.67GHz"
02: None 01.0: 10103 CPU
  Model: 6.37.5 "Intel(R) Core(TM) i5 CPU       M 560  @ 2.67GHz"
03: None 02.0: 10103 CPU
  Model: 6.37.5 "Intel(R) Core(TM) i5 CPU       M 560  @ 2.67GHz"
04: None 03.0: 10103 CPU
  Model: 6.37.5 "Intel(R) Core(TM) i5 CPU       M 560  @ 2.67GHz"

getconf

C'est probablement le moyen le plus évident de savoir quelle architecture votre processeur présente au système d'exploitation. En utilisant getconf, votre requête sur la variable système LONG_BIT. Ce n'est pas une variable d'environnement.

# 64-bit system
$ getconf LONG_BIT
64

# 32-bit system
$ getconf LONG_BIT
32

lshw

Encore un autre outil, similaire en capacités à hwinfo. Vous pouvez interroger à peu près tout ce que vous voulez savoir sur le matériel sous-jacent. Par exemple:

# 64-bit Kernel
$ lshw -class cpu
  *-cpu                   
   description: CPU
   product: Intel(R) Core(TM) i5 CPU       M 560  @ 2.67GHz
   vendor: Intel Corp.
   physical id: 6
   bus info: cpu@0
   version: Intel(R) Core(TM) i5 CPU       M 560  @ 2.67GHz
   slot: None
   size: 1199MHz
   capacity: 1199MHz
   width: 64 bits
   clock: 133MHz
   capabilities: fpu fpu_exception wp 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 rdtscp x86-64 constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm sse4_1 sse4_2 popcnt aes lahf_lm ida arat tpr_shadow vnmi flexpriority ept vpid cpufreq
   configuration: cores=2 enabledcores=2 threads=4


# 32-bit Kernel
$ lshw -class cpu
  *-cpu:0
   description: CPU
   product: Intel(R) Core(TM)2 CPU          4300  @ 1.80GHz
   vendor: Intel Corp.
   physical id: 400
   bus info: cpu@0
   version: 6.15.2
   serial: 0000-06F2-0000-0000-0000-0000
   slot: Microprocessor
   size: 1800MHz
   width: 64 bits
   clock: 800MHz
   capabilities: boot fpu fpu_exception wp vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe x86-64 constant_tsc pni monitor ds_cpl est tm2 ssse3 cx16 xtpr lahf_lm
   configuration: id=1
 *-logicalcpu:0
      description: Logical CPU
      physical id: 1.1
      width: 64 bits
      capabilities: logical
 *-logicalcpu:1
      description: Logical CPU
      physical id: 1.2
      width: 64 bits
      capabilities: logical

Mode (s) opérationnel (s) du processeur?

Plusieurs commandes signalent que ce qui semble être un processeur 32 bits prend en charge les modes 32 bits et 64 bits. Cela peut être un peu déroutant et trompeur, mais si vous comprenez l'historique des processeurs, Intel en particulier, vous saurez qu'ils ont un historique de jeux avec leurs produits où un processeur peut avoir un jeu d'instructions qui prend en charge 16 bits, mais peut traiter plus de RAM que 2 ^ 16.

La même chose se passe avec ces processeurs. La plupart des gens savent qu'un processeur 32 bits ne peut traiter que 2 ^ 32 = 4 Go de RAM. Mais il existe des versions de CPU qui peuvent en traiter davantage. Ces CPU utiliseraient souvent un noyau Linux avec le suffixe PAE - Physical Address Extension . L'utilisation d'un noyau compatible PAE avec ce matériel vous permettrait d'adresser jusqu'à 64 Go sur un système 32 bits.

Vous pourriez bien penser alors pourquoi ai-je besoin d'une architecture 64 bits? Le problème avec ces processeurs est qu'un espace de processus unique est limité à 2 ^ 32, donc si vous avez un grand programme de simulation ou de calcul qui nécessitait plus que les 2 ^ 32 d'espace adressable en RAM, cela ne vous aurait pas aidé avec ça.

Jetez un œil à la page wikipedia sur la microarchitecture P6 (i686) pour plus d'informations.

TL; DR - Alors, quelle est l'architecture de mon processeur?

En général, cela peut prêter à confusion car un certain nombre des commandes et des méthodologies ci-dessus utilisent le terme «architecture» de manière lâche. Si vous souhaitez savoir si le système d'exploitation sous-jacent est 32 bits ou 64 bits, utilisez ces commandes:

  • lscpu
  • getconf LONG_BIT
  • ton nom

Si par contre vous souhaitez connaître l'architecture du CPU, utilisez ces commandes:

  • / proc / cpuinfo
  • hwinfo
  • lshw

Plus précisément, vous souhaitez rechercher des champs où il indique des choses comme "largeur: 64" ou "largeur: 32" si vous utilisez un outil comme lshw, ou recherchez les indicateurs:

  • lm: Mode long (x86-64: amd64, également appelé Intel 64, c'est-à-dire capable 64 bits)
  • lahf_lm: LAHF / SAHF en mode long

Les présents de ces 2 drapeaux vous indiquent que le CPU est 64 bits. Leurs absences vous indiquent que c'est 32 bits.

Consultez ces URL pour plus d'informations sur les drapeaux CPU.

Les références

pages de manuel

des articles:

slm
la source
Pouvez-vous expliquer pourquoi un système d'exploitation 32 bits peut avoir un "mode op" 64 bits? Votre réponse implique que oui.
djangofan
C'est correct. Voir mes mises à jour, lmk si cela a du sens.
slm
Clairement une excellente réponse. Merci beaucoup! Intel joue à des jeux
Zak
Donc, pour être clair, lscpuc'est quelque peu trompeur dans la mesure où "Architecture: i686" fait référence à l'exécution d'un système d'exploitation 32 bits.
Zak
1
En recherchant ces informations, il y avait beaucoup de confusion autour de ce sujet particulier. Cette question apparaît sur de nombreux sites SE. Beaucoup de réponses sur ces sites étaient également confuses à ce sujet. Il s'agissait donc d'une tentative pour essayer de fournir une réponse globale au sujet, et pas seulement pour répondre à la question du PO.
slm
4

Si votre noyau est un noyau Linux 32 bits, vous ne pourrez pas exécuter de programmes 64 bits, même si votre processeur le prend en charge.

Installez un noyau 64 bits (et tout le système d'exploitation bien sûr) pour exécuter 64 bits

ptr
la source
Si votre processeur prend en charge VT-x / AMD, vous pouvez toujours utiliser des programmes 64 bits sous un système d'exploitation 32 en utilisant un logiciel de virtualisation comme Virtualbox / WMware.
m3nda
1

Pour être complet: étant donné que sur la plupart des architectures 64 bits, il est possible d'exécuter du code 32 bits, à la fois dans l'espace noyau et dans l'espace utilisateur, il ne faut pas oublier qu'il existe en fait 4 combinaisons possibles:

  • Espace utilisateur 32 bits sur un noyau 32 bits
  • Espace utilisateur 64 bits sur un noyau 64 bits
  • Espace utilisateur 32 bits sur un noyau 64 bits
  • à la fois 64 bits et l' espace utilisateur 32 bits (s) sur un noyau 64 bits

unameest la manière habituelle de déterminer la variante du noyau. Pour l'espace utilisateur, fileest assez bon pour reconnaître les exécutables: file $SHELLou file /sbin/initsont des idiomes pratiques. L'existence des deux /lib/*.so et /lib64/*.so est généralement une bonne indication, que le système arbore les deux variantes d'espace utilisateur.

peterph
la source
En fait, il y en a 5. La première combinaison peut être "... sur du matériel 32 bits" ou "... sur du matériel 64 bits". Les 3 autres nécessitent un matériel 64 bits.
Ben Voigt
Oui, j'ai en quelque sorte considéré le matériel 64 bits implicitement en écrivant sur la plupart des architectures 64 bits .
peterph
0

Pour savoir si Ubuntu installé est de 32 ou 64 bits:

a) getconf LONG_BIT

b) uname -m

S'il affiche i686 ou i386, cela signifie 32 bits. S'il affiche x86_64, cela signifie 64 bits.

Si le CPU est de 32 bits, Ubuntu doit être de 32 bits. Si le CPU est de 64 bits, il peut fonctionner en 64 ou 32 bits. On peut donc choisir: Ubuntu peut être de 32 bits ou de 64 bits.

Pour savoir si le CPU est de 32 ou 64 bits:

a) grep -w lm / proc / cpuinfo

Si nous voyons lm en rouge est de 64 bits. Sinon, il est de 32 bits.

b) sudo lshw | grep "description: CPU" -A 12 | largeur de grep

Cela dit clairement ce que nous voulons savoir.

Une commande pour les deux infos:

lscpu

Il suffit de jeter un œil aux 2 premières lignes de la sortie: «Architecture» renseigne sur la version Linux installée: «i686» représente l'un des 32 bits, tandis que «x86_64» signifie 64 bits. «CPU op-mode (s)» informe sur le CPU. «32 bits» représente l'un des 32 bits, tandis que «32 bits, 64 bits» ou «64 bits» représente un 64 bits.

Fasdiasi
la source