32-битный, 64-битный режим работы процессора в Linux

15

Я не совсем понимаю. Запуск Fedora Linux lscpuдает:

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

Но когда я пытаюсь установить 64-битную программу (Chrome), я получаю сообщение об ошибке:

Пакет /....x86_64.rpm имеет несовместимую архитектуру x86_64. Допустимые архитектуры: ['i686', 'i586', 'i486', i386 ']

Меня меньше интересует возможность установки Chrome и больше интересует, почему lscpuговорится, что мой процессор может работать в 64-битном режиме; очевидно, это не значит, что я могу запускать 64-битные программы. Кто-нибудь может уточнить?

Zak
источник
Вы можете поделиться выводом cat /proc/cpu, я думаю, при загрузке вы можете выбрать, хотите ли вы загружаться в 64 или 32-битном режиме
Raza
1
Вы используете 32-битную ОС или 64-битную?
Ренан
@ Сэлтон у меня есть /proc/cpuinfo. Но это поднимает более любопытные вопросы. Эти *_lmфлаги указывают обе мои процессоры поддерживают длительный режим, но размеры адрес являются «36 бит физического,» ..
Заку

Ответы:

32

lscpuговорит вам, что ваша архитектура i686 (32-разрядный процессор Intel), и что ваш процессор поддерживает как 32-разрядный, так и 64-разрядный режимы работы. Вы не сможете установить x64-приложения, поскольку они созданы специально для x64-архитектур.

Ваш конкретный процессор может работать со встроенными пакетами i386 или i686. Есть несколько способов проверить вашу архитектуру и настройки ОС.

lscpu

Как вы уже знаете, вы можете использовать команду lscpu. Он хорошо дает вам приблизительное представление о том, на что способен ваш процессор.

$ 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

На самом деле это данные, предоставляемые ядром, которые большинство инструментов, например, lscpuиспользуют для отображения. Я нахожу этот вывод немного приятным в том, что он показывает некоторую информацию о номере модели вашего конкретного процессора. Также он покажет вам раздел для каждого ядра, которое может иметь ваш процессор.

Вот вывод для одного ядра:

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

Вот как выглядят первые 3 строки каждого раздела для ядра:

$ 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

Выходные данные /proc/cpuinfoтакже могут сказать вам тип архитектуры, которую ваш процессор предоставляет через различные флаги, которые он показывает. Обратите внимание на эти строки из приведенной выше команды:

$ 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

Флаги, заканчивающиеся на, _lmговорят вам, что ваш процессор поддерживает «длинный режим». Длинный режим - это другое название для 64-битного.

uname

Эта команда может использоваться, чтобы определить, какую платформу поддерживает ваше ядро. Например:

64-битное ядро

$ 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

32-битное ядро

$ 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

Этот выход может быть уточнен немного дальше с помощью переключателей, [-m|--machine], [-p|--processor], и [-i|--hardware-platform].

Вот этот вывод для тех же систем выше.

64-битный

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

32-битный

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

ПРИМЕЧАНИЕ. Существует также краткая версия, uname -mкоторую вы можете запустить как отдельную команду arch. Возвращает точно так же, как uname -m. Вы можете прочитать больше о archкоманде в документации coreutils .

выдержка

arch выводит имя оборудования машины и эквивалентно 'uname -m'.

HWiNFO

Наверное, лучший инструмент для анализа вашего оборудования должен быть hwinfo. Этот пакет может показать вам практически все, что вы хотите / должны знать о любом из ваших аппаратных средств, прямо с терминала. Это спасло меня в десятки раз, когда мне понадобилась бы некоторая информация о чипе на материнской плате системы или мне нужно было узнать ревизию платы в слоте PCI.

Вы можете запросить его в отношении различных подсистем компьютера. В нашем случае мы будем смотреть на cpuподсистему.

$ 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

Опять же, аналогично /proc/cpuinfoэтой команде показывает состав каждого отдельного ядра в многоядерной системе. Вот первая строка из каждого раздела ядра, просто чтобы дать вам представление.

$ 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

Это, вероятно, самый очевидный способ сказать, какую архитектуру ваш процессор представляет ОС. Используя getconfваш запрос к системной переменной LONG_BIT. Это не переменная окружения.

# 64-bit system
$ getconf LONG_BIT
64

# 32-bit system
$ getconf LONG_BIT
32

lshw

Еще один инструмент, похожий по возможностям на hwinfo. Вы можете запросить практически все, что вы хотите знать о базовом оборудовании. Например:

# 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

Операционные режимы процессора?

Некоторые из команд сообщают, что 32-разрядный процессор поддерживает 32-разрядный и 64-разрядный режимы. Это может немного сбивать с толку и вводить в заблуждение, но если вы понимаете историю процессоров, в частности Intel, вы будете знать, что у них есть история игр с их продуктами, где процессор может иметь набор инструкций, который поддерживает 16-битные но может адресовать больше оперативной памяти, чем 2 ^ 16.

То же самое происходит с этими процессорами. Большинство людей знают, что 32-разрядный процессор может адресовать только 2 ^ 32 = 4 ГБ оперативной памяти. Но есть версии процессоров, которые могут адресовать больше. Эти процессоры часто используют ядро ​​Linux с суффиксом PAE - расширение физического адреса . Использование ядра с поддержкой PAE вместе с этим оборудованием позволит вам адресовать до 64 ГБ в 32-битной системе.

Тогда вы можете подумать, зачем мне 64-битная архитектура? Проблема с этими процессорами заключается в том, что пространство одного процесса ограничено 2 ^ 32, поэтому, если у вас есть большая имитационная или вычислительная программа, которой требуется больше 2 ^ 32 адресуемого пространства в ОЗУ, то это не помогло бы вам с этим.

Взгляните на страницу википедии по микроархитектуре P6 (i686) для получения дополнительной информации.

TL; DR - Так какого черта архитектура моего процессора?

В общем, это может сбить с толку, потому что ряд команд и методологий выше используют термин «архитектура» свободно. Если вас интересует, является ли базовая ОС 32-битной или 64-битной, используйте эти команды:

  • lscpu
  • getconf LONG_BIT
  • uname

Если, с другой стороны, вы хотите знать архитектуру процессора, используйте эти команды:

  • / Proc / CPUInfo
  • HWiNFO
  • lshw

В частности, вы хотите искать поля, в которых говорится что-то вроде «ширина: 64» или «ширина: 32», если вы используете инструмент, подобный lshw, или искать флаги:

  • lm: Длинный режим (x86-64: amd64, также известный как Intel 64, то есть 64-разрядный)
  • lahf_lm: LAHF / SAHF в длинном режиме

Присутствие этих двух флагов говорит о том, что процессор 64-битный. Их отсутствие говорит вам, что он 32-битный.

Посмотрите эти URL для получения дополнительной информации о флагах процессора.

Ссылки

страницы руководства

статьи:

SLM
источник
Можете ли вы объяснить, почему 32-битная ОС может иметь 64-битный «режим работы»? Ваш ответ подразумевает, что может.
Джангофан
Правильно. Смотрите мои обновления, lmk, если это имеет смысл.
SLM
Очевидно, отличный ответ. Спасибо! Intel играет в игры
Зак
Так что, чтобы быть ясным, lscpuэто несколько вводит в заблуждение, поскольку «архитектура: i686» на самом деле относится к запуску 32-разрядной ОС.
Зак
1
В поисках этой информации было много путаницы вокруг этой конкретной темы. Этот вопрос появляется на многих сайтах SE. Многие из ответов на этих сайтах также были озадачены этой темой. Так что это была попытка дать всеобъемлющий ответ на эту тему, а не просто ответить на вопрос ОП.
СЛМ
4

Если ваше ядро ​​является 32-битным ядром Linux, вы не сможете запускать 64-битные программы, даже если ваш процессор его поддерживает.

Установите 64-битное ядро ​​(и, конечно, всю ОС), чтобы запустить 64-битное

PTR
источник
Если ваш процессор поддерживает VT-x / AMD, вы все равно можете использовать 64-разрядные программы под 32-разрядной ОС, используя программное обеспечение для виртуализации, такое как Virtualbox / WMware.
m3nda
1

Для полноты: поскольку на большинстве 64-разрядных архитектур можно запускать 32-разрядный код как в пространстве ядра, так и в пространстве пользователя, не следует забывать, что на самом деле существует 4 возможных комбинации:

  • 32-разрядное пространство пользователя в 32-разрядном ядре
  • 64-разрядное пространство пользователя в 64-разрядном ядре
  • 32-разрядное пространство пользователя в 64-разрядном ядре
  • и 64-битные и 32-битное пространство (ы) пользователя на 64-битном ядре

unameэто обычный способ определения варианта ядра. Для пользовательского пространства fileдостаточно хорош для распознавания исполняемых файлов: file $SHELLили file /sbin/initявляются удобными идиомами. Просто наличие обоих /lib/*.so и /lib64/*.so обычно является хорошим показателем того, что система поддерживает оба варианта пространства пользователя.

peterph
источник
На самом деле их 5. Первая комбинация может быть "... на 32-битном оборудовании" или "... на 64-битном оборудовании". Остальные 3 требуют 64-битного оборудования.
Бен Фойгт
Да, я как-то неявно рассмотрел 64-битное оборудование, написав на большинстве 64-битных архитектур .
Петер
0

Чтобы узнать, установлен ли Ubuntu на 32 или 64 бита:

а) getconf LONG_BIT

б) uname -m

Если он показывает i686 или i386, это означает 32 бита. Если он показывает x86_64, это означает 64 бита.

Если процессор 32-битный, Ubuntu должен быть 32-битным. Если процессор имеет 64 бита, он может работать в 64 или 32 битах. Таким образом, мы можем выбрать: Ubuntu может иметь 32 или 64 бита.

Чтобы узнать, имеет ли процессор 32 или 64 бита:

а) grep -w lm / proc / cpuinfo

Если мы видим, что красный lm имеет 64 бита. В противном случае имеет 32 бита.

б) судо лшв | grep "описание: CPU" -A 12 | ширина grep

Это ясно говорит о том, что мы хотим знать.

Команда для обеих сведений:

lscpu

Нам просто нужно взглянуть на первые 2 строки вывода: «Architecture» сообщает об установленной версии Linux: «i686» представляет собой один из 32 битов, а «x86_64» - 64-битный. «CPU op-mode (s)» информирует о процессоре. «32-разрядный» представляет один из 32-разрядных, а «32-разрядный, 64-разрядный» или «64-разрядный» означает 64-разрядный.

Fasdiasi
источник