32-bitowy, 64-bitowy tryb operacyjny procesora w systemie Linux

15

Jestem zmieszany. Uruchamianie Fedory Linux lscpudaje:

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

Ale kiedy próbuję zainstalować program 64-bitowy (Chrome), pojawia się błąd:

Pakiet /....x86_64.rpm ma niezgodną architekturę x86_64. Prawidłowe architektury to [„i686”, „i586”, „i486”, i386 ”]

Jestem mniej zainteresowany instalacją Chrome, a bardziej interesuje mnie, dlaczego lscpumój procesor może działać w trybie 64-bitowym; najwyraźniej nie może to oznaczać, że mogę uruchamiać programy 64-bitowe. Czy ktoś może to wyjaśnić?

Zak
źródło
czy możesz udostępnić dane wyjściowe cat /proc/cpu, myślę, że przy rozruchu możesz wybrać, czy chcesz uruchomić w trybie 64 lub 32-bitowym
Raza
1
Czy używasz 32-bitowego systemu operacyjnego, czy 64-bitowego?
Renan
@Salton Mam /proc/cpuinfo. Rodzi to jednak bardziej ciekawe pytania. Te *_lmflagi wskazują oba moje procesory obsługują tryb długi, ale rozmiary adresowe są „36 bitów fizyczny” ..
Zak

Odpowiedzi:

32

lscpuinformuje, że twoja architektura to i686 (32-bitowy procesor Intel) i że twój procesor obsługuje tryby pracy 32-bitowy i 64-bitowy. Nie będziesz w stanie zainstalować aplikacji zbudowanych na x64, ponieważ są one zbudowane specjalnie dla architektur x64.

Twój konkretny procesor może obsłużyć pakiety wbudowane w i386 lub i686. Istnieje wiele sposobów weryfikacji preferencji dotyczących architektury i systemu operacyjnego.

lscpu

Jak już wiesz, możesz użyć polecenia lscpu. Działa dobrze, dając ogólne pojęcie o tym, do czego zdolny jest procesor.

$ 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

W rzeczywistości są to dane dostarczane przez jądro, które większość narzędzi, takich jak lscpuwyświetlanie, używa. Uważam, że to wyjście jest trochę miłe, ponieważ pokazuje pewne informacje o numerze modelu dotyczące konkretnego procesora. Pokaże także sekcję dla każdego rdzenia, który może mieć procesor.

Oto dane wyjściowe dla jednego rdzenia:

$ 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:

Oto jak wyglądają 3 pierwsze wiersze każdej sekcji rdzenia:

$ 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

Dane wyjściowe /proc/cpuinfomogą również wskazywać rodzaj architektury zapewnianej przez procesor poprzez różne flagi, które pokazuje. Zwróć uwagę na następujące wiersze powyższego polecenia:

$ 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

Flagi, które kończą się na, _lminformują, że twój procesor obsługuje „tryb długi”. Tryb długi to inna nazwa 64-bitowa.

uname

Za pomocą tego polecenia można ustalić, jaką platformę zbudowano dla jądra. Na przykład:

64-bitowe jądro

$ 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

Jądro 32-bitowe

$ 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

Wyjście to może być wyrafinowany kawałek dalej za pomocą przełączników, [-m|--machine], [-p|--processor], i [-i|--hardware-platform].

Oto dane wyjściowe dla tych samych powyższych systemów.

64-bitowy

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

32-bitowy

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

UWAGA: Istnieje również wersja short-form uname -m, które można uruchomić za pomocą polecenia samodzielnej, arch. Zwraca dokładnie to samo, co uname -m. Możesz przeczytać więcej o archpoleceniu w dokumentacji coreutils .

fragment

arch wypisuje nazwę sprzętową komputera i jest równoważne „uname -m”.

hwinfo

Prawdopodobnie musi to być najlepsze narzędzie do analizy twojego sprzętu hwinfo. Ten pakiet może pokazać prawie wszystko, co chcesz / musisz wiedzieć o dowolnym sprzęcie, bezpośrednio z terminala. Oszczędź mi dziesiątki razy, gdy potrzebuję trochę informacji z układu na płycie głównej systemu lub potrzebuję znać wersję płyty w gnieździe PCI.

Możesz wysłać zapytanie do różnych podsystemów komputera. W naszym przypadku przyjrzymy się cpupodsystemowi.

$ 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

Ponownie, podobne do /proc/cpuinfotego polecenia pokazuje skład każdego pojedynczego rdzenia w systemie wielordzeniowym. Oto pierwsza linia z każdej sekcji rdzenia, aby dać ci pomysł.

$ 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

Jest to prawdopodobnie najbardziej oczywisty sposób, aby powiedzieć, jaką architekturę procesor prezentuje systemowi operacyjnemu. Korzystając z getconfzapytania o zmienną systemową LONG_BIT. To nie jest zmienna środowiskowa.

# 64-bit system
$ getconf LONG_BIT
64

# 32-bit system
$ getconf LONG_BIT
32

lshw

Jeszcze jedno narzędzie, podobne pod względem możliwości do hwinfo. Możesz zapytać o wszystko, co chcesz wiedzieć o sprzęcie bazowym. Na przykład:

# 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

Tryby pracy procesora?

Kilka poleceń informuje, że coś, co wygląda na 32-bitowy procesor, obsługuje tryby 32-bitowe i 64-bitowe. Może to być trochę mylące i mylące, ale jeśli zrozumiesz historię procesorów, a konkretnie Intel, będziesz wiedział, że mają historię grania w gry z ich produktami, w których procesor może mieć zestaw instrukcji, który obsługuje 16-bitów, ale może zająć więcej pamięci RAM niż 2 ^ 16.

To samo dzieje się z tymi procesorami. Większość ludzi wie, że 32-bitowy procesor może obsłużyć tylko 2 ^ 32 = 4 GB pamięci RAM. Ale istnieją wersje procesorów, które mogą rozwiązać więcej. Te procesory często wykorzystują jądro Linuksa z sufiksem PAE - Physical Address Extension . Używanie jądra obsługującego PAE wraz z tym sprzętem pozwoli na adresowanie do 64 GB w systemie 32-bitowym.

Możesz pomyśleć, dlaczego potrzebuję architektury 64-bitowej? Problem z tymi procesorami polega na tym, że przestrzeń jednego procesu jest ograniczona do 2 ^ 32, więc jeśli masz duży program symulacyjny lub obliczeniowy, który potrzebował więcej niż 2 ^ 32 przestrzeni adresowalnej w pamięci RAM, to nie pomogłoby ci z tym.

Zobacz stronę wikipedii na mikroarchitekturze P6 (i686) .

TL; DR - Więc jaka jest architektura mojego procesora?

Zasadniczo może to być mylące, ponieważ w wielu powyższych poleceniach i metodach używa się luźno terminu „architektura”. Jeśli jesteś zainteresowany tym, czy podstawowy system operacyjny jest 32-bitowy czy 64-bitowy, użyj tych poleceń:

  • lscpu
  • getconf LONG_BIT
  • uname

Jeśli natomiast chcesz poznać architekturę procesora, użyj tych poleceń:

  • / proc / cpuinfo
  • hwinfo
  • lshw

W szczególności chcesz poszukać pól, w których jest napisane np. „Szerokość: 64” lub „szerokość: 32”, jeśli używasz takiego narzędzia lshw, lub poszukaj flag:

  • lm: Long Mode (x86-64: amd64, znany również jako Intel 64, czyli 64-bitowy)
  • lahf_lm: LAHF / SAHF w trybie długim

Prezentacja tych 2 flag informuje, że procesor jest 64-bitowy. Ich nieobecność informuje, że jest to wersja 32-bitowa.

Zobacz te adresy URL, aby uzyskać dodatkowe informacje na temat flag procesora.

Bibliografia

strony podręcznika

artykuły:

slm
źródło
Czy możesz wyjaśnić, dlaczego 32-bitowy system operacyjny może mieć 64-bitowy „tryb operacyjny”? Twoja odpowiedź sugeruje, że może.
djangofan
To jest poprawne. Zobacz moje aktualizacje, jeśli to ma sens.
slm
Wyraźnie świetna odpowiedź. Dzięki wielkie! Intel gra w gry
Zak
Jednak dla jasności lscpujest nieco mylące w tym, że „Architektura: i686” w rzeczywistości odnosi się do uruchamiania 32-bitowego systemu operacyjnego.
Zak
1
Poszukując tej informacji, wokół tego konkretnego tematu było wiele zamieszania. To pytanie pojawia się na wielu stronach SE. Wiele odpowiedzi na tych stronach było również zdezorientowanych na ten temat. Była to więc próba udzielenia kompleksowej odpowiedzi na ten temat, a nie tylko odpowiedź na pytanie PO.
slm
4

Jeśli twoje jądro jest 32-bitowym jądrem Linux-a, nie będziesz mógł uruchamiać programów 64-bitowych, nawet jeśli twój procesor to obsługuje.

Zainstaluj 64-bitowe jądro (i oczywiście cały system operacyjny), aby uruchomić 64-bitowe

ptr
źródło
Jeśli twój procesor obsługuje VT-x / AMD- nadal możesz korzystać z 64-bitowych programów w 32 OS za pomocą oprogramowania do wirtualizacji, takiego jak Virtualbox / WMware.
m3nda
1

Dla kompletności: ponieważ na większości architektur 64-bitowych możliwe jest uruchomienie kodu 32-bitowego, zarówno w przestrzeni jądra, jak i przestrzeni użytkownika, nie należy zapominać, że w rzeczywistości istnieją 4 możliwe kombinacje:

  • 32-bitowa przestrzeń użytkownika w 32-bitowym jądrze
  • 64-bitowa przestrzeń użytkownika w 64-bitowym jądrze
  • 32-bitowa przestrzeń użytkownika w 64-bitowym jądrze
  • zarówno 64-bitowego i 32-bitowej przestrzeni użytkownika (y), w jądrze 64-bitowym

unamejest zwykłym sposobem określania wariantu jądra. W przestrzeni użytkownika filejest całkiem dobry w rozpoznawaniu plików wykonywalnych: file $SHELLlub file /sbin/initsą wygodnymi idiomami. Samo istnienie obu /lib/*.so i /lib64/*.so zwykle jest dobrym wskazaniem, że system obsługuje oba warianty przestrzeni użytkownika.

Peter
źródło
Właściwie jest 5. Pierwszą kombinacją może być „... na sprzęcie 32-bitowym” lub „... na sprzęcie 64-bitowym”. Pozostałe 3 wymagają 64-bitowego sprzętu.
Ben Voigt
Tak, jakoś domyślnie rozważałem sprzęt 64-bitowy, pisząc na większości architektur 64-bitowych .
peterph
0

Aby wiedzieć, czy zainstalowany system Ubuntu ma 32 lub 64 bity:

a) getconf LONG_BIT

b) uname -m

Jeśli pokazuje i686 lub i386, oznacza to 32 bity. Jeśli pokazuje x86_64, oznacza to 64 bity.

Jeśli procesor ma 32 bity, Ubuntu musi mieć 32 bity. Jeśli procesor ma 64 bity, może pracować z 64 lub 32 bitami. Możemy więc wybrać: Ubuntu może mieć 32 bity lub 64 bity.

Aby wiedzieć, czy procesor ma 32 lub 64 bity:

a) grep -w lm / proc / cpuinfo

Jeśli widzimy, że lm na czerwono ma 64 bity. W przeciwnym razie ma 32 bity.

b) sudo lshw | grep "opis: CPU" -A 12 | szerokość grep

Mówi jasno, co chcemy wiedzieć.

Polecenie dla obu informacji:

lscpu

Wystarczy spojrzeć na pierwsze 2 wiersze wyniku: „Architektura” informuje o zainstalowanej wersji systemu Linux: „i686 ″ reprezentuje jeden z 32 bitów, podczas gdy„ x86_64 ″ oznacza 64-bitowy. „Tryb (y) operacji na procesorze” informuje o procesorze. „32-bit” oznacza jeden z 32 bitów, podczas gdy „32-bit, 64-bit” lub „64-bit” oznacza 64-bitowy.

Fasdiasi
źródło