41 windows windows-7 64-bit 16-bit
为什么是这样:
更具体地说,我有一个 64 位处理器(Intel Core 2 Duo)。当我安装了 Windows XP 和 Windows 7(均为 32 位)时,它们可以运行旧的 DOS 和 616 位 Windows 应用程序。
现在我已经安装了 64 位版本的 Windows 7。为什么它不能运行那些相同的应用程序了?
Mat*_*ker 28
据我了解,这是因为在 Long Mode(x64 native)下运行时,CPU 本身不支持进入 16 位模式。参见维基百科。因此,为了支持 16 位模式,NTVDM(Windows 中的 16 位层)必须完全模拟 16 位处理器。
我想他们权衡了重新实现仿真层与使用已经存在的虚拟化软件(VirtualPC、VirtualBox)来处理这个问题,并决定削减 VDM。
use*_*686 16
请注意,64 位 Windows 不支持运行 16 位基于 Windows 的应用程序。
主要原因是句柄在 64 位 Windows 上有 32 个有效位。
因此,句柄不能被截断并传递给 16 位应用程序而不会丢失数据。
在 Windows 中,程序将“句柄”传递给操作系统,反之亦然(操作系统使用这些数字来唯一标识特定资源,例如窗口)。
为了支持 16 位程序,32 位 Windows仅生成具有 16 位有效位的句柄——操作系统忽略高 16 位(即使程序不会利用这一事实)。所以没有一个程序可以与超过 2 16 个对象进行交互,这实际上是相当低的。
但是,为了改进这一点,64 位 Windows 将句柄中的有效位数量增加到 32。但是现在这意味着句柄不能在不丢失信息的情况下传递给 16 位程序。因此 16 位程序无法在 64 位 Windows 上运行。
Sql*_*yan 11
对于 Windows,这是因为 x86 版本的操作系统包括 16 位仿真,允许它们运行那些较旧的 DOS 进程。在 x64 版本中,他们已经不得不模拟 x86 执行(他们称之为 WoW64)以允许 32 位进程运行,我猜使用 Wow64 进一步模拟 16 位模拟器造成了太多问题。
少数可识别的 16 位进程将运行,因为模拟是硬编码来处理它们的,但其余的将不起作用,因为 x64 中不包含模拟。
请参阅 MSKB 文章中的“无 16 位代码”:http : //support.microsoft.com/kb/282423
Dos 应用程序和 16 位 Windows 应用程序的情况有所不同。
对于 Dos 应用程序,问题在于虚拟 8086 模式在长模式下不可用。这是 CPU 架构的限制。
对于 16 位 Windows 应用程序(在 16 位保护模式下运行),原因是 MS 没有准备好实施合适的兼容层。Amusingly Wine 完全能够在 64 位 Linux 上运行 16 位 Windows 应用程序。