web-dev-qa-db-ja.com

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ビットプログラムを実行できます。

15
Zak

lscpuは、アーキテクチャがi686(Intel 32ビットCPU)であり、CPUが32ビットと64ビットの両方の動作モードをサポートしていることを示しています。 x64アーキテクチャ用に特別に構築されているため、x64で構築されたアプリケーションをインストールすることはできません。

特定のCPUは、i386またはi686のビルド済みパッケージを処理できます。アーキテクチャとOSの設定を確認する方法はいくつかあります。

lscp

ご存知のとおり、コマンド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が示すさまざまなフラグを通じて、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ビットの別名です。

name

このコマンドを使用して、カーネルがサポートするように構築されたプラットフォームを判別できます。例えば:

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

注:スタンドアロンコマンドArchとして実行できるuname -mの短縮形もあります。 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

これは、CPUがOSに提示しているアーキテクチャを確認する最も明白な方法です。 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

CPU op-mode(s)?

いくつかのコマンドは、32ビットCPUのように見えるものが32ビットおよび64ビットモードをサポートしていると報告しています。これは少し紛らわしく誤解を招く可能性がありますが、CPUの歴史、特にIntelを理解していれば、CPUが16ビットをサポートする命令セットを備えている可能性がある製品でゲームをプレイした歴史があることがわかります。しかし、より多くのRAMその2 ^ 16に対処できます。

同じことがこれらのCPUでも起こっています。ほとんどの人は、32ビットCPUは2 ^ 32 = 4GBのRAMしかアドレス指定できないことを知っています。しかし、より多くに対応できるCPUのバージョンがあります。これらのCPUは、多くの場合、接尾辞 PAE-物理アドレス拡張 が付いたLinuxカーネルを使用します。このハードウェアと共にPAE対応カーネルを使用すると、32ビットシステムで最大64GBまでアドレス指定できます。

では、なぜ64ビットアーキテクチャが必要なのでしょうか。これらのCPUの問題は、単一のプロセススペースが2 ^ 32に制限されていることです。そのため、RAMに2 ^ 32を超えるアドレス可能なスペースを必要とする大規模なシミュレーションまたは計算プログラムがある場合、これは役に立ちませんでした。それと。

詳細は P6マイクロアーキテクチャー(i686) のウィキペディアのページをご覧ください。

TL; DR-では、私のCPUのアーキテクチャは一体何ですか?

上記のコマンドと方法論の多くが「アーキテクチャ」という用語を大まかに使用しているため、一般に混乱を招く可能性があります。基盤となるOSが32ビットか64ビットかに関心がある場合は、次のコマンドを使用します。

  • lscpu
  • getconf LONG_BIT
  • うなめ

一方、CPUのアーキテクチャを知りたい場合は、次のコマンドを使用します。

  • / proc/cpuinfo
  • hwinfo
  • lshw

具体的には、lshwなどのツールを使用している場合は、「width:64」や「width:32」などのフィールドを探すか、フラグを探します。

  • lm:ロングモード(x86-64:AMD64、Intel 64とも呼ばれる、つまり64ビット対応)
  • lahf_lm:ロングモードのLAHF/SAHF

これらの2つのフラグの存在は、CPUが64ビットであることを示しています。彼らの不在はそれが32ビットであることを教えてくれます。

CPUフラグの詳細については、これらのURLを参照してください。

参考文献

manページ

記事:

32
slm

カーネルが32ビットLinuxカーネルである場合、プロセッサがサポートしている場合でも、64ビットプログラムを実行することはできません。

64ビットを実行するには、64ビットカーネル(もちろんOS全体)をインストールします

5
ptr

完全を期すために:ほとんどの64ビットアーキテクチャでは、カーネル空間とユーザー空間の両方で32ビットコードを実行できるため、実際には4つの可能な組み合わせがあることを忘れないでください。

  • 32ビットカーネル上の32ビットユーザー空間
  • 64ビットカーネル上の64ビットユーザー空間
  • 64ビットカーネルの32ビットユーザー空間
  • 両方 64ビットカーネル上の64ビットおよび32ビットのユーザー空間

unameは、カーネルバリアントを決定する通常の方法です。ユーザースペースの場合、fileは実行可能ファイルの認識に非常に優れています。file $Shellまたはfile /sbin/initは便利なイディオムです。 両方/lib/*.soand/lib64/*.soの存在のみが、システムが両方のユーザー空間バリアントをスポーツしていることを示しています。

1
peterph

インストールされている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)sudo lshw | grep "説明:CPU" -A 12 | grep幅

それは私たちが知りたいことを明確に述べています。

両方の情報のコマンド:

lscpu

出力の最初の2行を確認するだけで済みます。「Architecture」はインストールされたLinuxバージョンについて通知します。「i686」は32ビットの1つを表し、「x86_64」は64ビットの1つを表します。 「CPU op-mode(s)」は、CPUについて通知します。 「32ビット」は32ビットの1つを表し、「32ビット、64ビット」または「64ビット」は64ビットを表します。

0
Fasdiasi