当前位置:  开发笔记 > 编程语言 > 正文

如何确定给定的Linux是32位还是64位?

如何解决《如何确定给定的Linux是32位还是64位?》经验,为你挑选了11个好方法。

当我输入时uname -a,它给出以下输出.

Linux mars 2.6.9-67.0.15.ELsmp #1 SMP Tue Apr 22 13:50:33 EDT 2008 i686 i686 i386 GNU/Linux

我怎么知道给定的操作系统是32位还是64位?

这在编写configure脚本时很有用,例如:我要构建什么样的架构?



1> VonC..:

试试uname -m.缺少的uname --machine,它输出:

x86_64 ==> 64-bit kernel
i686   ==> 32-bit kernel

否则,不是针对Linux内核,而是针对CPU,键入:

cat /proc/cpuinfo

要么:

grep flags /proc/cpuinfo

在"flags"参数下,您将看到各种值:请参阅" / proc/cpuinfo中的标志是什么意思? "其中一个名称为lm:Long Mode(x86-64:amd64,也称为Intel 64,即64位能)

lm ==> 64-bit processor

或者使用lshw(如下面由萨克森的Rolf所述),没有sudo(只是为了获得cpu宽度):

lshw -class cpu|grep "^       width"|uniq|awk '{print $2}'

注意:您可以安装具有32位内核的64位CPU.
(正如ysdx在他/她自己的回答中提到的那样,"现在,系统可以是系统的,所以它无论如何都没有意义.你可能想找到编译器的默认目标")


如果tm和lm都存在怎么办?
@JavierNovoaC.tm(热监控器)表示自动时钟控制.它与区分32位处理器无关.事实上,当且仅当您拥有64位CPU时,才会出现lm(长模式).所以这就是为什么你应该只依靠lm.否则Thomas Watnedal给出的答案是最好的.这个答案是错的,误导了很多人,plz版主对此做了些什么.
grep flags/proc/cpuinfo只告诉你CPU是64位.据我所知,这是关于操作系统的问题.uname -m只告诉我"i686".
我在64位硬件上有一个32位内核,从'uname -m'(在Debian上)得到"x86_64".uname的手册页说-m显示了机器硬件名称,所以看起来是正确的.

2> Thomas Watne..:

如果您运行的是64位平台,您会看到x86_64或uname -a 输出中非常相似的东西

要运行特定的计算机硬件名称

uname -m

你也可以打电话

getconf LONG_BIT

返回32或64


这意味着CPU是64位的,但你只安装了32位操作系统,即使你可以使用64位操作系统.
`uname -m`输出`x86_64``getconf LONG_BIT`输出`32`哪一个是正确的?:\
`getconf LONG_BIT`可以提供32 ig,它已被构建为32位应用程序(通常是运行32位用户空间的64位内核).

3> 小智..:

lscpu 将列出有关您的CPU的其他信息:

Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
...


输出CPU的物理功能,对当前操作系统的当前用户空间有用但不可靠.

4> 小智..:

另一个易于确定的有用命令如下:

命令:

getconf LONG_BIT

回答:

32,如果OS是32位

64,如果OS是64位


对于Itanium 64上的HP-UX 11.31i,情况并非如此:此命令返回32.

5> Greg von Win..:

命令

$ arch    

相当于

$ uname -m

但输入的速度是原来的两倍


同意,但我确信打字速度对大多数开发人员来说不是问题.
这将返回内核可以支持的进程类型.在64位内核上运行32位用户空间是可能的,甚至是合理的.

6> Reed Hedges..:

我想知道这是专门用于在Debian中构建软件的(安装的Debian系统可以是32位版本,带有32位内核,库等,或者它可以是64位版本,其中包含为64位编译的东西 -位而不是32位兼容模式).

Debian软件包本身需要知道它们当然是什么样的架构(当然)当它们实际创建包含所有元数据的包时,包括平台架构,所以有一个打包工具可以输出它供其他打包工具和脚本使用,叫做dpkg-architecture.它既包括它为其构建的内容,也包括当前主机.(通常这些是相同的.)64位机器上的示例输出:

DEB_BUILD_ARCH=amd64
DEB_BUILD_ARCH_OS=linux
DEB_BUILD_ARCH_CPU=amd64
DEB_BUILD_GNU_CPU=x86_64
DEB_BUILD_GNU_SYSTEM=linux-gnu
DEB_BUILD_GNU_TYPE=x86_64-linux-gnu
DEB_HOST_ARCH=amd64
DEB_HOST_ARCH_OS=linux
DEB_HOST_ARCH_CPU=amd64
DEB_HOST_GNU_CPU=x86_64
DEB_HOST_GNU_SYSTEM=linux-gnu
DEB_HOST_GNU_TYPE=x86_64-linux-gnu

您可以使用dpkg -architecture的命令行选项打印其中一个变量或对其值进行测试.

我不知道dpkg-architecture如何推断架构,但你可以查看它的文档或源代码(dpkg-architecture和dpkg系统的大部分都是Perl).


命令`dpkg --print-architecture`从永远开始在Debian上运行.这个有效,但仅限于Debian及其衍生品.

7> 小智..:
#include 

int main(void)
{
    printf("%d\n", __WORDSIZE);
    return 0;
}


但似乎是Linux上stdio.h的实现细节,存在更好的解决方案,例如:limits.h,请勿使用.

8> Denis R...:

如果你有一个64位的操作系统,而不是i686,你有x86_64ia64在输出中uname -a.因为你没有这两个字符串中的任何一个; 你有一个32位操作系统(请注意,这并不意味着你的CPU不是64位).



9> Louis Gerbar..:

该系统是32位.iX86 uname意味着它是一个32位架构.如果它是64位,它将返回

Linux mars 2.6.9-67.0.15.ELsmp #1 SMP Tue Apr 22 13:50:33 EDT 2008 x86_64 i686 x86_64 x86_64 GNU/Linux



10> ysdx..:

如今,一个系统可以是多层的,所以无论如何它都没有意义.您可能想要找到编译器的默认目标:

$ cc -v 2>&1 | grep ^Target
Target: x86_64-pc-linux-gn

你可以尝试编译一个hello world:

$ echo 'int main() { return 0; }' | cc -x c - -o foo
$ file foo
foo: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=b114e029a08abfb3c98db93d3dcdb7435b5bba0c, not stripped



11> kaiwan..:

关于答案"getconf LONG_BIT".

我在'C'中编写了一个简单的函数:

/*
 * check_os_64bit
 *
 * Returns integer:
 *   1 = it is a 64-bit OS
 *   0 = it is NOT a 64-bit OS (probably 32-bit)
 *   < 0 = failure
 *     -1 = popen failed
 *     -2 = fgets failed
 *
 * **WARNING**
 * Be CAREFUL! Just testing for a boolean return may not cut it
 * with this (trivial) implementation! (Think of when it fails,
 * returning -ve; this could be seen as non-zero & therefore true!)
 * Suggestions?
 */
static int check_os_64bit(void)
{
    FILE *fp=NULL;
    char cb64[3];

    fp = popen ("getconf LONG_BIT", "r");
    if (!fp)
       return -1;

    if (!fgets(cb64, 3, fp))
        return -2;

    if (!strncmp (cb64, "64", 3)) {
        return 1;
    }
    else {
        return 0;
    }
}

好主意,'getconf'!


傻傻的想法!在C中使用`CHAR_BIT*sizeof(void*)`或`__WORDSIZE`.
不,这不是愚蠢的.例如,您可能有一个32位可执行文件,并且想要确定系统是否支持64位可执行文件.
推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有