理论上是可以的!

理论上是可以的!

许多软件仅支持 64 位机器,因为现在 32 位市场很小。然而,对于那些只能使用 32 位机器的人来说,这意味着无法安装较新的版本,这可能会导致安全问题。一个例子是火狐/Waterfox

一般来说,有没有办法从 64 位安装(.exe,.msi)制作 32 位程序?


查看更多:为什么要优先考虑浏览器的安全性?

答案1

不,这是不可能的。原因很广泛,甚至对于超级用户来说太广泛了,因为你需要解释 x86 和 x64 是如何创建的,以及这对编程有何影响。

但简单解释一下,可以归结为以下几点:

过去,我们有 16 位处理器。后来,英特尔制造了第一款 32 位处理器,也称为 x86。这就是 8086、80286(简称 286)等……这基本上是对 16 位处理器的修改,添加了额外的指令集。随着其处理器系列的每次新发布,英特尔都会向处理器系列添加更多指令集,最终导致指令集包含许多指令。英特尔不能直接删除旧指令集,因为这意味着没有向后兼容性,而英特尔希望继续支持较旧的处理器。

由于处理器是 32 位的,因此存在上限,即最高 32 位数。这意味着内存分配最多只能达到约 3.5GB。

以前的计算机还没有这么强大,所以如果英特尔从一开始就瞄准 64 位,那就意味着要花费更多的时间来计算相同的数字,因此性能会因为计算的数字更大而下降。

此外,32 位处理器长期以来运行良好。

后来,AMD 进入市场并推出了 64 位处理器。AMD 创建了自己的指令集以支持 64 位处理器,同时保留了英特尔 32 位指令集,以实现与 32 位处理器的向后兼容。

鉴于它们实际上是不同的指令集,创建 32 位程序的程序员将调用与创建 64 位程序时不同的例程。

现在我解释了为什么这很难做到,让我们继续从编程的角度来解释这个问题。

当你编写程序时,你首先要编写代码。如果你的代码向后兼容 32 位程序,那么你就无法使用 64 位数字,也无法同时寻址超过 3.5GB 的内存。基本上,你不能跨越 32 位程序面临的任何限制,否则你的程序就会崩溃。

由于您现在有了代码,因此只有您才能真正运行您的程序。为了让其他人可以运行您的程序,您必须将代码编译为可执行文件。这意味着易于阅读的代码被转换为处理器可以理解的指令。在编译期间,您可以指定您的程序是在 x86 还是 x64 上运行,编译器将使用基于该处理器架构的指令集生成代码。

如您所见,您不能只修改可执行文件并使其在其他可执行文件上运行。您首先需要将程序反编译为代码,然后使用不同的指令重新编译它。

话虽如此,考虑到为 x86 编译的程序本身可以在 x64 上运行,可以安全地假设程序员创建 x64 程序是因为他将打破 x86 架构的限制。因此,即使您将 x64 版本转换为 x86 版本,程序也可能不稳定,因为您将超越 32 位程序可以执行的限制。

答案2

理论上是可以的!

有多种方法可以字节码/内部表示特定架构的二进制文件,就像现代编译器/JITters 的工作方式一样。还有模拟器在当前架构上运行其他架构的程序。波克斯库姆是其中最著名的两个。参见:

尽管如此,我还没有看到有人为单个二进制文件编写这样的转换器,因为基本上你还需要模拟每个系统和库调用,在这种情况下,最好还是运行整个模拟器。Qemu 还能够仅模拟用户空间,因此实际上可以在没有成熟操作系统的情况下运行程序及其所需的库。但一如既往,模拟并不适用于对性能敏感的事情,如网页浏览或媒体播放

但是如果你的 x86 PC仅 32 位,这意味着它已经有 10 多年的历史了。几乎所有的英特尔 CPU来自 Pentium 4 Prescott2004向前(除了一些早期的 Atom CPU)和所有 AMD CPU来自 Athlon 642003向前支持 64 位。是时候更新了。

如果你的电脑足够新,可以支持 x86_64 和 VT-x,那么你可以在 32 位主机内运行 64 位虚拟机,但不建议这样做,而且性能甚至会比在 64 位主机上运行 32 位虚拟机更差。64 位操作系统并不需要像许多人想象的那样比 32 位操作系统多出两倍的内存,因此即使仅 2GB RAM,64 位操作系统通常仍然更快,因为寄存器数量增加了一倍,并且还有许多其他因素。1 到 2GB 的 RAM 之间还有争议,但我会选择 64 位


尽管如此,就安全措施而言,如今的 32 位操作系统通常安全补丁延迟因为开发人员都运行 64 位系统。例如,Meltdown 和 Spectre 补丁都是针对 32 位 Linux 推出的64 位 Linux 补丁发布已半年多. 为 64 位 Windows 10 提供 Meltdown 补丁构建 1507但 32 位用户仅受保护构建 1511.即使修补了,这些古老的机器通常面临更多性能影响因为他们没有新的指令和功能来抵消速度减慢。由于这个原因,MS在某些旧电脑上无法启用补丁除非用户明确告知。除了性能下降之外,32 位补丁还会更有可能出现错误因为测试者的数量明显较少。参见Linux 的 32 位内核自 Meltdown 缓解以来一直存在缺陷

英特尔的 Meltdown 漏洞被公布(以及 x86_64 得到缓解)几个月后才被发现Linux KPTI 支持 x86 32 位以减轻 Meltdown 的影响(从 1 月份披露到 7 月份的主线准备就绪),但事实证明,它最终暴露了一个仅限 3​​2 位的错误,该错误从 2018 年夏天一直存在于内核中,直到现在 [2019 年 7 月 28 日] 的 Linux 5.3。

有时他们根本不会得到修补因为没有足够的用户基础,因此没有动力投入巨大的努力。问题还在于无法修复如果是硬件错误,则无需硬件支持。例如,最近的旁道攻击(如 Spectre 或 L1TF)也需要更新的微代码,因此如果 CPU 和/或主板制造商不发布固件更新,您就倒霉了!这些错误在过去二十年中影响了 CPU,但不可能为非常旧的系统提供补丁。Windows 7 也放弃对 Pentium 3 的支持因为如果没有 SSE2 支持就很难修补,或者在这些 CPU 上运行它的人太少。

32 位 Windows 也更容易受到攻击,因为:

如果你在模拟器中运行 64 位操作系统,那么速度会更慢。即使你接受缓慢的速度并使用模拟器,主机上的恶意软件仍然可以在如此脆弱的系统中攻击虚拟机。同样,如果你真的关心安全性,是时候更新了,否则你将不得不无限期地忍受不太安全的系统

进一步阅读:

答案3

这在技术上是可行的;这个过程称为二进制翻译

您通常会发现,这种方法在不同平台的模拟器(例如 x86 上的 ARM、ARM 上的 x86)或没有硬件加速的虚拟化环境中得到应用。

你将面临的最大问题是,你不能简单地在真空中运行大多数程序。它们依赖于操作系统的澳大利亚商业信息局,这通常在不同的架构之间有所不同。这意味着您最终需要为与操作系统的所有交互(API 调用等)添加一个转换层,此时您可能还会模拟整个操作系统……phuclv 的回答中对此进行了描述。

答案4

将程序重新编译为 32 位目标

你的问题被描述为拥有一个 64 位二进制文​​件并希望将其作为 32 位二进制文​​件运行,这非常困难,你最终必须使用模拟器或其他复杂问题。

但是,如果您有高级语言的原始代码(就像 Firefox 的情况一样),您可能可以将其编译成 32 位代码。

在此,我谨不同意LPChip 答案程序员创建 x64 程序是因为他要突破 x86 架构的限制。他们这样做可能是因为这是默认目标,为了匹配本机架构,或者只是为了在用户有足够的 RAM 时能够使用更多内存。

某些功能(例如由 32 位计数器制成的 64 位计数器)会比使用本机寄存器稍慢。如果程序确实使用特定于 64 位的功能(例如内联 64 位汇编),它将无法工作。责任主要在于编译器对所使用的任何高级语言的支持(以及代码编写良好,因此一开始就具有很高的可移植性)。

如果我们专注于构建 Firefox / Waterfox,这对于新手来说并非易事(如今浏览器就像是一个独立的操作系统),而 Firefox Quantum 还需要一个 rust 编译器。不过,Linux 发行版仍然编译 32 位版本的 Firefox,表明它可以在 32 位下运行。

相关内容