1
AMD Ryzen 7 1700X,B350主板,Win7 x64,VMWare 12.5+。
运行Win98虚拟机时会弹出如下对话框,提示SHELL32.dll错误:

链接文件 SHELL32.DLL
到不存在的输出 GDI32.DLL: 。

忽略后会弹出如下对话框,提示Explorer.exe错误:

且错误原因是固定的,不随重启改变:

EXPLORER 在 0167:0040a067 的模块 EXPLORER.EXE 中导致例外 6d007eH.

新建虚拟机直接安装Win98也会出同样的错误,连安装都完不成:

Win95更是直接无法进入图形界面,在Win95徽标消失后会显示:

While initializing device IOS:
Windows protection error. You need to restart your computer.

2 尝试解决
2.1 换用VirtualBox
问题依旧。
由于VMWare提供Windows 9x虚拟机的Tools,而VirtualBox不提供,因此之后的尝试都是基于VMWare的。

2.2 升级VMWare
升级到14.x,无效。

2.3 使用专为Ryzen设计的Windows
也就是Win10(滑稽)。
全新安装Win10 x64以及VMware,问题依旧。

2.4 更改虚拟机兼容性
原来是VMWare 9.x虚拟机,升级到14.x,无效。

2.5 升级宿主机BIOS
这是网上最常见的说法了,将微码升级到AGESA 1.0.0.6或更高,以修复Ryzen系列的VME指令集bug。
然而我的机器刚买来就有足够新的BIOS(1.0.0.6),之后又升级过几次,问题长期未能消失。
网上的评论有两种说法:

农企放了个假补丁,欺骗评测网站。
反正我是不敢以最坏的恶意,去想象这些商业公司的商业行为。
农企的AGESA 1.0.0.6是以源码形式发布的,主板厂商可以全部或部分加入BIOS,有些没良心的主板厂商没把整个AGESA 1.0.0.6编译进去。
这个嘛。。。我的微星B350M Mortar算是中枪了,别人的华擎就没问题 摔瓶子.jpg,我又找不到那个帖子了,不确定是不是没问题哈。
2.5 在虚拟机配置文件中屏蔽VME功能
其原理是强行设置CPUID指令返回值中的指定位,使客户机操作系统认定其CPU拥有/没有对指定指令集的支持。
这里要屏蔽VME指令集,对应的位置是:

cpuid(EAX=1)时的EDX第1位(详解),以及
cpuid(EAX=80000001h)时的EDX第1位(详解)
对于VMWare虚拟机,要在vmx文件中加入这样一行:

cpuid.1.edx = “----:----:----:----:----:----:----:–0-”
然而……不管用。
后来又对参数格式做了几种猜测,并加入到vmx文件中:

cpuid.0.edx = “----:----:----:----:----:----:----:–0-”
cpuid.0.edx.amd = “----:----:----:----:----:----:----:–0-”
cpuid.1.edx = “----:----:----:----:----:----:----:–0-”
cpuid.1.edx.amd = “----:----:----:----:----:----:----:–0-”
cpuid.80000000.edx = “----:----:----:----:----:----:----:–0-”
cpuid.80000000.edx.amd = “----:----:----:----:----:----:----:–0-”
cpuid.80000001.edx = “----:----:----:----:----:----:----:–0-”
cpuid.80000001.edx.amd = “----:----:----:----:----:----:----:–0-”
然而……也都不管用。

对于VirtualBox虚拟机,也有类似的操作:

然而……我没测试。

3 弹框的回避方法
进安全模式。

系统属性-性能-文件系统-疑难解答,勾选“禁用32位保护模式的磁盘驱动程序”。

保存,重启到正常模式。

如果需要CD/DVD支持,可以启用DOS的CD/DVD支持,例如oakcdrom.sys。
在confog.sys中追加一行device=c:\oakcdrom.sys /d:oemcdrom
在autoexec.bat中追加或插入一行mscdex.exe /d:oemcdrom
重启即可。

4 遗留的问题
上述方法只是回避了Ryzen系列处理器中的bug,随便测试一下就会发现一堆问题,包括但不限于:
设备管理器里有一堆叹号,无法修复:

CD音频不能播放,导致《铁甲风暴》只有音效和过场动画伴音,没有BGM:

过场动画的伴音没问题

游戏内的音效也没问题,但是基于CD音轨的BGM就播放不出来
32位保护模式的程序是无法完全回避的:

《傲世三国》英文版,完全打不开
5 备用方案
指令集Bug,通过微码修复失败后,剩下能做的无非就是以下两种方案:

5.1 换机器
软路由
配置G3258的初衷就包括运行单/双核优化的程序,当时想到的是《星际争霸2》,实际上用Libvirt+KVM在Linux环境下开个Win虚拟机也是可行的。但是:
虚拟声卡型号很有可能发生变化。
查了一下发现KVM支持AC97、HD Audio等主流声卡标准,而对更早期声卡的模拟则有创新Sound Blaster 16、Ensoniq AudioPCI ES1370等。
键鼠输入和屏幕响应都可能有较高的延迟。
之前做OpenStack的时候用过NoVNC,似乎不成问题。但是SSH+virt-manager/virt-viewer的组合是有较高延迟的,不适用于游戏。
X3 720+790GX的老平台
运行虚拟机也没问题,并且能够开启SVM虚拟化特性。但是:
毕竟单核性能落后于时代,另外需要确认有没有NPT和IOMMU 有NPT,没有IOMMU,详情戳这里。
这台主机目前也用作Linux文件服务器,同样要走上面的Libvirt+KVM的方案。
A8 7650K+A88XM
想要体验推土机系列,于是从某鱼收来的板U套装。
需要先装机再慢慢测试。
Zen+/Ryzen 2000以及更新架构的AMD平台
我想问R3 2200G/R5 2400G还有这个问题吗?毕竟当年羿龙1代 xx00系列的TLB Bug是通过修改硬件,重新发布xx50系列解决的。而且Reddit上还真有人这么问了
问题依然存在,贴吧已经有人踩雷。不买了。
2020-1-18补充:Zen 2/Ryzen 3000系列仍然有这个问题,看这里。
5.2 模拟
我个人区分模拟(emulation)和虚拟(virtualization)的一条硬性标准是:

虚拟要用到硬件辅助虚拟化技术,如Intel VT-x或AMD-V,而模拟不需要。
这样就把VMware曾经最拿手的二进制转换(Binary translation)和Xen最标志性的半虚拟化技术(Paravirtualization)都划到了“模拟”的类别。注意,这与模拟和虚拟的定义不完全符合。
另外还有一些参考标准:

模拟的宿主机和客户机通常是不同架构的,例如PC模拟手机/游戏主机/掌机;而虚拟一定是相同架构的。
在客户机内同样流畅地运行同一个程序需要消耗的资源,客户机实际消耗 < 虚拟机Hypervisor << 模拟器。
QEMU、Bochs、DOSBox等都是用PC或其他平台模拟老PC的软件。

QEMU
待补完

Bochs
待补完
目前已知Bochs支持的最大硬盘容量为16383© * 16(H) * 63(S) * 512 == 8455200768字节,约8063.5MB。所以我原有的8GiB镜像就没法直接拿来用了,就差这么一点。

DOSBox
划重点:DOS,动态指令转换,老显卡/声卡,Modem/IPX/TCP/IP,老游戏。
没提到PE内核的Windows 3.x/4.x。
详见:用DOSBox运行老游戏

新PC - DOSBox - Windows 98
可以参考:DosBox装Windows98
具体思路是把硬盘和必要的软盘启动盘都做成镜像,而不使用DOSBox原有的挂载文件夹的方式,以满足操作系统修改MBR/PBR等信息的需求。但是用镜像的话就也和Bochs一样,硬盘大小受CHS寻址方式的限制。

同时装Win95也有人踩过坑,有时间再慢慢啃:
A Complete Guide to Install Windows 95 on DOSBox
Installing Windows 95 in DOSBox

PCem
逛Windows98吧发现的,真的是“老机器模拟器”了,能够模拟一些Socket 7(321)/Super Socket 7及更老的CPU/主板,以及Voodoo显卡等设备。目前仍在更新,有机会可以尝试一下,不过还是先把上面的CHS问题搞掉吧
官网:https://pcem-emulator.co.uk/
一些必要的ROMs:https://github.com/BaRRaKudaRain/PCem-ROMs
86Box,PCem的一个非官方Build:https://github.com/86Box/86Box

5.3 继续打补丁
2020-1-18更新:
https://msfn.org/board/topic/177951-important-for-anyone-trying-to-run-windows-9x-under-a-ryzen-based-virtual-machine/
这里在介绍完上面的方法后,还提到:

(Disable the 32-bit drivers…), and then install the 48-bit LBA fix, as well as all of the previously released Windows 98 updates. Then, you should be able to re-enable the 32 bit drivers.

重新启用32位驱动应当能够解决上面的遗留问题,当然前提是Win98的更新里已经修复了相应的问题。我一直没有给这些老系统手动打补丁的习惯,所以之前装好的Win98虚拟机就一直带着这个问题。目前已经找了一些48-bit LBA fix,而Win98补丁我准备用Unofficial SP 3.64解决。有空时再测试。

作者:windo95

 *

win98/win95相关推荐

  1. 巧用windows xp远程桌面web连接

    (中关村在线)我家中有两台电脑(各有一块10M网卡),一台赛扬600的台式机,配以15吋的普通显示器,分辨率800*600:一台古老的奔腾笔记本电脑,配以13.3的液晶屏,可上1024*768  16 ...

  2. ghost linux 全盘拷贝,如何用ghost实现小硬盘对大硬盘的全盘拷贝?

    先安装Ghost然后启动机器到纯DOS模式下,并且不加载任何应用程序,执行Ghost.exe文件,在显示出Ghost主画面后,选择Local→Partition→To Image",屏幕显示 ...

  3. oracle基本命令

    一些基本的Oracle命令 基本命令 连接数据库 C:>SQLPLUS /NOLOG SQL>CONN / AS SYSDBA 1.Oracle 关闭 SQL>SHUTDOWN (A ...

  4. 一些基本的Oracle命令

    [b]基本命令[/b] 连接数据库 C:>SQLPLUS /NOLOG SQL>CONN / AS SYSDBA 1.Oracle 关闭 SQL>SHUTDOWN (ABORT|IM ...

  5. php反向引用,JavaScript 正则应用详解【模式、欲查、反向引用等】

    本文实例讲述了JavaScript 正则应用.分享给大家供大家参考,具体如下: 正则应用 正则表达式在web开发中的常用 邮箱验证 用户名验证 替换字符串某一部分 信息采集,用来分析有效代码段 ... ...

  6. 修改sonar服务器时间,Cakewalk/Sonar的 midi 时间问题详解

    [dvnews_page] 捣鼓硬盘时发现去年琢磨MIDI时间偏移的一些笔记, 整理整理贴上来, 希望对遇到这个问题的兄弟们有点用吧. 很多朋友发现从Win98升级到Win2000, WinXP后Ca ...

  7. WinVista发布前最大敌人是Win95??!!

    新浪上面的一篇文章语惊四座,说Vista的最大敌人是10年前的win95.文见http://tech.sina.com.cn/it/2005-08-26/1137704512.shtml 微软产品的最 ...

  8. windows同时代服务器系统,从Win95到Win10:那些年让你痴迷的系统特性大盘点

    从Win95到Win10,微软桌面操作系统走过了辉煌的二十年,当年在这些系统陪伴下成长的少年和青年,也都逐渐成家立业,拥有了自己的人生.但有些记忆始终是难以磨灭的,Windows95.Windows9 ...

  9. 三帝RPL无盘Win98安装指南(转)

    系统要求: 1.服务器:Windows 2000操作系统,CPU≥500或PⅢ500,硬盘≥10G,RAM≥128M,10/100M网卡(只限3COM905B.D-LINK530TX.INTEL825 ...

  10. Win2000、NT 环境真正 RPL 无盘 WIN98 安装指南(转)

    一.安装 NT 或 Win2000 服务器 在服务器上安装 NT4.0.服务器名建议为 W98SERVER .必须安装 TCP/IP.IPX.NETBEUI.DLC 协议,其中 IP 地址要指定,如: ...

最新文章

  1. 那个博士生以死控告的教授,被ACM撤销了会员资格
  2. MongoDB 学习笔记四 C#调用MongoDB
  3. Go 语言编程 — gorm 的数据完整性约束
  4. [转]js escape,encodeURI,encodeURIComponent
  5. 森源电气持续押注光伏 加强市场竞争力
  6. 【UVALive】3695 Distant Galaxy(......)
  7. android ——Toolbar
  8. 李少华 linux内核,腾讯云CMQ消息队列在Linux环境下的使用
  9. [TCP/IP] TCP建立与终止
  10. Spring基础18——通过注解配置bean之间的关联关系
  11. MVC中获取来自控制器名称与动作的方法
  12. windows tcp ping 端口工具及使用方法
  13. 六度空间 c语言 【详解】
  14. 图片制作、LOGO制作、ICO文件
  15. JavaWeb学习--课程设计《小米商城》
  16. java 模拟登陆人人网_java模拟登陆人人,通过验证码
  17. 滴滴校招编程题-田径运动会比赛排名
  18. mysql按时间段统计_mysql按照时间段内 每天统计
  19. Android 实现自动抢微信红包
  20. 家用服务器 无线路由器,评测六款热门家用Wi-Fi 6路由器

热门文章

  1. (附源码)php小型网络舆情平台设计 毕业设计 252324
  2. 【MATLAB】(三)MATLAB在高等数学中的应用
  3. 解决安全频道支持出错,代码:80072F7D问题
  4. 用Go语言打印三角形汇总 (Golang经典编程案例)
  5. Linux-Input入门-一次愉快的源码分析
  6. 面试官都震惊,你这网络基础可以啊!
  7. Java实现俄罗斯方块小游戏。(附完整源代码)
  8. 留言板个人代码展示墙
  9. SQL注入从入门到精通
  10. 温度循环试验标准gjb150-温度循环试验检测机构报告