linux ของฉันคือ ARM 32 หรือ 64 บิต?


60

ภายใต้ intel ฉันรู้ว่าฉันสามารถดูผลลัพธ์ของuname -mการรู้ว่าระบบปฏิบัติการของฉันเป็น 32 หรือ 64 บิต แต่ภายใต้ ARM สิ่งนี้ให้:

armv7l

ฉันอนุมานจาก

file /usr/bin/ls

ฉันใช้ระบบปฏิบัติการ 32 บิต แต่ฉันจะรู้ได้อย่างไรในวิธีที่ง่ายกว่า


3
แขน 7 คือ 32 บิต ARMv8-A architecture, announced in October 2011,[6] adds support for a 64-bit address space and 64-bit arithmetic.- วิกิพีเดีย
ctrl-alt-delor

@ Richard ฉันคาดเดาอย่างนั้น แต่แล้วชื่อของตัวแปร 64 บิตคืออะไร?
Chris Maes

1
ฉันไม่ได้มีการเข้าถึงเครื่อง ARM แต่สิ่งที่เป็นการส่งออกของuname -aและgcc -v? สิ่งเหล่านั้นอาจเป็นประโยชน์
terdon

Announced October 2011, ARMv8-A (often called ARMv8 although not all variants are 64-bit such as ARMv8-R) represents a fundamental change to the ARM architecture. It adds a 64-bit architecture, named "AArch64", and a new "A64" instruction set. AArch64 provides user-space compatibility with ARMv7-A ISA, the 32-bit architecture, therein referred to as "AArch32" and the old 32-bit instruction set, now named "A32" ARM announced their Cortex-A53 and Cortex-A57 cores on 30 October 2012.- en.wikipedia.org/wiki/ARM_architecture#64.2F32-bit_architecture
ctrl-alt-delor

แขนเป็นซีพียู 32 บิตตัวสุดท้ายที่ไป 64 บิต (ไม่รวมผู้ที่เสียชีวิต) 64bit ส่วนใหญ่เสียชีวิตแล้วเนื่องจากการตลาดไม่ดี - สมมติว่าดีกว่าก็เพียงพอแล้ว Intel x86 เป็นรุ่นที่สองไปจนถึงรุ่นล่าสุดแม้ว่าจะเป็น AMD ที่เพิ่ม 64 บิต
ctrl-alt-delor

คำตอบ:


74

มีการไล่ระดับสีหลายระดับเนื่องจากคุณสามารถเรียกใช้ระบบปฏิบัติการแบบ 32 บิตหรือแบบผสมบน CPU ที่มีความสามารถแบบ 64 บิต ดูเคอร์เนล 64- บิต แต่กระบวนการทำงานที่รันได้ของ ELF 32- บิตทั้งหมดนี้เป็นอย่างไร สำหรับการสนทนาอย่างละเอียด (เขียนสำหรับ x86 แต่ส่วนใหญ่ใช้กับแขนเช่นกัน)

คุณสามารถค้นหารุ่นโปรเซสเซอร์/proc/cpuinfoได้ ตัวอย่างเช่น:

$ cat /proc/cpuinfo
Processor       : ARMv7 Processor rev 10 (v7l)

ARMv7 (และต่ำกว่า) คือ 32 บิต ARMv8แนะนำชุดคำสั่ง 64 บิต

หากคุณต้องการดูว่าระบบของคุณรองรับไบนารี 64 บิตหรือไม่ให้ตรวจสอบสถาปัตยกรรมเคอร์เนล:

$ uname -m
armv7l

บนโปรเซสเซอร์ 64 บิตคุณจะเห็นสตริงที่ขึ้นต้นด้วยarmv8(หรือสูงกว่า) หากunameกระบวนการนั้นเป็นกระบวนการ 32 บิตหรือaarch64เป็นกระบวนการ 64 บิต (ดูเพิ่มเติมที่https://stackoverflow.com/questions/45125516/possible-values-for-uname-m )


2
ฉันไม่ได้ประกวดคำตอบของคุณ แต่น่าเสียดายที่ Android เป็น A LINUX ดังนั้นจึงมีคำสั่งบางอย่างที่แสดงในพื้นที่และไม่อ่านเอกสารในบางหน้า
THESorcerer

1
@THESorcerer Android ใช้เคอร์เนล Linux แต่ไม่ใช่ระบบ Linux มันไม่มีเครื่องมือสำหรับผู้ใช้ Linux (มีเพียงชุดย่อยที่เล็กมาก) บน Android ฉันคิดว่าการสนับสนุน 64- บิตนั้นสอดคล้องกันในระบบปฏิบัติการพื้นฐานดังนั้นcat /proc/$$/mapsจะแจ้งให้คุณทราบว่าระบบนั้นเป็น 64- บิตหรือ 32- บิตจากบรรทัดคำสั่ง adb
Gilles

3
ฉันเชื่อว่า Raspberry Pi 3 ซึ่งเป็น ARMv8 (CRC ไม่มีตัวเลือก Crypto) จะรายงานarmv7lแม้ว่า ARMv8 ของมัน ดังนั้นฉันค่อนข้างมั่นใจว่าจะมีการรายงาน CPU ที่ไม่ถูกต้อง

1
@jww หากรายงานarmv7lว่าแสดงว่าคุณใช้เคอร์เนลแบบ 32 บิต คุณสามารถเรียกใช้เคอร์เนลแบบ 32 บิตบน CPU แบบ 64 บิต หากท่านต้องการข้อมูลเกี่ยวกับ CPU, /proc/cpuinfoอ่าน
Gilles

uname -m เพิ่งส่งคืน "aarch64" / proc / cpuinfo ไม่ได้มีชื่อสำหรับโปรเซสเซอร์เสมอ
Halsafar

23

เมื่อริชาร์ดชี้ให้เห็นarmv7ตัวแปรต่าง ๆ มีทั้งหมด 32 บิตดังนั้นจึงไม่มีฉลากซ้ำซ้อนarmv7-32ฯลฯ

บนระบบ linux คุณสามารถตรวจสอบได้อย่างง่ายดายแม้ว่าจะไม่แน่นอนจริง ๆ โดยการตรวจสอบปฏิบัติการทั่วไป:

> which bash
/bin/bash
> file /bin/bash
/bin/bash: ELF 32-bit LSB executable, ARM, version 1 (SYSV) ...

ฉันพูดว่า "ไม่ชัดเจน" เพราะเป็นไปได้ที่จะเรียกใช้โปรแกรมปฏิบัติการ 32- บิตบนระบบ 64- บิต

ดูเหมือนจะไม่มีอะไรที่จะเข้าใจผิดได้ใน/procหรือ/sys; ผลลัพธ์จาก/proc/cpuinfo อาจให้เบาะแสที่สำคัญบางอย่าง หากด้วยเหตุผลบางอย่างที่คุณต้องการการตรวจสอบอัตโนมัติการสร้างตารางที่แมปกับฟิลด์ "ชื่อรุ่น" ดูเหมือนว่าวิธีการหนึ่งที่อาจเป็นไปได้ (สาขาอื่นรวมถึง "รุ่น", "ตระกูลซีพียู") และอื่น ๆ ไม่ปรากฏเลยสำหรับฉันในโปรเซสเซอร์ Broadcom 2708 ARMv6)


ดังนั้น armv7l คือ 32 บิตจริงไหม?
bakalolo

1
@bakalolo อ่านคำถามและคำตอบที่ได้รับการยอมรับช้า)
goldilocks


3

ดูเหมือนว่าวิธีส่วนใหญ่ที่จะเห็นการนับบิตคือการรู้ว่า arm7 = 32 บิตและในขณะที่อาจเป็นจริง แต่สิ่งที่เกี่ยวกับ

pi@rpi9:~ $ getconf LONG_BIT
32

และถ้าคุณต้องการมองหาซีพียูรุ่นปกติฉันใช้ arch

root@rpi4:~# tr '\0' '\n' </proc/device-tree/model;arch
Raspberry Pi Model B Rev 2
armv6l

pi@rpi9:~ $ tr '\0' '\n' </proc/device-tree/model;arch
Raspberry Pi 3 Model B Rev 1.2
armv7l

getconf LONG_BIT ตรงไปตรงมามาก
Abdulkarim Kanaan

1

ลองทำสิ่งต่อไปนี้

// -*- compile-command: "gcc -Wall -o sizeof sizeof.c && ./sizeof" -*-

#include <stdio.h>
#include <limits.h>

#define size(t) { t x; printf("%s:\t%3lu bit\n", #t, CHAR_BIT * sizeof x); }

int main (int argc, char *argv[])
{
  size(char);
  size(short);
  size(int);
  size(long);
  size(void*);
  return 0;
}

void*ขนาดที่อยู่


1
sizeofผลตอบแทนsize_t%zuซึ่งจะต้องพิมพ์ออกมาใช้ การใช้ตัวระบุรูปแบบที่ไม่ถูกต้องจะเรียกใช้พฤติกรรมที่ไม่ได้กำหนด
phuclv

และขนาดของ void * ไม่จำเป็นต้องเป็นความกว้างบิตของสถาปัตยกรรม คุณเคยได้ยินx32 ABI sites.google.com/site/x32abi หรือไม่
phuclv

ในทำนองเดียวกัน getconf -a | grep LONG_BIT
kaiwan

2
นี้ไม่ได้บอกคุณเกี่ยวกับสิ่งอื่นที่ไม่ใช่ธรรมชาติของคอมไพเลอร์ของคุณ
rsethc

-5

ไม่มันเป็นคอมพิวเตอร์ 64 บิต มันคือ Allwinner H8 แม่มดเป็น ARM-7 คู่ 8 cores, 64 bits, powervr, sgx 544 ที่ความเร็วสองเท่า (700mhz)

ไม่เลยมันสามารถเป็น 64 บิตได้ เพียงแค่ระบบปฏิบัติการอาจเป็น 32


คุณพบว่า OP ของใช้ Allwinner H8 ที่ไหน สถาปัตยกรรมคือ armv7l ซึ่งเห็นได้ชัดว่าไม่ใช่ 64 บิต
phuclv

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