我的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 2014年

@richard我猜是这样,但是64位变体的名称是什么?
克里斯·梅斯

1
我无权访问ARM机器,但是uname -aand 的输出是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 2014年

Arm是32位CPU中最后使用64位的CPU(不包括那些死掉的CPU)。多数人选择了64位,然后由于营销不佳而死亡-假设做得更好就足够了。英特尔x86位居倒数第二,尽管AMD增加了64位。
ctrl-alt-delor 2014年

Answers:


74

由于您可以在具有64位功能的CPU上运行32位或混合操作系统,因此具有多个等级。请参阅64位内核,但所有32位ELF可执行程序正在运行的进程,这是怎么回事?进行详细讨论(为x86编写,但其中大多数也适用于arm)。

您可以在中找到处理器型号/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 is a LINUX,所以,应该有一些命令,某些命令会在本地显示它,而不是在某些页面上阅读文档
THESorcerer 2015年

1
@THESorcerer Android使用Linux内核,但不是Linux系统。它没有Linux用户登陆工具(只有很小的一部分)。在Android上,我认为基本操作系统中对64位的支持是一致的,因此cat /proc/$$/maps可以通过adb命令行了解系统是64位还是32位。
吉尔斯2015年

3
我相信Raspberry Pi 3(即ARMv8)(CRC,没有可选的Crypto)将armv7l即使其ARMv8 也会报告。因此,我很确定会报告错误的CPU。

1
@jww如果报告armv7l,则表明您正在运行32位内核。您可以在64位CPU上运行32位内核。如果需要有关CPU的信息,请阅读/proc/cpuinfo
吉尔斯

uname -m仅返回“ aarch64”。/ proc / cpuinfo也不总是包含处理器的名称。
Halsafar

23

正如Richard所指出的,armv7变体都是32位的,因此没有多余的label armv7-32等。

在linux系统上,您可以轻松地(虽然不是真正确定的)通过检查通用可执行文件进行检查:

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

我之所以说“不确定”,是因为可以在64位系统上运行32位可执行文件。

/proc或中似乎没有万无一失的东西/sys;的输出/proc/cpuinfo 可能会提供一些重要的线索。如果出于某种原因您需要自动检查,则创建一个映射到“模型名称”字段的表似乎是一种可能的方法(其他字段,包括“模型”,“ cpu系列”等,看起来是可选的,它们并不可选)在Broadcom 2708 ARMv6处理器上对我来说根本没有出现)。


那么armv7l是32位吗?
bakalolo

1
@bakalolo慢慢阅读问题和已接受的答案;)
goldilocks

11

安装“ lshw”软件包。

# lshw
...
    description: Computer
    product: Raspberry Pi 3 Model B Rev 1.2
    width: 32 bits
...

3

似乎大多数查看位数的方法都是以某种方式知道arm7 = 32位,虽然这可能是正确的,但是

pi@rpi9:~ $ getconf LONG_BIT
32

如果您想寻找CPU模型,我通常会使用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。使用错误的格式说明符会
导致

和void *的大小不一定是体系结构的位宽。您是否听说过x32 ABI sites.google.com/site/x32abi
phuclv

同样,getconf -a | grep LONG_BIT
kaiwan

2
除了编译器的性质之外,它不会告诉您其他信息。
rsethc

-5

不,这是一台64位计算机。这是Allwinner H8,女巫是双ARM-7。8核,64位,powervr,sgx 544,双倍速度(700MHz)。

所以不,它可以是64位。仅操作系统可能是32。


您在哪里发现OP使用Allwinner H8?架构为armv7l,显然不是64位架构
phuclv

最好演示一种从系统查找所需信息的方法,而不是使用外部来源的第三方信息。这比起回答更适合作为评论(因此,所有否决票都适用)。
Synetech
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.