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

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

我很困惑。运行 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 位程序。谁能澄清一下吗?

答案1

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/cpu信息

这实际上是内核提供的数据,大多数工具(如)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 位的另一个名称。

乌纳梅

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

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。该软件包可以直接从终端向您显示您想要/需要了解的有关任何硬件的几乎所有信息。当我需要系统主板上芯片的一些信息或需要了解 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"

获取配置文件

这可能是判断您的 CPU 向操作系统呈现的架构的最明显方式。使用getconf,您可以查询系统变量 LONG_BIT。这不是环境变量。

# 64-bit system
$ getconf LONG_BIT
64

# 32-bit system
$ getconf LONG_BIT
32

长沙

另一种工具,其功能与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 的历史,特别是英特尔,您就会知道他们有使用其产品玩游戏的历史,其中 CPU 可能具有支持 16 位的指令集,但可以寻址比 2^16 更多的 RAM。

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

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

看看维基百科页面P6 微架构 (i686)了解更多信息。

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

一般来说,它可能会令人困惑,因为上面的许多命令和方法都宽松地使用了术语“体系结构”。如果您对底层操作系统是 32 位还是 64 位感兴趣,请使用以下命令:

  • LSCPU
  • getconf LONG_BIT
  • 乌纳梅

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

  • /proc/cpu信息
  • 硬件信息
  • 长沙

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

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

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

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

参考

手册页

文章:

答案2

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

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

答案3

为了完整起见:由于在大多数 64 位架构上都可以在内核空间和用户空间中运行 32 位代码,因此不应忘记实际上有 4 种可能的组合:

  • 32 位内核上的 32 位用户空间
  • 64 位内核上的 64 位用户空间
  • 64 位内核上的 32 位用户空间
  • 两个都64 位内核上的 64 位和 32 位用户空间

uname是确定内核变体的常用方法。对于用户空间,file非常擅长识别可执行文件:file $SHELL或者file /sbin/init是方便的惯用语。只是存在两个都 /lib/*.so /lib64/*.so通常是一个很好的迹象,表明系统支持两种用户空间变体。

答案4

要了解安装的 Ubuntu 是 32 位还是 64 位:

a) getconf LONG_BIT

b) uname -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 操作模式”告知有关 CPU 的信息。 “32位”代表32位之一,而“32位、64位”或“64位”代表64位之一。

相关内容