โหมดปฏิบัติการ CPU แบบ 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 น้อยลงและสนใจว่าทำไมlscpuCPU ของฉันถึงทำงานได้ในโหมด 64 บิต; ชัดเจนนี่ไม่ได้หมายความว่าฉันสามารถเรียกใช้โปรแกรม 64 บิต ทุกคนสามารถอธิบายได้หรือไม่


คุณสามารถแบ่งปันการส่งออกของ cat /proc/cpuผมคิดว่าในการบูตเครื่องที่คุณสามารถเลือกถ้าคุณต้องการบูตในโหมด 64 หรือ 32 บิต
Raza

1
คุณใช้ระบบปฏิบัติการ 32 บิตหรือ 64 บิตหรือไม่?
Renan

@Salton /proc/cpuinfoฉันมี แต่นี่ทำให้เกิดคำถามที่อยากรู้อยากเห็นมากขึ้น *_lmธงบ่งชี้ทั้งหน่วยประมวลผลของฉันสนับสนุนโหมดยาว แต่ขนาดที่อยู่เป็น "36 บิตทางกายภาพ" ..
แซค

คำตอบ:


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- บิต

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น่าจะเป็นเครื่องมือที่ดีที่สุดสำหรับการวิเคราะห์ฮาร์ดแวร์ของคุณได้จะต้องเป็น แพคเกจนี้สามารถแสดงให้คุณเห็นทุกอย่างที่คุณต้องการ / จำเป็นต้องรู้เกี่ยวกับฮาร์ดแวร์ใด ๆ ของคุณได้ทันทีจาก terminal มันช่วยฉันได้หลายสิบครั้งเมื่อฉันต้องการข้อมูลบางอย่างจากชิปบนแผงวงจรหลักของระบบหรือจำเป็นต้องรู้การแก้ไขบอร์ดในสล็อต 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 ของคุณกำลังนำเสนอต่อระบบปฏิบัติการ การใช้การ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)?

คำสั่งหลายคำสั่งรายงานว่าสิ่งที่ดูเหมือนว่าจะเป็น CPU แบบ 32 บิตเช่นเดียวกับการสนับสนุนโหมด 32 บิตและ 64 บิต สิ่งนี้อาจสร้างความสับสนและทำให้เข้าใจผิดเล็กน้อย แต่ถ้าคุณเข้าใจประวัติของ CPU โดยเฉพาะ Intel คุณจะรู้ว่าพวกเขามีประวัติการเล่นเกมกับผลิตภัณฑ์ของพวกเขาซึ่ง CPU อาจมีชุดคำสั่งที่รองรับ 16 บิต แต่สามารถระบุ RAM ได้มากกว่า 2 ^ 16

สิ่งเดียวกันนี้เกิดขึ้นกับซีพียูเหล่านี้ คนส่วนใหญ่รู้ว่า CPU แบบ 32 บิตสามารถระบุ RAM ได้เพียง 2 ^ 32 = 4GB แต่มีซีพียูหลายรุ่นที่สามารถจัดการได้มากกว่านี้ ซีพียูเหล่านี้มักจะทำให้การใช้งานของลินุกซ์ที่มีคำต่อท้ายPAE - ที่อยู่ส่วนขยายทางกายภาพ การใช้เคอร์เนลที่เปิดใช้งาน PAE พร้อมกับฮาร์ดแวร์นี้จะช่วยให้คุณสามารถระบุได้ถึง 64GB ในระบบ 32 บิต

คุณอาจคิดว่าดีทำไมฉันต้องมีสถาปัตยกรรม 64 บิต ปัญหาของซีพียูเหล่านี้คือพื้นที่กระบวนการเดียวถูก จำกัด ไว้ที่ 2 ^ 32 ดังนั้นหากคุณมีโปรแกรมจำลองหรือโปรแกรมคำนวณขนาดใหญ่ที่ต้องการพื้นที่แอดเดรสที่สามารถกำหนดแอดเดรสได้มากกว่า 2 ^ 32 ใน RAM สิ่งนี้จะไม่ช่วยคุณได้ กับที่

ลองดูที่หน้าวิกิพีเดียในP6 microar Architecture (i686)สำหรับข้อมูลเพิ่มเติม

TL; DR - ดังนั้น heck คือสถาปัตยกรรมของ CPU ของฉัน

โดยทั่วไปแล้วอาจเกิดความสับสนได้เนื่องจากคำสั่งและวิธีการต่างๆข้างต้นใช้คำว่า "สถาปัตยกรรม" อย่างหลวม ๆ หากคุณสนใจว่าระบบปฏิบัติการพื้นฐานเป็นแบบ 32 บิตหรือ 64 บิตใช้คำสั่งเหล่านี้:

  • lscpu
  • getconf LONG_BIT
  • uname

หากในอีกทางหนึ่งคุณต้องการทราบสถาปัตยกรรมของ CPU ให้ใช้คำสั่งเหล่านี้:

  • / proc / cpuinfo
  • hwinfo
  • lshw

คุณต้องการค้นหาเขตข้อมูลที่ระบุว่าสิ่งต่าง ๆ เช่น "ความกว้าง: 64" หรือ "ความกว้าง: 32" หากคุณกำลังใช้เครื่องมือเช่นlshwหรือค้นหาธง:

  • lm: โหมดยาว (x86-64: amd64 หรือที่รู้จักในชื่อ Intel 64, เช่นความสามารถ 64- บิต)
  • lahf_lm: LAHF / SAHF ในโหมดยาว

การนำเสนอของทั้งสองค่าสถานะจะบอกคุณว่า CPU เป็น 64 บิต การขาดงานของพวกเขาบอกคุณว่ามันเป็น 32- บิต

ดู URL เหล่านี้สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการตั้งค่าสถานะของ CPU

อ้างอิง

หน้าคน

บทความ:


คุณช่วยอธิบายได้ไหมว่าทำไมระบบปฏิบัติการ 32 บิตจึงมี "โหมด op-64- บิต" คำตอบของคุณแสดงถึงความสามารถ
djangofan

ถูกต้อง. ดูการปรับปรุงของฉัน lmk ถ้าเหมาะสม
slm

ชัดเจนคำตอบที่ดี ขอบคุณมาก! Intel กำลังเล่นเกม
Zak

ดังนั้นเพื่อให้ชัดเจนแม้ว่าlscpuจะค่อนข้างทำให้เข้าใจผิดใน "Architecture: i686" ที่จริงแล้วหมายถึงการใช้ระบบปฏิบัติการแบบ 32 บิต
Zak

1
Googling สำหรับข้อมูลนี้มีความสับสนมากในหัวข้อนี้โดยเฉพาะ คำถามนี้ปรากฏในเว็บไซต์ SE จำนวนมาก หลายคำตอบในเว็บไซต์เหล่านั้นสับสนเกี่ยวกับหัวข้อนี้เช่นกัน ดังนั้นนี่คือความพยายามที่จะลองและให้คำตอบที่ครอบคลุมทุกหัวข้อไม่ใช่เพียงเพื่อตอบคำถามของ OP
slm

4

หากเคอร์เนลของคุณคือเคอร์เนลลินุกซ์ 32 บิตคุณจะไม่สามารถรันโปรแกรม 64 บิตได้แม้ว่าโปรเซสเซอร์ของคุณจะรองรับ

ติดตั้งเคอร์เนล 64 บิต (และทั้งระบบปฏิบัติการ) เพื่อรัน 64 บิต


หากซีพียูของคุณรองรับ VT-x / AMD- คุณยังคงสามารถใช้โปรแกรม 64 บิตภายใต้ 32 OS โดยใช้ซอฟต์แวร์การจำลองเสมือนเช่น 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มักจะบ่งชี้ที่ดีว่าระบบกีฬาทั้งสองตัวแปรพื้นที่ผู้ใช้


ที่จริงแล้วมี 5 การรวมกันครั้งแรกอาจเป็น "... กับฮาร์ดแวร์ 32 บิต" หรือ "... บนฮาร์ดแวร์ 64 บิต" ส่วนที่เหลืออีก 3 รายการต้องการฮาร์ดแวร์ 64 บิต
Ben Voigt

ใช่ผมถือว่าอย่างใดฮาร์ดแวร์ 64 บิตโดยปริยายเขียนในส่วนสถาปัตยกรรม 64 บิต
เตอร์

0

หากต้องการทราบว่า Ubuntu ที่ติดตั้งนั้นเป็น 32 หรือ 64 บิต:

a) getconf LONG_BIT

b) uname -m

ถ้ามันแสดง i686 หรือ i386 ก็หมายถึง 32 บิต ถ้ามันแสดง x86_64 หมายถึง 64 บิต

หาก CPU มีขนาด 32 บิต Ubuntu จะต้องมีขนาด 32 บิต หากซีพียูของ 64 บิตก็สามารถทำงานได้ใน 64 หรือ 32 บิต ดังนั้นเราสามารถเลือกได้: Ubuntu สามารถเป็น 32 บิตหรือ 64 บิต

หากต้องการทราบว่า CPU เป็น 32 หรือ 64 บิต:

ก) grep -w lm / proc / cpuinfo

ถ้าเราเห็น lm สีแดงมีค่า 64 บิต มิฉะนั้นจะเป็น 32 บิต

b) sudo lshw | คำอธิบาย grep ": CPU" -A 12 | ความกว้าง grep

มันบอกอย่างชัดเจนว่าเราต้องการรู้อะไร

คำสั่งสำหรับข่าวสารทั้งสอง:

lscpu

เราต้องดูผลลัพธ์ 2 บรรทัดแรก:“ สถาปัตยกรรม” แจ้งเกี่ยวกับรุ่น Linux ที่ติดตั้ง:“ i686″ หมายถึงหนึ่งใน 32 บิตในขณะที่“ x86_64″ หมายถึง 64 บิตหนึ่ง “ CPU op-mode (s)” แจ้งเกี่ยวกับ CPU “ 32- บิต” หมายถึงหนึ่งใน 32 บิตในขณะที่“ 32- บิต, 64- บิต” หรือ“ 64- บิต” หมายถึง 64 บิตหนึ่ง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.