手机中国 昨天
Windows 11仍内置Windows 95内存管理器 只为运行老程序
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_keji1.html

 

【CNMO 科技消息】如今在 Windows 11 里,仍然能找到一段可以正常工作的 Windows 95 内核代码。它的名字叫 EmulateHeap,是一项兼容性修复:当某些老程序依赖 Windows 95 那套宽容的内存管理方式时,系统就会把 Windows 95 的堆管理器调出来给它们用。在搭载 Windows 11 26H2 的电脑上,这项修复至今仍在。

Windows

这个传统的起点是一款游戏。《模拟城市》当年能在 Windows 95 上运行,是因为微软专门为它写了代码。程序在运行时会向系统申请内存,用完之后再释放。如果一块内存被释放之后仍被读取,就属于 " 释放后读取 " 的错误,而 Windows 3.x 版的《模拟城市》恰好带着这样一个缺陷。

Stack Overflow 联合创始人、前微软工程师乔尔 · 斯波尔斯基在 2000 年的一篇文章里讲过这段往事,并引用了该版本的作者乔恩 · 罗斯的说法。罗斯承认自己不小心留下了一个缺陷,游戏会 " 读取他刚刚释放的内存 "。斯波尔斯基解释了为什么当时没人察觉:" 它在 Windows 3.x 上运行得很好,因为那块内存从来没有被挪走。"

到了 Windows 95 的测试版,《模拟城市》崩溃了。微软没有等游戏方打补丁,而是直接在系统里加了代码去识别这款游戏。按斯波尔斯基的描述,只要发现《模拟城市》在运行,内存分配器就会进入一种特殊模式,不立即释放内存。为了掩盖一款游戏的缺陷,微软改动了自己的操作系统。

这次临时处理本来是一次性的,但其他程序也做了类似的假设。微软工程师雷蒙德 · 陈在 2010 年的专栏中解释,有些程序利用了 Windows 95 堆的特性,比如读取已释放的内存并指望旧值仍在那里,这些程序在内存管理方式不同的后续版本上就会崩溃。解决办法就是 EmulateHeap,它把应用的堆调用,从 HeapCreate 到 LocalLock 再到 GlobalReAlloc,全都重定向到模仿 Windows 95 行为的替代实现。

雷蒙德 · 陈称这套方案 " 极其简单 ",但 " 完全疯狂 ",更疯狂的是它的构建方式:微软直接拿了一份 Windows 95 堆管理器的源代码,重新编译后塞进兼容性基础设施。用他的话说,Windows 应用程序兼容框架里躺着一大块 Windows 95 内核的副本。不过他补充说,这段旧代码只有在为某个应用启用 EmulateHeap 时才会从硬盘加载,电脑并不会在后台偷偷跑着 Windows 95。

需要说明的是,EmulateHeap 并不是当年为《模拟城市》写的那段代码,两者同源于 Windows XP 那份隐藏的应用修复数据库,但属于不同的修复。

Windows

想亲眼看到它并不难。兼容性管理员是微软面向 IT 管理员提供的免费工具,随 Windows ADK 分发,2026 年 9 月的版本已正式支持 26H2。装好应用程序兼容性工具后,打开 32 位版本的兼容性管理员,在自定义数据库里新建一个兼容性模式,就能在列表中滚动到 EmulateHeap。

当然,出现在列表里不等于一定管用。Windows 11 22H2 更新之后,就有用户报告《侠盗猎车手:罪恶都市》在启用该修复后失去声音,《极品飞车:最高通缉》则直接崩溃。

颇具意味的是,微软正在用 WinUI 3 替换 Windows 95 时代的 " 属性 " 对话框,却仍为一小批老程序留着当年的堆管理器;这份耐心没有延伸到 3D 弹球,它因为一个 64 位缺陷被移除,团队不愿为此搭上几天时间。

版权所有,未经许可不得转载

智客推

智客推

ZAKER 智客推 GEO | AI 时代的品牌认知解决方案

一起剪

一起剪

ZAKER旗下免费视频剪辑工具

相关标签

windows 微软 波尔 工程师 创始人
相关文章
评论
没有更多评论了
取消

登录后才可以发布评论哦

打开小程序可以发布评论哦

12 我来说两句…
打开 ZAKER 参与讨论