为什么会这样:
- 当32位操作系统安装在64位CPU上时,可以运行旧的16位应用程序,
- 但是,如果您安装的是64位操作系统,则无法直接运行那些应用程序,并且需要某种模拟(并非总是能完美运行)?
更具体地说,我有一个64位处理器(Intel Core 2 Duo)。当我安装Windows XP和Windows 7(均为32位)时,它们可以运行旧的DOS和616位Windows应用程序。
现在,我已经安装了Windows 7的64位版本。为什么它不能再运行那些相同的应用程序?
为什么会这样:
更具体地说,我有一个64位处理器(Intel Core 2 Duo)。当我安装Windows XP和Windows 7(均为32位)时,它们可以运行旧的DOS和616位Windows应用程序。
现在,我已经安装了Windows 7的64位版本。为什么它不能再运行那些相同的应用程序?
Answers:
据我了解,这是因为以长模式(x64本机)运行时,CPU本身不支持进入16位模式。参见维基百科。因此,为了支持16位模式,NTVDM(Windows中的16位层)必须完全模拟16位处理器。
我想他们权衡了重新实现仿真层与使用现成的虚拟化软件(VirtualPC,VirtualBox)来解决这个问题的决心,因此决定削减VDM。
请注意,64位Windows不支持运行基于Windows的16位应用程序。
主要原因是在64位Windows上,句柄具有32个有效位。
因此,句柄不能被截断并传递给16位应用程序而不会丢失数据。
在Windows中,程序将“句柄”传递给操作系统,反之亦然(操作系统用来唯一标识特定资源(例如窗口)的数字)。
为了支持16位程序,32位Windows 仅生成具有16个有效位的句柄- OS会忽略这16个高位(即使程序不利用这一事实)。因此,没有程序可以与2 16个以上的对象进行交互,这实际上是相当低的。
但是,为了改善这一点,64位Windows将句柄中的有效位数增加到32个。但是现在这意味着不能在不丢失信息的情况下将句柄传递给16位程序。因此16位程序不能在64位Windows上运行。
EnumWindows
并且系统中有超过2 ^ 16个窗口时,您建议假想的“查找表”发生什么?
对于Windows,这是因为x86版本的OS包含16位仿真,因此它们可以运行那些较早的DOS进程。在x64版本中,它们已经必须模拟x86执行(它们称为WoW64)以允许32位进程运行,而且我猜想使用Wow64进一步模拟16位模拟器会导致太多问题。
少数公认的16位进程将运行,因为仿真是硬编码的,可以处理它们,但其余的将不起作用,因为x64中不包含仿真。
请参阅MSKB文章中的“无16位代码”:http : //support.microsoft.com/kb/282423
如果我错了,请纠正我,但据我了解,这仅仅是因为Windows特定的问题,NTVDM使用虚拟8086模式。x64处理器上的兼容模式(以长模式运行)支持完整的“干净”保护模式,与我在此处找到的地址相比分别为16位和32位:http : //en.wikipedia.org/wiki/Long_mode,但其中一些不兼容386附加功能,例如虚拟8086模式。因此,它最不受支持的原因是,微软对NTVDM进行重新编程并没有回报,这可能需要添加更多的仿真功能,因为某些16位保护模式的应用程序可以使用虚拟8086,即使大多数应用程序都不能使用。我想,只要有足够的工作量,就可以编写比以长模式运行的dosbox更快的内容,因为对16位应用程序提供了硬件支持。
对于Dos应用程序和16位Windows应用程序,情况有所不同。
对于Dos应用程序,问题在于虚拟8086模式在长模式下不可用。这是CPU体系结构的限制。
对于16位Windows应用程序(以16位保护模式运行),原因是MS尚未准备好进行工作以实现合适的兼容性层。有趣的是Wine非常有能力在64位Linux上运行16位Windows应用程序。
我认为最可能的原因是,只有极少数的PC所有者实际上希望能够在其新的64位硬件上运行旧的16位应用程序。微软可能认为继续支持16位应用程序并不值得。