假设任何x86 编译的应用程序将始终在该应用程序编译的同一操作系统的 x64 版本下运行是否安全?
据我所知,对于Windows 操作系统,答案是“是”。Windows x86 仿真层是为相同目的而构建的。但是,我只想从这里的专家那里再次确认这一点。
Unix、Linux呢?有什么注意事项吗?
假设任何x86 编译的应用程序将始终在该应用程序编译的同一操作系统的 x64 版本下运行是否安全?
据我所知,对于Windows 操作系统,答案是“是”。Windows x86 仿真层是为相同目的而构建的。但是,我只想从这里的专家那里再次确认这一点。
Unix、Linux呢?有什么注意事项吗?
不,要运行 x86 代码,它需要在兼容模式或传统模式下运行。如果操作系统不支持在兼容模式下运行进程,则程序很可能无法运行。
Linux 和 IFAIK Windows 目前支持兼容模式,而且看起来更多的人也或多或少地支持它。我的理解是 NETBSD 需要一个特殊的模块来支持这一点,所以不一定没有特别注意它会得到支持,这表明很可能存在完全放弃可能性的操作系统。
此外,未来还有可能破坏向后兼容性,这已经在 CPU 上发生了,因为虚拟 x86 模式不再可用于长模式,即您无法在 64 位 Windows 或 Linux 下运行 16 位程序.
它也可能发生在操作系统方面,开发人员可以决定不再支持兼容模式。请注意,这也可能发生过,因为可以通过首先切换到传统模式来支持虚拟 x86 模式,但如果可能的话,似乎没有人愿意这样做。同样,Windows 或 Linux 开发人员似乎都没有考虑实现在 64 位内核中以旧模式运行内核代码的可能性。
前两节表明,未来甚至现在的迹象可能并不总是可能的。
此外,由于这是一个 C++ 问题,您必须问自己一个问题,为什么要做出这样的假设?如果写得好,您的代码应该能够编译为 64 位模式 - 因为您没有依赖特定宽度的数据类型,是吗?
不,我们有一大堆 Debian 服务器缺少 Multi-Arch i386(32 位)库。在 Windows Server Core 上,WoW64(32 位子系统)是可选的。因此,对于 Linux 和 Windows,已知的 64 位系统不会运行 x86 可执行文件。