Linux上的32位,64位CPU操作模式


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说我的CPU可以在64位模式下运行的兴趣更强;显然,这并不意味着我可以运行64位程序。谁能澄清?


能否共享的输出 cat /proc/cpu,我想在启动时可以选择是否要在64位或32位模式下启动
Raza

1
您使用的是32位操作系统还是64位操作系统?
雷南

@Salton我有一个/proc/cpuinfo。但这提出了更多奇怪的问题。这些*_lm标志表示我的两个处理器都支持长模式,但是地址大小为“ 36位物理”
Zak,

Answers:


32

lscpu告诉您您的架构是i686(Intel 32位CPU),并且您的CPU支持32位和64位操作模式。您将无法安装x64构建的应用程序,因为它们是专门为x64体系结构构建的。

您的特定CPU可以处理i386或i686内置软件包。有多种方法可以验证您的体系结构和操作系统首选项。

lscpu

您已经知道,可以使用命令lscpu。它可以很好地让您大致了解CPU的功能。

$ 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用于显示)。我发现此输出有点不错,因为它向您显示了有关特定CPU的型号信息。它还会为您显示CPU可能具有的每个内核的一部分。

这是单核的输出:

$ 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还可以通过显示的各种标志告诉您CPU提供的体系结构类型。请注意上述命令中的这些行:

$ 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位的另一个名称。

ame

此命令可用于确定构建内核以支持的平台。例如:

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。您可以archcoreutils文档中阅读有关该命令的更多信息。

摘抄

arch打印机器硬件名称,等效于'uname -m'。

资讯网

可能是分析硬件的最佳工具 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

这可能是告诉您的CPU向OS展示哪种体系结构的最明显的方法。利用getconf,您查询系统变量LONG_BIT。这不是环境变量。

# 64-bit system
$ getconf LONG_BIT
64

# 32-bit system
$ getconf LONG_BIT
32

sh

另一个工具,功能类似于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

CPU操作模式?

一些命令报告说,看起来像32位CPU支持32位和64位模式。这可能会造成一些混乱和误导,但是如果您了解CPU的历史(特别是Intel),就会知道他们有使用其产品玩游戏的历史,其中CPU的指令集可能支持16位,但可以处理2 ^ 16以上的RAM。

这些CPU发生了同样的事情。大多数人都知道32位CPU只能寻址2 ^ 32 = 4GB RAM。但是有些版本的CPU可以解决更多问题。这些CPU通常会使用带有后缀PAE的Linux内核-物理地址扩展。将启用了PAE的内核与此硬件一起使用将允许您在32位系统上寻址多达64GB。

您可能会认为,然后为什么我需要64位体系结构?这些CPU的问题是单个进程空间限制为2 ^ 32,因此,如果您有一个大型仿真或计算程序,需要的RAM中的可寻址空间超过2 ^ 32,那么这对您没有帮助。接着就,随即。

看看P6微体系结构(i686)上的Wikipedia页面获取更多信息。

TL; DR-那么我的CPU架构到底是什么?

通常,由于上面的许多命令和方法正在松散地使用术语“体系结构”,因此可能会造成混淆。如果您对基础操作系统是32位还是64位感兴趣,请使用以下命令:

  • lscpu
  • getconf LONG_BIT
  • ame

另一方面,如果您想了解CPU的体系结构,请使用以下命令:

  • / proc / cpuinfo
  • 资讯网
  • sh

具体来说,如果您使用的是lshw,则需要查找显示“ width:64”或“ width:32”之类的字段,或者查找标志:

  • lm:长模式(x86-64:amd64,也称为Intel 64,即支持64位)
  • lahf_lm:长模式下的LAHF / SAHF

这两个标志的出现告诉您CPU是64位的。他们的缺席告诉您它是32位。

有关CPU标志的更多信息,请参见这些URL。

参考文献

手册页

文章:


您能解释一下为什么32位操作系统可以具有64位“ op-mode”吗?您的答案暗示它可以。
djangofan 2013年

没错 查看我的更新,如果有必要,请输入lmk。
slm

显然,这是一个很好的答案。非常感谢!英特尔玩游戏
Zak

因此,尽管要明确一点,但lscpu在“架构:i686”实际上是指运行32位OS方面有些误导。
扎克

1
仔细搜索这些信息,围绕这个特定主题有很多困惑。这个问题出现在很多SE网站上。这些站点上的许多答案也对此主题感到困惑。因此,这是尝试为该主题提供全面的答案,而不仅仅是回答OP的问题。
slm

4

如果您的内核是32位linux内核,则即使您的处理器支持,也将无法运行64位程序。

安装64位内核(当然还有整个操作系统)以运行64位


如果您的CPU支持VT-x / AMD-,则您仍可以在32个操作系统下使用Virtualbox / WMware等虚拟化软件使用64位程序。
m3nda 2015年

1

出于完整性考虑:由于在大多数64位体系结构上都可以在内核空间和用户空间中运行32位代码,因此请不要忘记实际上有4种可能的组合:

  • 32位内核上的32位用户空间
  • 64位内核上的64位用户空间
  • 64位内核上的32位用户空间
  • 两者上的64位内核64位和32位的用户空间(S)

uname是确定内核变体的常用方法。对于用户空间,file它非常擅长识别可执行文件:file $SHELL或者file /sbin/init是方便的习惯用法。两者 的存在/lib/*.so 并且 /lib64/*.so通常很好地表明该系统具有两种用户空间类型。


实际上有5个。第一个组合可以是“ ...在32位硬件上”或“ ...在64位硬件上”。其余3个需要64位硬件。
Ben Voigt

是的,我通过在大多数64位体系结构上进行编写隐式地考虑了64位硬件。
彼得2013年

0

要知道安装的Ubuntu是32位还是64位:

a)getconf LONG_BIT

b)ame -m

如果显示i686或i386,则表示32位。如果显示x86_64,则表示64位。

如果CPU为32位,则Ubuntu必须为32位。如果CPU是64位,则可以使用64位或32位。因此我们可以选择:Ubuntu可以是32位或64位。

要知道CPU是32位还是64位:

a)grep -w lm / proc / cpuinfo

如果我们看到红色的lm是64位。否则为32位。

b)须藤lshw | grep“描述:CPU” -A 12 | grep宽度

它清楚地说明了我们想知道的内容。

这两个信息的命令:

lscpu

我们只需要看一下输出的前两行:“ Architecture”告知已安装的Linux版本:“ i686”代表32位之一,而“ x86_64”代表64位之一。“ CPU op-mode(s)”通知有关CPU的信息。“ 32位”代表32位之一,而“ 32位,64位”或“ 64位”代表64位。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.