在具有 64 位处理器的 32 位操作系统上安装 64 位程序

cre*_*lee 8 linux 64bit arm 32bit

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

我在 raspberry pi 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
Run Code Online (Sandbox Code Playgroud)

Gil*_*il' 20

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

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

在 ARMv8 上,32 位 (Aarch32) 内核无法运行 64 位 (Aarch64) 进程。这是处理器的限制。

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

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

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

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

请注意,64 位程序可以做而 32 位程序不能做的唯一一件事是寻址超过大约 3GB 的虚拟内存,这在具有 1GB RAM 的系统上的实用性有限。您可能会从额外的、更大的寄存器中获得性能优势,但也会因额外的内存访问而损失性能。

  • @Wildcard 简而言之,在任何给定时间,处理器要么处于 32 位模式(“Aarch32 执行状态”)并期待 Aarch32 指令,要么处于 64 位模式期待 Aarch64 指令。切换模式的唯一方法是在进程和内核(或内核和管理程序,或管理程序和监视器)之间切换。切换到低权限模式无法从32位切换到64位,切换到高权限模式总是恢复之前的模式。因此,不可能安排 32 位代码以比 64 位代码更高的特权运行。 (3认同)
  • @Serge:您所描述的适用于 286 -> 386:您可以在带前缀的 16 位实模式下使用 32 位操作数大小,其中默认操作数大小为 16。但英特尔甚至没有开发 x86-64;那是 AMD(这就是为什么它有时仍然被称为 AMD64)。不,您根本不能在 32 位模式下使用 64 位操作数大小。REX 前缀重新利用了一个字节的 `inc`/`dec` 寄存器操作码(`0x40 .. 0x4F`)。在长模式(64 位模式)下,默认操作数大小为 32,但默认地址大小为 64。 (3认同)
  • @Wildcard *(cont.)* 大概是这个限制的原因是有很多 Aarch64 特定的处理器状态并且 Aarch32 代码无法访问。例如,Aarch32 内核将无法保存 Aarch64 进程的寄存器。 (2认同)
  • @crellee, Gilles:您无需查看外来操作系统即可找到具有 64 位用户空间的 32 位内核示例。极受欢迎的 Mac OS X 10.4 "Tiger"、10.5 "Leopard" 和 10.6 "Snow Leopard" 内核在几乎所有 Mac 的 _K32_ 配置中提供,除了少数允许启动 Snow Leopard 的 _K64_ 的服务器机器,但所有它们能够运行 64 位用户态进程(限制逐渐减少)。 (2认同)
  • @Wildcard:如果兼容模式内核/长模式用户空间是设计考虑因素,则 IDK。为了保存上下文切换的整数寄存器状态,Solaris(和 OS X)必须仍处于长模式才能访问 r8-r15 和 rax-rsi 的上半部分。如果`xsave` / `xrstor` 在兼容模式下,IDK 也可以保存完整的向量状态。所以它当然不是*好*支持或明确迎合的。内核入口点可能在 64 位(长)模式下运行,并在跳转到内核的其余部分之前切换到 32 位(兼容)模式。(x86 模式切换只需要一个 `far jmp` 并且不会影响 regs。) (2认同)

Ign*_*ams 5

在某些架构上,是的。但不是在 ARM 或 x86 上。

您可以使用 QEMU 来模拟 64 位系统,但您不想这样做。

  • 如果内核支持,您可以在 x86 上的 32 位内核之上运行 64 位程序。Linux 没有,但 Solaris 有。在手臂上这是不可能的。 (3认同)