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

xyz*_*xyz 5 linux 64bit hardware architecture

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
Run Code Online (Sandbox Code Playgroud)

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

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

Gil*_*il' 7

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

  • 可以看到是否CPU为64位,32位,或通过检查能够两者的flags一致/proc/cpuinfo。您必须知道架构系列中可能存在的标志。例如,在 i386/amd64 平台上,该lm标志标识支持 amd64 的 CPU(没有该标志的 CPU 仅支持 i386)。

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

      [ "$(uname -m)" = "x86_64" ]    # Assuming a PC
    
    Run Code Online (Sandbox Code Playgroud)
  • 您可以通过使用命令查询LSB支持来查看用户空间中可用的内容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 位程序,反之亦然(不太常见)。

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

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

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

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