如何确定硬件和操作系统的位数?

如何确定硬件和操作系统的位数?

uname我的 RHEL 5.4 机器上 -a的输出是:

Linux <machine name> 2.6.18-164.el5 #1 SMP Tue Aug 18 15:51:48 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux

这是否意味着硬件是 64 位(可能是第一个 x86_64)并且操作系统也是 64 位(最后一个 x86_64)?

另外,这么多 x86_64 实例是什么?
我可以在 32 位操作系统上安装 64 位虚拟机,反之亦然吗?

答案1

硬件、内核和用户空间程序可能具有不同的字长。

  • 您可以查看是否中央处理器flags通过检查中的行可以确定是 64 位、32 位还是两者都支持/proc/cpuinfo。您必须了解您的架构系列中可能的标志。例如,在 i386/amd64 平台上,该lm标志标识支持 amd64 的 CPU(没有该标志的 CPU 仅限 i386)。

      grep -q '^flags *:.*\blm\b' /proc/cpuinfo    # Assuming a PC
    
  • 您可以通过查询架构来查看内核是32位还是64位uname -m。例如,i[3456]86是 32 位,而x86_64是 64 位。请注意,在某些体系结构上,64 位内核可以运行 32 位用户态程序,因此即使uname -m显示 64 位内核,也不能保证 64 位库可用。

      [ "$(uname -m)" = "x86_64" ]    # Assuming a PC
    
  • 您可以通过查询来查看用户空间中可用的内容最低有效位支持与lsb_release命令。更准确地说,lsb_release -s打印:支持的 LSB 功能的分隔列表。每个特征都有形式。例如,ix86 C 库的可用性由 表示,而是 amd64 的模拟库。不过,并非每个发行版都声明所有可用的 LSB 模块,因此可用的模块可能多于通过这种方式检测到的模块。module-version-architecturecore-2.0-ia32core-2.0-amd64

  • 您可以使用诸如 之类的命令查看系统上的架构程序是为哪些架构而构建的file /bin/ls。请注意,混合系统是可能的;即使ls是 64 位程序,您的系统也可能安装了用于运行 32 位程序的库,反之亦然(不太常见)。

  • sizeof(void*)您可以通过编译一个打印或 的5 行 C 程序来找出开发时首选的字长(假设有 C 编译器可用)sizeof(size_t)。您可以通过运行命令以稍微不太可靠的方式来获取相同的信息getconf LONG_BIT

      #include <stdio.h>
      int main() {
          printf("%d\n", (int)sizeof(void*));
          return 0;
      }
    

至于虚拟机,是否可以在 32 位系统上运行 64 位虚拟机,或者反之亦然,取决于您的虚拟机技术。特别参见 如何在 32 位 Linux 上安装 64 位 Linux 虚拟机?

1 “字长”是“位数”的常用名称。
²如果有人安装了具有不同目标体系结构的备用 C 编译器但保留系统默认值,则可能不可靠getconf

答案2

您想知道 的uname多个 x86_64 出现:

x86_64 x86_64 x86_64

这就是这三个价值观(“如果未知则省略 -p 和 -i”

    -m, --machine 
          print the machine hardware name
    -p, --processor
          print the processor type or "unknown"
    -i, --hardware-platform
          print the hardware platform or "unknown"

请注意,-p-i不属于POSIX标准。这些值unknown在 Debian 上,因此 uname 只会打印 x86_64 一次。 Red Hat/CentOS 定义了该值。

另请阅读:Linux如何uname -m获取它的信息?为什么 uname -p 和 uname -m 和 arch 输出不同的架构?

答案3

看一下man uname

您可以在 64 位计算机上编译和运行 32 位程序(尽管这需要特殊设置),但无法在 32 位系统上运行 64 位二进制文​​件。这同样适用于许多虚拟机,但不是所有的*。因此,如果您有 64 位内核,那么您的硬件不可能仅是 32 位。

如果您想测试二进制程序的位数,请运行file /path/to/the/program

* 这取决于给定虚拟机运行的级别:(几乎)直接在主机 CPU 上执行二进制代码的虚拟机将无法在 32 位主机上运行 64 位代码。那些仿真某些CPU可以做到这一点,但由于仿真级别的原因,它们的效率较低。

相关内容