kii*_*wii 9 linux 64bit 32bit cpu-architecture
输出uname:
root@debian:~ # uname -a
Linux 5asnb 2.6.32-5-amd64 #1 SMP Mon Jun 13 05:49:32 UTC 2011 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)
但是,/sbin/init可执行文件显示为 32 位:
root@debian:~ # file /sbin/init
/sbin/init: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped
Run Code Online (Sandbox Code Playgroud)
该系统的其他方面似乎也有矛盾:
root@debian:~ # echo $HOSTTYPE
i486
root@debian:~ # getconf LONG_BIT
32
Run Code Online (Sandbox Code Playgroud)
Gil*_*il' 15
所有支持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 位可执行文件,但通常所有核心操作系统程序都来自相同的体系结构,因为它更易于管理。
$HOSTYPE是一个 bash 变量,它告诉你bash程序是为什么架构编译的。
getconf LONG_BIT让您知道默认 C 编译器是否设置为编译 32 位或 64 位程序。更精确的测试是编译一个并运行一个程序,该程序打印sizeof(void*)或sizeof(size_t)——调用getconf只能提供有关getconf认为是默认编译器的信息。