为什么Windows娱乐包没有通过模拟器直接运行MS-DOS版本? 主要原因在于当时的软硬件环境与技术限制: 1. **性能与兼容性问题**:早期的Windows系统(如Windows 3.x)本身就是MS-DOS的图形界面扩展,其自身仍高度依赖DOS底层环境。若通过模拟器运行DOS版本游戏,会引入额外的性能开销,可能导致游戏在原本就有限的硬件上无法流畅运行。 2. **设计哲学差异**:Windows娱乐包的目标是为Windows平台提供**原生体验**。这些游戏(如《扫雷》《纸牌》)被重新设计为适配Windows图形界面、鼠标操作和多任务环境,而非简单移植DOS版本。这种原生化有助于推广Windows界面交互方式。 3. **技术架构限制**:当时的Windows并未内置完整的模拟器功能。虽然存在如`NTVDM`(在Windows NT内)等DOS兼容层,但Windows 3.x时代仍基于DOS内核,资源管理方式不同,直接集成模拟器并不现实。 4. **商业策略考量**:微软希望用户从DOS过渡到Windows,通过为Windows平台提供**独有内容**来增强系统吸引力。若仅模拟DOS游戏,可能反而削弱用户升级Windows的动力。 简言之,这是一次面向新时代操作系统的**主动设计选择**,而非技术上的偷懒。

The Old New Thing (Raymond Chen) 新闻

摘要

本文阐述了Windows娱乐包未采用模拟技术运行MS-DOS游戏的原因:受1990年代硬件限制,内存容量不足且缺乏虚拟化支持,导致该方案不切实际,用户体验极差。

我不久前提到过,<a title="纪念这位在单词下添加红绿波浪线的人" href="https://devblogs.microsoft.com/oldnewthing/20260622-00/?p=112451">托尼·克鲁格逆向工程了《奇奇的挑战》的MS-DOS版本,然后在Windows上重新实现了它</a>。有人问:“他为什么非得这么做?为什么不直接在模拟器里运行MS-DOS版本呢?” 这有点像问<a title="为什么他们不用航天飞机去救援阿波罗13号的宇航员?" href="https://devblogs.microsoft.com/oldnewthing/20110119-00/?p=11723">为什么不用航天飞机去救援阿波罗13号的宇航员</a>。 <a title="Q66142:Windows娱乐包的系统要求" href="https://jeffpar.github.io/kbarchive/kb/066/Q66142/">Windows娱乐包的系统要求</a>是80286处理器或更高配置,Hercules、EGA或VGA显卡,鼠标,Windows 3.0,以及1MB内存。《奇奇的挑战》MS-DOS版本的系统要求是<a href="https://elisoftware.org/wiki/Chip%27s_Challenge_(PC,_3_1/2%22_Disk_and_5_1/4%22_Disk)_Epyx_-_1991_USA,_Canada_Release">512KB内存</a>。因此,你必须把整个Windows<i>和</i>模拟器都塞进这1MB内存里。也许你极其节俭,能把Windows压缩到256KB内存,模拟系统的内存是512KB,模拟显卡的内存是64KB。这样你还剩下192KB内存来编写模拟器。 Windows 3.0的目标CPU是80286,它不支持虚拟化。因此你不得不编写一个指令级的CPU模拟器。这听起来很难,但可能还是最简单的部分。你还需要模拟所有硬件:键盘控制器、定时器芯片、中断控制器、显卡、硬盘,以及程序需要的其他所有部件。最棘手的部分可能是正确模拟时间的流逝,因为尤其是游戏,通常使用定时循环来编码,代码知道执行特定数量的指令需要特定的时间。所以它可以,比如说,向PC扬声器发出一个命令,执行<i>正好</i>150个周期的游戏逻辑,然后在恰好正确的时刻返回向扬声器发出下一个命令。或者向硬盘I/O端口发出一个I/O命令来启动读写头移动,然后等待正好300个周期,再发出另一个I/O命令来停止读写头移动,并期望读写头正好位于特定的磁道上。 而且,你必须在与其他正在运行的Windows应用程序进行协作式多任务的同时,完成所有这些精确的计时。 哦,对了,在1990年,你那台顶级的台式电脑运行的是486DX-33。一台普通电脑会运行大约10 MHz的80286处理器。<a title="性能:模拟CPU等效关系" href="https://www.dosbox.com/wiki/index.php?title=Performance#Emulated_CPU_equivalency">DOSBox模拟CPU等效表</a>显示,模拟一个仅6 MHz的80286处理器就需要奔腾Pro 200 MHz处理器。这种处理器要再过五年才会被发明出来。DOSBox项目本身直到2000年才启动。在1990年,PC模拟还不太现实。当时的处理器还不够强大,无法很好地完成这件事,而且x86模拟的工程经验也还欠缺。 即使你设法带着更好的硬件和额外30年的软件开发经验穿越回过去,让游戏在MS-DOS模拟器中运行,模拟的体验也会很糟糕。毕竟,你并没有把游戏移植到Windows。你只是在模拟器中运行它。图形将是MS-DOS图形,而且当用户调整游戏窗口大小时,它们不会相应地缩放。输入将基于键盘,即使Windows有鼠标。原版MS-DOS版本没有保存游戏的功能。它只是在你完成一个关卡后给你一个关卡代码,你可以在之后输入那个代码,跳回到你退出时所在的关卡。在模拟器中运行程序意味着你无法添加新功能,比如“高分”列表,或者一个恰当的“保存游戏”功能,该功能不仅能记住你所在的关卡,还能记住你到那时为止的总分。 《奇奇的挑战》的Windows版本必须是移植到Windows上的版本,而不仅仅是在模拟器中运行游戏。 <b>相关阅读</b>:<a title="在虚拟机中运行旧程序并不一定能带来良好的用户体验" href="https://devblogs.microsoft.com/oldnewthing/20051005-09/?p=33903">在虚拟机中运行旧程序并不一定能带来良好的用户体验</a>。 <b>额外闲聊</b>:为什么托尼必须先逆向工程MS-DOS版本? 据我理解,逆向工程主要集中在弄清楚数据文件中谜题关卡是如何编码的。游戏玩法本身基本上可以通过观察来逆向工程。 是的,但这并没有回答问题。为什么要逆向工程?为什么不直接让供应商告诉你格式是什么? 托尼在授权协议签署<i>之前</i>就开始将《奇奇的挑战》移植到Windows。在律师说可以开始之前,他就在秘密进行这个项目。因此,他只能依靠自己的智慧。这意味着要逆向工程文件格式,因为他在法律上还不可以去索要它。 <b>相关阅读</b>:<a title="为什么微软的Windows娱乐包有一个特殊的贴纸,宣布它也包含俄罗斯方块?" href="https://devblogs.microsoft.com/oldnewthing/20260818-00/?p=112621">另一个在授权协议签署前就开始项目的例子</a>。 这篇文章<a href="https://devblogs.microsoft.com/oldnewthing/20260825-00/?p=112645">为什么Windows娱乐包不直接在模拟器中运行MS-DOS版本?</a>首次出现在<a href="https://devblogs.microsoft.com/oldnewthing">The Old New Thing</a>。
查看原文
查看缓存全文

缓存时间: 2026/08/27 03:47

# 为什么Windows娱乐包不直接通过模拟器运行MS-DOS版本?- 新旧事谈 来源:https://devblogs.microsoft.com/oldnewthing/20260825-00?p=112645 我之前提到Tony Krueger逆向工程了《芯片挑战》的MS-DOS版本,然后在Windows中重新实现了它(https://devblogs.microsoft.com/oldnewthing/20260622-00/?p=112451)。有人问:“他为什么非得这么做?为什么不在模拟器里直接运行MS-DOS版本呢?” 这有点像问为什么他们不用航天飞机去救阿波罗13号的宇航员(https://devblogs.microsoft.com/oldnewthing/20110119-00/?p=11723)。 Windows娱乐包的系统要求(https://jeffpar.github.io/kbarchive/kb/066/Q66142/)是80286或更好的处理器、Hercules、EGA或VGA显卡、鼠标、Windows 3.0和1MB内存。而《芯片挑战》的MS-DOS版本需要512KB RAM(https://elisoftware.org/wiki/Chip%27s_Challenge_(PC,_3_1/2%22_Disk_and_5_1/4%22_Disk)_Epyx_-_1991_USA,_Canada_Release)。因此你必须在1MB内存中同时容纳Windows系统*和*模拟器。也许你足够精打细算,能把Windows压缩到2526KB内存中,模拟系统的RAM为512KB,模拟显卡占64KB。这样你还剩192KB RAM来编写模拟器。 Windows 3.0的目标CPU是80286,它不支持虚拟化。因此你需要编写指令级的CPU模拟器。这听起来很难,但这可能是最简单的部分。你还需要模拟所有硬件:键盘控制器、定时器芯片、中断控制器、显卡、硬盘以及其他程序所需的设备。最棘手的部分可能是精确模拟时间流逝,因为游戏和I/O设备通常使用定时循环编码——代码知道执行特定数量的指令需要特定时间,因此可以,比如说,向PC扬声器发送命令,执行*恰好*150个游戏逻辑周期,然后在恰好正确的时刻回到扬声器发出下一个命令。或者向硬盘I/O端口发送I/O命令以开始移动读写头,然后等待恰好300个周期,再发送另一个I/O命令停止移动读写头,并期望读写头恰好到达特定磁道。 你必须在与其它Windows应用程序协同多任务处理的同时完成所有这些精确计时。 哦,而且1990年,你的高端台式机运行的是486DX-33。经济型PC可能运行的是约10MHz的80286。DOSBox模拟CPU等效表(https://www.dosbox.com/wiki/index.php?title=Performance#Emulated_CPU_equivalency)显示,仅模拟6MHz的80286就需要200MHz的Pentium Pro处理器。这是一种五年后才发明的处理器。DOSBox项目本身直到2000年才开始。1990年PC模拟还不太可行。当时的处理器不够强大,无法很好地完成模拟,而且x86模拟的工程经验也不足。 即使你带着更好的硬件和额外30年的软件开发经验穿越回去,让游戏在MS-DOS模拟器中运行,模拟体验也会很糟糕。毕竟你并没有将游戏移植到Windows。你只是在模拟器中运行它。图形将是MS-DOS图形,用户调整游戏窗口大小时它们不会缩放。输入将基于键盘,尽管Windows有鼠标。原始的MS-DOS版本没有保存游戏的功能。它只在你完成关卡后给你一个关卡代码,之后你可以输入该代码跳回到你退出时的关卡。在模拟器中运行程序意味着你无法添加功能,比如“高分”列表,或真正的“保存游戏”功能——不仅记住你所在的关卡,还记住你到那时的总得分。 Windows版本的《芯片挑战》必须是移植到Windows,而不仅仅是模拟器中运行游戏。 **相关阅读**:在虚拟机中运行旧程序不一定能创造良好的用户体验(https://devblogs.microsoft.com/oldnewthing/20051005-09/?p=33903)。 **额外闲谈**:为什么Tony必须逆向工程MS-DOS版本呢? 据我理解,逆向工程主要专注于弄清楚拼图关卡在数据文件中是如何编码的。游戏玩法本身很大程度上可以通过观察来逆向工程。 是的,但这并没有回答问题。为什么要逆向工程?为什么不直接让供应商告诉你格式呢? Tony在许可证协议签署*之前*就开始将《芯片挑战》移植到Windows。他在律师说可以开始之前就秘密进行项目。因此他只能依靠自己的智慧。这意味着需要逆向工程文件格式,因为他在法律上还不能索要它。 **相关阅读**:在许可证协议签署前启动项目的另一个例子(https://devblogs.microsoft.com/oldnewthing/20260818-00/?p=112621)。 ### 分类 ### 主题 ## 作者 Raymond Chen Raymond参与Windows的演变已超过30年。2003年,他创建了一个名为“新旧事谈”的网站,其受欢迎程度远超他最疯狂的想象,这一发展至今仍让他感到不安。该网站衍生出一本书,巧合的是也名为《新旧事谈》(Addison Wesley 2007)。他偶尔出现在Windows开发文档Twitter账户上,讲述一些不传递任何有用信息的故事。

相似文章

为什么 Windows 11 仍然内置着 Windows 95 的内存管理器

Hacker News Top

Windows 11 至今仍带有 EmulateHeap——一个兼容性垫片,其中包含重新编译的 Windows 95 堆管理器代码。它最初是为了绕过《模拟城市》中的一个释放后使用(use-after-free)漏洞而添加的,当时 Microsoft 选择修补操作系统,而不是修复游戏本身。

Theseus,一个静态的Windows模拟器

Lobsters Hottest

Theseus是一个新型的静态Windows/x86模拟器,它在编译时翻译程序,而不是在运行时解释或即时编译,代表了一种不同于传统模拟架构的方法。

MS-DOS 2.0 之路

Hacker News Top

本文追溯了 MS-DOS 从 86-DOS、微软的 XENIX 尝试到 XEDOS 计划的历史发展过程,详细说明了塑造早期个人电脑操作系统的各种制约因素和决策。