所有支持x64指令集(也称为x86_64或amd64)的处理器也支持x86指令集(也称为i386或i686,严格来说是x86的特定版本)。这同样适用于ARM A64(出现在ARMv8新的64位指令集)和A32(对于“经典”的32位指令集的名称),对SPARC64和SPARC,我相信了MIPS64和MIPS。因此,在所有这些体系结构系列中,如果处理器可以运行64位代码,那么它也可以运行32位代码。
Linux内核支持使用64位内核运行32位用户域代码(我认为在上述所有体系结构家族中)。内核必须是同构的(所有64位或所有32位),并且每个进程都必须是同构的,但是您可以在64位内核上混合使用32位和64位进程。反之则不可能:对于32位内核,您将无法运行64位进程。
这是Linux中的一种设计选择,其动机是希望在64位安装上运行现有的32位二进制文件。其他Unix变体也做出了不同的选择:Solaris可以在32位内核上运行64位程序,反之亦然,而OpenBSD不能在64位内核上运行32位程序。
你可以得到有关CPU的信息在/proc/cpuinfo
。如果您的x86 CPU具有该lm
标志,则为64位CPU。
默认情况下,uname -m
或arch
显示内核被编译的体系结构。Linux可以(通过personality
)系统调用来设置进程的“个性” 。您可以使用以下setarch
命令以不同的个性运行子流程;setarch i686 someprogram
或linux32 someprogram
环境中的运行指定程序,其中uname -m
返回i686
,同时setarch amd64 someprogram
或linux64 someprogram
运行环境中的指定的节目,其中uname -m
的回报amd64
。
file /sbin/init
告诉您init
程序要编译的架构。尽管可以在安装中混合使用32位和64位可执行文件,但是通常所有核心OS程序都来自同一体系结构,因为它易于管理。
$HOSTYPE
是一个bash变量,它告诉您bash
程序是针对哪种体系结构进行编译的。
getconf LONG_BIT
让您知道默认的C编译器是否设置为编译32位或64位程序。更精确的测试是编译并运行打印sizeof(void*)
或sizeof(size_t)
- 的程序,调用getconf
只能提供有关getconf
默认编译器的信息。