如何从 64 位版本制作 32 位程序?

Ook*_*ker 5 64-bit 32-bit conversion cpu-architecture

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

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


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

LPC*_*hip 12

不,这是不可能的。鉴于您需要解释 x86 和 x64 是如何创建的基础知识,以及这通常如何影响编程,原因非常广泛,对于超级用户来说甚至可能过于宽泛。

但简单解释一下,归结为:

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

由于处理器是32位,所以有一个上限,即最高32位。这意味着,内存分配最多只能达到 3.5GB。

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

此外,32 位处理器在很长一段时间内都运行良好。

在某个时候,AMD 进入市场并推出了 64 位处理器。AMD 创建了自己的指令集以允许使用 64 位,同时保持 32 位的 intel 指令集完整,以允许向后兼容 32 位。

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

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

编写程序时,首先要编写代码。如果您的代码向后兼容 32 位程序,则您根本无法使用 64 位数字,也不能同时寻址超过 3.5gigs 的内存。基本上,您不能跨越 32 位程序面临的任何限制,否则您的程序将在这样做时崩溃。

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

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

也就是说,考虑到为 x86 编译的程序可以在 x64 上本地运行,可以安全地假设程序员创建了一个 x64 程序,因为他将打破 x86 架构的限制。因此,即使您将 x64 版本转换为 x86 版本,该程序也很可能会不稳定,因为您将跨越 32 位程序可以执行的操作的限制。

  • 写得不错。从技术上讲并不完全正确,但作为一个简化的解释,它会做得很好。 (6认同)
  • 谢谢。是的,如果你必须限制自己,就很难让它在技术上正确。这是我能做的最好的事情,让它适合超级用户。 (2认同)

phu*_*clv 9

理论上是可以的!

有多种方法可以将中性字节码/内部表示转换为特定架构的二进制文件,例如现代编译器/JITters 的工作方式。还有一些模拟器可以在当前架构上运行另一种架构的程序。Bochsqemu是最著名的两个。看:

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

但是,如果您的 x86 PC仅为 32 位,则意味着它已经有 10 多年的历史了。几乎所有来自2004年Pentium 4 Prescott之后的Intel CPU (除了一些早期的 Atom CPU)和所有来自2003年Athlon 64之后的AMD CPU都支持 64 位。是时候更新了。

如果您的 PC 足够新,可以支持 x86_64 和 VT-x,那么您可以在 32 位主机中运行 64 位虚拟机,但不推荐这样做,性能会比运行 64 位主机更差内部 32 位 VM。与许多人想象的 32 位操作系统相比,64 位操作系统不需要两倍的内存,因此即使只有 2GB 的 RAM,64 位操作系统通常仍然更快,因为寄存器的数量和许多其他事情。1 到 2GB 的 RAM 之间有争议,但我会选择 64 位


也就是说,在安全措施方面,由于开发人员都运行 64 位系统,因此现在的 32 位操作系统通常会延迟发布安全补丁。例如,在 64 位 Linux 打完补丁之后的半年多,针对 32 位 Linux 推送了 Meltdown 和 Spectre补丁。为 64 位 Windows 10 build 1507及更高版本提供了 Meltdown 补丁,但 32 位用户仅从build 1511 开始受到保护。而且即使打了补丁,这些古老的机器通常也会面临更大的性能影响,因为它们没有新的指令和功能来抵消减速。由于这个原因,MS没有在一些旧电脑上启用补丁除非用户明确告知。除了性能下降之外,由于测试人员的数量明显减少,32 位补丁更有可能出错。请参阅Linux 的 32 位内核自因崩溃缓解以来一直存在漏洞

不仅在英特尔的 Meltdown 漏洞发布(并且 x86_64 得到缓解)之后几个月才看到Linux KPTI 支持 x86 32 位以缓解 Meltdown(从 1 月的披露到 7 月的主线准备就绪),而且事实证明它最终暴露了从 2018 年夏季到现在 [2019 年 7 月 28 日] Linux 5.3 中存在的唯一 32 位错误。

有时他们根本不会打补丁,因为没有足够的用户群,因此没有动力花费大量精力。如果它是硬件错误,则在没有硬件支持的情况下也无法解决此问题。例如最近的像 Spectre 或 L1TF 这样的侧信道攻击也需要更新的微码,所以如果 CPU 和/或主板制造商不发布固件更新,那你就不走运了!这些错误影响了过去二十年的 CPU,但不可能为非常旧的系统提供补丁。Windows 7 也放弃了 Pentium 3 支持,因为没有 SSE2 支持很难打补丁,或者因为在这些 CPU 上运行它的人太少。

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

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

进一步阅读:

  • “这种古老的机器将面临更多的性能影响,因为它们没有新的指令和功能来抵消减速。” - **这不完全正确。** 绝对没有理由,我不能运行带有 i7 8086K 和 Windows 10 的 32 位操作系统。仅仅因为系统运行的是 32 位操作系统并不意味着它是古老的。 (2认同)

Bob*_*Bob 5

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

您经常会发现,这在不同平台(例如 x86 上的 ARM、ARM 上的 x86)或硬件加速不可用的虚拟化的仿真器中得以实施。

您将面临的最大问题是您不能简单地在真空中运行大多数程序。它们取决于操作系统的ABI,它通常因架构而异。这意味着您最终需要为与操作系统的所有交互(API 调用等)添加一个翻译层,此时您不妨模拟整个操作系统……这在 phuclv 的回答中有所描述。