所有支持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默认编译器的信息。