为什么呢:
- 32 位操作系统安装在 64 位 CPU 上时,可以运行旧的 16 位应用程序,
- 但是如果安装 64 位操作系统,它就无法直接运行这些应用程序而需要某种模拟(并不总是能完美运行)?
具体来说,我有一个 64 位处理器 (Intel Core 2 Duo)。当我安装 Windows XP 和 Windows 7 (均为 32 位) 时,它们可以运行旧式 DOS 和 16 位 Windows 应用程序。
现在我已经安装了 64 位版本的 Windows 7。为什么它不能再运行相同的应用程序了?
答案1
据我了解,这是因为在长模式(x64 原生)下运行时,CPU 本身不支持进入 16 位模式。请参阅维基百科。因此,为了支持 16 位模式,NTVDM(Windows 中的 16 位层)必须完全模拟 16 位处理器。
我想他们权衡了重新实现一个仿真层与使用现有的虚拟化软件(VirtualPC、VirtualBox)来处理这个问题,最后决定放弃 VDM。
答案2
因为64 位句柄有 32 个有效位:
请注意,64 位 Windows 不支持运行基于 16 位 Windows 的应用程序。
主要原因是句柄在 64 位 Windows 上有 32 个有效位。
因此,句柄不能被截断并传递给 16 位应用程序而不会丢失数据。
在 Windows 中,程序将“句柄”传递给操作系统,反之亦然(这些句柄是操作系统用来唯一标识特定资源(例如窗口)的数字)。
为了支持 16 位程序,32 位 Windows仅有的生成具有 16 个有效位的句柄——操作系统会忽略 16 个高位(即使程序不会利用这一事实)。因此没有程序可以与超过 2 16个对象进行交互,这实际上相当低。
然而,为了改善这种情况,64 位 Windows 将句柄中的有效位数增加到 32。但这意味着句柄无法在不丢失信息的情况下传递给 16 位程序。因此 16 位程序无法在 64 位 Windows 上运行。
答案3
对于 Windows,这是因为 x86 版本的操作系统包含 16 位仿真,允许它们运行那些较旧的 DOS 进程。在 x64 版本中,它们已经必须模拟 x86 执行(它们称之为 WoW64)才能允许 32 位进程运行,我猜使用 Wow64 进一步模拟 16 位仿真器会导致太多问题。
少数可识别的 16 位进程将会运行,因为仿真是硬编码来处理它们的,但其余进程无法运行,因为 x64 中不包含仿真。
请参阅以下有关缺乏 16 位支持的 Microsoft 文章: https://learn.microsoft.com/en-us/troubleshoot/windows-client/application-management/x64-windows-not-support-16-bit-programs
更新:微软似乎已将一些 16 位仿真重新添加到 Windows 的现代版本中,尽管是以仿真器/VM 的形式。也许现代虚拟化使这变得更容易,但有趣的选择:https://www.groovypost.com/howto/enable-16-bit-application-support-windows-10/
答案4
如果我错了,请纠正我,但据我了解,NTVDM 使用虚拟 8086 模式只是因为 Windows 特有的问题。根据我在这里找到的信息,x64 处理器上的兼容模式(在长模式下运行)支持完全“干净”的保护模式,16 位和 32 位:http://en.wikipedia.org/wiki/Long_mode,但不支持 386 的一些附加功能,例如虚拟 8086 模式。因此,它之所以不受支持,很可能是因为微软重新编程 NTVDM 是没有回报的,这可能需要添加更多的模拟,因为有些 16 位保护模式应用程序可以使用虚拟 8086,即使大多数应用程序不使用。我想,只要付出足够的努力,就可以编写出比在长模式下运行的 dosbox 更快的东西,因为有对 16 位应用程序的硬件支持。