免责声明:我一生中从未编写过操作系统。最好等待更有能力的人来回答,同时阅读一些 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 位宽……)但是如果你只有一个编译好的二进制文件,你就出局了运气。
归档时间: |
|
查看次数: |
8908 次 |
最近记录: |