Windows 中的 32 位和 64 位程序有什么区别

Ava*_*syu 5 windows windows-7 64-bit 32-bit

为什么 64 位程序不能在 32 位 Windows 副本上运行?我的 PC 如何知道我正在运行 64 位程序?该程序是否有一段代码告诉 Windows 它是一个 64 位程序,还是 Windows 根本无法执行它?

我看到同一个程序的两个版本的文件大小有显着差异,所以我认为是代码不同。是否可以修改代码并使程序运行?

use*_*686 9

免责声明:我一生中从未编写过操作系统。最好等待更有能力的人来回答,同时阅读一些 OSDev 文章

该程序是否有一段代码告诉 Windows 它是一个 64 位程序,还是 Windows 根本无法执行它?

两者都是。

  • 所有 Windows 可执行文件(.exe、.dll、……——通常是 PE 可执行文件)都有一个标头,告诉操作系统它们是为什么架构编译的。它可以是 Intel x86(16 位或 32 位)或 x86_64 或 Itanium 或 Alpha AXP……

    如果操作系统在标头中看到不兼容的架构,它将完全拒绝运行该程序。在其他情况下——例如,如果您尝试在 x86_64 上运行 x86 程序,它将知道该程序需要以与其他模式不同的模式运行。

  • 另一方面,程序内部的实际机器代码指令是不同的。(顺便说一下,这就是拥有不同体系结构的全部意义。)64 位 x86_64 体系结构比 32 位 x86 具有更多指令,而 32 位 x86 比 16 位具有更多指令。(Alpha 或 ARM 或 Itanium 之类的东西是如此不同,以至于几乎无法进行比较。)

    (即使不同的 x86 CPU 也有不同的指令集——随着时间的推移,它们在基本指令集之上积累了几十个扩展,例如“SSE”或“MMX”或“AES-NI”指令集,因此程序可能如果允许编译器针对最新的 CPU 对其进行优化,则它不会在像 Pentium 这样的旧 CPU 上运行。)

    并且即使对于跨两种架构相同的基本指令,数据大小也可以更大,最重要的是,内存地址更大——64 位架构通常被称为“64 位”,因为它们使用 64 位来表示位置内存等等。

    因此,即使您手动编辑标题以告诉操作系统不同的体系结构,您最终也只会得到一个每次都崩溃的程序。

  • 另一方面,x86_64 仍然具有与 x86 相同的指令(只是增加了更多的指令),因此操作系统在 64 位模式下运行 32 位程序相对容易;在处理该程序时,它主要只是注意仅使用 x86 功能。然而,这不适用于另一个方向——即使已经编写了 32 位操作系统来将 CPU 切换到 64 位模式以供您的程序使用,然后返回,程序仍然很容易发生某些事情操作系统无法应对。

如果你有源代码,你可以很容易地为不同的架构编译它(假设它是正确编写的——一些程序仍然假设内存指针总是 32 位宽……)但是如果你只有一个编译好的二进制文件,你就出局了运气。

  • 很好的解释。有一个方面需要澄清:“操作系统在 64 位模式下运行 32 位程序相对容易”。32 位程序不能在 64 位模式下运行,这样做并不容易。它们在操作系统的不同子系统中运行,在本例中为 WOW64(Windows 64 上的 Windows)。在某些版本的 Windows 中,您可以删除 WOW64,并且 32 位 Windows 程序将无法在这样的环境中运行。 (3认同)