64 位内核,但所有 32 位 ELF 可执行运行进程,这是怎么回事?

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认为是默认编译器的信息。


jor*_*anm 13

64 位内核可以安装在 Debian 32 位上。您可以在其软件包页面上看到 amd64 内核可用于 32 位 Debian 。这可以用作使用启用 PAE 的内核的替代方法来支持超过 4G 的总 RAM。请注意,32 位二进制文​​件仍然无法访问每个进程大约 3G 的 RAM。