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


9

来自的输出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

但是/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

系统的其他方面似乎也有矛盾:

root@debian:~ # echo $HOSTTYPE
i486

root@debian:~ # getconf LONG_BIT
32

Answers:


13

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


谢谢!您的答案就像水晶球一样清晰::D以前从未注意到Debian像这样对待内核软件包。
kiiwii 2014年

1
事实并非如此:32位程序在64位内核上运行时可以使用其虚拟地址空间的整个4Gio(除非它们以ADDR_LIMIT_3GB个性运行)。
ysdx '16

@ysdx那么限制为2GB是Windows特定的东西,并且32位用户空间中允许0x80000000以上的地址吗?
Paul Stelian

1
@PaulStelian,在32位Windows上,默认情况下您会限制为最低2GB的虚拟内存以实现回溯兼容性(我认为某些程序用于为特殊目的保留指向最高2GB的虚拟内存的指针)。您可以在可执行文件(docs.microsoft.com/fr-fr/cpp/build/reference/…)中设置LARGEADDRESSAWARE标志,以选择启用对整个4GB虚拟内存的访问。
ysdx

15

所有支持x64指令集(也称为x86_64或amd64)的处理器也支持x86指令集(也称为i386或i686,严格来说是x86的特定版本)。这同样适用于ARM A64(出现在ARMv8新的64位指令集)和A32(对于“经典”的32位指令集的名称),对SPARC64SPARC,我相信了MIPS64MIPS。因此,在所有这些体系结构系列中,如果处理器可以运行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 -march显示内核被编译的体系结构。Linux可以(通过personality)系统调用来设置进程的“个性” 。您可以使用以下setarch命令以不同的个性运行子流程;setarch i686 someprogramlinux32 someprogram环境中的运行指定程序,其中uname -m返回i686,同时setarch amd64 someprogramlinux64 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默认编译器的信息。


1
的确,是否将32位Solaris切换到64位模式以先切换到64位进程,然后再返回?这必须有巨大的开销,并且没有任何意义,因为那时内核实际上是64位的。
Ruslan 2014年

1
@Ruslan为什么会有巨大的开销?在上下文切换上切换模式不会花费太多(如果有的话,我不太了解x86的水平)。内核保留为32位:用于内核映射的32位虚拟地址,使用32位指令集。
吉尔斯(Gillles)“所以-别再邪恶了” 2014年

1
内核必须维护一些特定于64位的数据结构,以支持64位应用程序(至少支持64位的页表)。这使得它实际上不是32位内核。我还没有尝试深入了解amd64架构,但是与使用专门设计的兼容模式相比,我认为关闭64位支持将有相当大的开销。
Ruslan 2014年

1
@Ruslan仅支持64位的页表,这是非常必要的,而且成本很小。正确的内核设计可以避免其他所有问题。我从未研究过Solaris内核,我想他们已经安排好使其足够灵活(他们以前有使用SPARC64的经验)。
吉尔斯(Gillles)“所以-别再作恶了”
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.