由于Win9x自身的代码bug,在32位保护模式的磁盘驱动下,在Intel的Icelake开始的处理器和AMD的锐龙处理器上运行时会抽风,除非使用嵌套虚拟的办法避开处理器的SLAT(二级地址转换,Intel第一代酷睿开始都支持,现在的处理器都要求在虚拟机软件的设置中开启此特性才能正常运行虚拟机),或者禁用32位保护模式的磁盘驱动。打补丁并不能修复这个bug——从老电脑上复制已经打满补丁、配置好软件的系统不行,把磁盘驱动(主要是 %windir%\system\iosubsys\esdi_506.pdr 这个文件)换成老外魔改的支持大LBA(支持超过128G的硬盘)的版本也不行。
WinMe抽风情况最轻,复现概率很低,但不等于没有。Win98尤其是98SE抽风很严重,安装都不能正常完成。
为解决这个bug,GitHub上有人做了个9x的CPU补丁(Patch for Windows 9x to fix CPU issues)。但经测试,打上这个补丁后,并不能完全根治这个bug,只能让抽风的概率更小一点。该补丁早已停更,最新版停留在了去年7月的0.7.45 beta3。
此问题以前已经有很多人讨论了,但WinMe涉及的不多。
今天偶然又碰到一次抽风(已打此补丁最新版),干脆分享一下。录屏用的是Win11刚更新的截图工具。(不知道这玩意什么时候才能录声音
b站链接
附作者原文
Windows 95, 98 and 98 SE have the CPU speed limit bug. Windows 98 SE is a special case because it has "divide by zero" protection, but it also has a short loop test, so its timing information is probably useless and could potentially lead to other bugs.
Windows 98, 98 SE and Me have the TLB invalidation bug. The Millennium edition has this bug in the code, but from my observation, the system calls this code very rarely (for example with driver install/system update), so the bug isn't as obvious as in Windows 98. An older version of my patcher program also has a special mode for Windows Me, but in the current version it is no longer needed.