在具有64位处理器的32位OS上安装64位程序


8

我很好奇。是否可以在具有64位处理器的32位OS上安装64位程序?

我在树莓派3上运行Linux,尝试安装较新版本的MongoDB:

armv7l GNU/Linux
PRETTY_NAME="Raspbian GNU/Linux 9 (stretch)"
NAME="Raspbian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
ID=raspbian
ID_LIKE=debian

1
考虑改用64位操作系统。Raspbian落后于时代。RPi3已提供64位Fedora
迈克尔·汉普顿

Answers:


19

是否可以在具有64位处理器的32位OS上安装64位程序?

原则上可以,但是处理器和操作系统必须支持它。

在ARMv8上,32位(Aarch32)内核不能运行64位(Aarch64)进程。这是处理器的局限性。

还有其他处理器没有此限制,例如,可以在x86_64处理器上的x86_32内核上运行x86_64进程,但是很少有内核支持它,大概是因为它的实用程序有限(大多数情况下,您保存了一个内核中的32位RAM)。Linux不支持它,但是Solaris支持。

如果运行64位内核,则可以保留现有的32位OS 。Aarch64 Linux内核可以运行Aarch32进程。Raspbian不支持此功能,因此您需要同时维护32位OS和64位OS。您可以将其中一个用作主操作系统(即一个运行init和系统服务的操作系统),另一个可以使用chroot运行特定的程序。请参阅如何在64位Debian / Ubuntu上运行32位程序?一个实用的方法。

请注意,您将需要安装64位程序所需的所有库。任何给定的进程都必须完全是32位或完全是64位,因此您不能在64位可执行文件中使用32位库。

除非有充分的理由要保留32位系统,否则如果需要运行64位可执行文件,则安装64位系统会更容易。

请注意,64位程序可以执行但32位程序不能执行的唯一操作是寻址大约3GB以上的虚拟内存,这在具有1GB RAM的系统上的实用性有限。额外的更大的寄存器可能会带来性能优势,但是额外的内存访问也会降低性能。


3
简而言之,在任何给定时间,处理器要么处于32位模式(“ Aarch32执行状态”)并期望Aarch32指令,要么处于64位模式而期望Aarch64指令。切换模式的唯一方法是在进程和内核(或内核和虚拟机管理程序,或虚拟机管理程序和监视器)之间切换。切换到低特权模式不能从32位切换到64位,而切换到高特权模式总是可以恢复先前的模式。因此,不可能安排32位代码以比64位代码更高的特权运行。
吉尔(Gillles)“所以-别再作恶了”

2
@Wildcard (续)可能受到此限制的原因是,存在许多特定于Aarch64的处理器状态,并且Aarch32代码无法访问。例如,Aarch32内核将无法保存Aarch64进程的寄存器。
吉尔斯(Gillles)“所以-别再作恶了”

2
@ crellee,Gilles:您无需查看特殊的OS即可查找具有64位用户群的32位内核的示例。K32配置中几乎所有Mac都非常流行的Mac OS X 10.4“ Tiger”,10.5“ Leopard”和10.6“ Snow Leopard”内核,除了少数允许启动Snow Leopard的K64的服务器计算机外,其他所有计算机它们能够运行64位用户域进程(限制越来越少)。
Iwillnotexist Idonotexist 17/12/12

3
@Serge:您所描述的对于286-> 386是正确的:您可以在带前缀的16位实模式下使用32位操作数大小,默认操作数大小为16。但是Intel甚至没有开发x86-64。那就是AMD(这就是为什么它有时仍被称为AMD64)的原因。不,您根本不能在32位模式下使用64位操作数大小。REX前缀重新使用一字节inc/ dec寄存器操作码(0x40 .. 0x4F)。在长模式(64位模式),默认的操作数大小是32,但默认地址大小是64
彼得科尔德

2
@Wildcard:如果完全采用兼容模式内核/长模式用户空间,则为IDK。要为上下文切换保存整数寄存器状态,Solaris(和OS X)必须仍然处于long模式才能访问r8-r15和rax-rsi的上半部分。IDK if xsave/ xrstor在兼容模式下也可以保存完整的向量状态。因此,它肯定没有得到很好的支持或明确满足。内核入口点可能在64位(长)模式下运行,并在跳转到内核的其余部分之前切换到32位(兼容)模式。(x86模式切换仅需a far jmp且不影响注册。)
Peter Cordes

5

在某些体系结构上,是的。但不是在ARM或x86上。

您可以使用QEMU来仿真64位系统,但是您不想这样做。


使用QEMU之类的模拟器来安装和运行mongo数据库是否会造成灾难?
crellee

这将非常非常慢。而且不值得,因为RPi3只有1GB的RAM。考虑改用32位软件包。
伊格纳西奥·巴斯克斯

2
如果内核支持,则可以在x86的32位内核之上运行64位程序。Linux没有,但是Solaris没有。武装起来是不可能的。
吉尔斯(Gillles)“所以-别再作恶了”

@ IgnacioVazquez-Abrams试试这个。它很慢,但不是灾难性的。主要原因是qemu仅在用户空间中执行cpu仿真,内核调用(即io等待时间)保持不变。在家庭系统上,我喜欢为某些工具使用arm或mips二进制文件,只是为了好玩:-)或者,有时,如果cpu负载不大,则某些安全性很重要但cpu强度不高的工具可以使用一些工具。外来的体系结构,以减少缓冲区溢出攻击的可能性。
彼得-恢复莫妮卡的时间

4

仅将内核升级到64位内核,因此您将能够运行64位二进制文​​件。本质上,它将以32位兼容模式运行您的整个发行版,而您的唯一64位mongodb将是其正常模式。

但是,它不值得它的价格。最好将mongodb切换为32位。但是,在这种情况下,存在一个限制,即您的数据库不能最大为2GB,因为它直接将整个内容映射到虚拟内存中。如果您的数据库更大,则仅保留内核升级。(感谢@duskwuff扩展名!)

顺便说一句,如果您的数据库不需要很大的负载,或者您可以在它之前使用一些缓存解决方案(例如:另一个但32位的mongo),则可以使用cpu仿真。为此,请开始搜索“ qemu qemu-system-x86_64”。尽管这样的解决方案可能需要不可行的工作,并且在生产环境中可能被认为很奇怪。

在您的地方,如果足够用于我的数据库,我将使用32位mongo,否则,将使用64位内核。


很有道理,但是您如何将mongodb切换到32bit?
crellee

@crellee apt-get install mongodb:i386或类似的东西?
peterh-恢复莫妮卡

错误:将返回一个“386无法找到包的MongoDB”
crellee

1
运行32位MongoDB是一个坏主意。该数据库是内存映射的,因此在32位系统上运行该数据库会将您的数据限制为<2GB。
duskwuff -inactive

是的,并且您限于版本:2.4.14,它有很多限制。
crellee

3

我想说这不是不可能,但确实很难管理。由于这样的32位操作系统通常仅打包(并接受)32位二进制文​​件和库,因此您需要进行大量调整才能使其与64位操作系统兼容。

RPI3面临的主要问题是缺少64位内核(至少对于raspbian)。

长话短说:使用32位二进制文​​件,就可以了。

编辑:

如果要使用64位内核,则需要安装支持ARM64体系结构的发行版。您应该看一下ArchLinux ARM(在此处),但是它并不完全受支持。

您要查找的信息位于安装选项卡的底部。

您也可以看一下官方的debian端口,但是RPI3端口仍然存在很大的问题,因此由您自己决定是否值得这样做


问题是CPU以32位模式(由内核)启动,因此它看起来像旧的32位计算机。64位寄存器和指令不可用。
约翰·迈伦(JohanMyréen)'17

1
是的,这就是为什么您需要64位内核(Thomas提到)的原因。
斯蒂芬·基特

感谢您的解释。因此,对我来说,解决方案是在RPI3上安装另一个操作系统?
crellee

我刚刚更新了答案。

@Thomas,某些发行版确实支持从32位变体开始的组合32- / 64位操作。Debian是一个示例,至少在x86上:您可以安装该i386变体,其中包括一个64位内核,该内核也允许安装64位库和二进制文件。尽管Debian中的ARM支持不允许在ARM系统上使用(但是,如果以开头,则可以安装Combine arm64和)。armhfarm64
斯蒂芬·基特

1

我已经在64位内核和32位系统上使用了相当长的时间(这是本地运行64位可执行文件以及所有必需的64位库的最低前提条件)。我不推荐它。最终让我升级到64位系统的最终原因是,意识到ALSA标头(尤其是与Midi ioctl调用有关的标头)与大小无关,这意味着以32位模式编译的内容无法与64位内核很好地互操作。

当然,可以认为这是一个值得修复的错误,但是ALSA的开发步伐几乎停滞了,我迫不及待地想了几年来修复混合平台支持(对于非混合平台,则采用非二进制兼容的方式)无论如何,当人们对混合平台的兴趣正在迅速减少时。

对于某些应用程序,东西在混合模式下工作(实际上令人惊讶的是,很多),但是如果您所做的工作超出了与内核接口的基本份额,即使是通过外部库,也太乐观了。

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.