我很好奇。是否可以在具有 64 位处理器的 32 位操作系统上安装 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 位处理器的 32 位操作系统上安装 64 位程序?
原则上是可以的,但是处理器和操作系统必须支持它。
在 ARMv8 上,32 位 (Aarch32) 内核无法运行 64 位 (Aarch64) 进程。这是处理器的限制。
还有其他处理器没有此限制,例如,可以在 x86_64 处理器上的 x86_32 内核之上运行 x86_64 进程,但很少有内核支持它,大概是因为它的实用性有限(大多数情况下,您保存一个内核中的 RAM 位(将其设为 32 位)。 Linux 不支持,但 Solaris 支持。
如果您运行 64 位操作系统,则可以保留现有的 32 位操作系统核心。 Aarch64 Linux 内核可以运行 Aarch32 进程。 Raspbian 不支持开箱即用,因此您需要同时维护 32 位操作系统和 64 位操作系统。您可以使用其中之一作为主操作系统(即运行在里面和系统服务),另一个使用 chroot 运行特定程序。看如何在 64 位 Debian/Ubuntu 上运行 32 位程序?一个实用的方法。
请注意,您需要安装 64 位程序所需的所有库。任何给定进程都必须是完全 32 位或完全 64 位,因此您不能在 64 位可执行文件中使用 32 位库。
除非您有充分的理由保留 32 位系统,否则如果您需要运行 64 位可执行文件,那么安装 64 位系统会更容易。
请注意,64 位程序可以执行但 32 位程序不能执行的唯一操作是寻址超过 3GB 的虚拟内存,这在具有 1GB RAM 的系统上的实用性有限。您可能会从额外的、更大的寄存器中获得性能优势,但也会因额外的内存访问而损失性能。
答案2
在某些架构上,是的。但不适用于 ARM 或 x86。
您可以使用 QEMU 来模拟 64 位系统,但您不想这样做。
答案3
仅将内核升级到 64 位内核,这样您就可以运行 64 位二进制文件。本质上,它将在 32 位兼容模式下运行你的整个发行版,而你唯一的 64 位 mongodb 将是其正常模式。
但它不值得它的价格。最好将 mongodb 切换到 32 位。但是,在这种情况下有一个限制,即您的数据库不能大于 2GB,因为它直接将整个内容映射到虚拟内存中。如果您的数据库更大,则仅保留内核升级。 (感谢@duskwuff 的扩展!)
顺便说一句,如果您的数据库不需要很大的负载,或者您可以在它之前使用一些缓存解决方案(例如:另一个,但 32 位 mongo),那么 cpu 模拟就可以工作。为此,开始谷歌搜索“qemu qemu-system-x86_64”。尽管这样的解决方案可能有不可行的工作需求,并且在生产环境中可能被认为很奇怪。
在你的位置,如果 32 位 mongo 足够适合我的数据库,我会使用 32 位 mongo,如果不够的话,我会使用 64 位内核。
答案4
我在 32 位系统上使用 64 位内核已经有一段时间了(这是本机运行 64 位可执行文件的最低先决条件,加上所有必需的 64 位库)。我不会推荐它。最终让我升级到 64 位系统的原因是我认识到 ALSA 标头(尤其是 Midi ioctl 调用)与大小无关,这意味着在 32 位模式下编译的内容无法与 64 位内核良好地互操作。
当然,这可以被认为是一个值得修复的错误,但是 ALSA 开发的步伐几乎被冻结了,我迫不及待地等待了几年混合平台支持得到修复(并且以非二进制兼容的方式修复非混合平台)可执行文件),而对混合平台的兴趣无论如何都在快速减少。
对于某些应用程序,东西在混合模式下工作(实际上令人惊讶),但如果您所做的不仅仅是与内核接口的基本部分,即使是通过外部库,那就过于乐观了。