WSL9x:在 Windows 9x 里跑现代 Linux 6.19 内核
Hacker News 上最近出现了一个让人目瞪口呆的项目:WSL9x —— 把现代 Linux 6.19 内核协同运行在 Windows 9x 里面。不是虚拟机,不是容器,是通过 VxD 驱动直接嵌入 Win9x 内核。
README 里还特意写了句:"Proudly written without AI."
WSL9x 是什么
WSL9x 是一个三组件系统,能让 Linux 用户态程序和 Windows 9x 程序并肩运行,不需要重启。你可以把它理解为微软 WSL 的精神逆向版——只不过不是在 Win10/11 上跑 Linux,而是在 Windows 95/98/ME 上跑。
三个组件分别是:
- 修补过的 Linux 内核 —— 基于用户态 Linux (UML),但魔改成调用 Windows 9x 内核 API,而且跑在 ring 0(内核态)而不是 ring 3
- VxD 驱动 —— WSL9x 的核心,负责初始化、加载内核、建立内存映射、处理 IRQ/syscall/上下文切换的事件循环
- wsl.com 客户端 —— 一个 16 位 DOS 程序,用 MS-DOS 提示符当终端窗口
技术细节
整体流程是这样的:
- VxD 驱动(
vxd/wsl9x.asm)通过 DOS 中断从磁盘加载vmlinux.elf - Linux 内核编译时固定基地址为
0xd0000000 - 在 System VM 中启动新线程,分配 16 KiB 栈用于进入 Linux
- 驱动进入事件循环,处理内核入口、IRQ 分发、用户态返回和空闲状态
Syscall 的骚操作
最有创意的部分:Windows 9x 的中断描述符表不够长,没法给 int 0x80(Linux i386 syscall 中断)装正经的处理函数。所以 WSL9x 用了 通用保护故障(GPF)处理器来代替。
当 GPF 发生时,处理器检查触发异常的指令。如果是 int 0x80,就把指令指针往前挪(假装中断成功了),然后把调用分发给 Linux 处理。优雅和恐怖并存。
Win9x 和 Linux 的上下文切换
Linux 侧的代码在 arch/um/os-Win95/ 目录下,负责两个操作系统之间的上下文切换。入口点是 main.c 里的 _start,process.c 管进程调度,mmu.c 管内存管理。
为什么这个项目很牛
核心成就:WSL9x 让 Windows 9x 获得了分页、内存保护和抢占式调度的能力——这些恰恰是 Win9x 自己一直搞不定的东西——方法是跑一个现代 Linux 内核来补位。
来感受一下这意味着什么:
- 2026 年的 Linux 内核(6.19)跑在 1995 年的操作系统里
- Ring 0 协同 —— Linux 跑在内核态,和 Win9x 内核共享 CPU
- DOS 级别 I/O —— 磁盘访问通过 DOS 中断完成
- 16 位终端 —— 终端是个 .com 文件,用
int 0x29输出字符 - 无 AI 辅助 —— 作者特意强调全程手写
怎么编译运行
想自己试试的话,需要准备:
- 一个
i386-linux-musl交叉编译工具链(用 musl-cross-make 构建) - Open Watcom v2 工具链用于编译 Windows 组件
- 耐心——编译修补过的 Linux 内核是个手动且耗时的过程
源码在 Codeberg,修补过的内核分支在 GitHub。
更大的图景
WSL9x 坐落在几个有趣趋势的交汇点上:
- 复古计算复兴 —— 越来越多人不仅在用老硬件和老系统,还在积极往上面移植现代软件
- 内核黑客即艺术 —— 这类项目在操作系统层面探索可能性的边界
- "无 AI" 运动 —— 一些开发者开始刻意标注自己的作品没有 AI 辅助,作为一种工艺宣言
这也提醒我们,Windows 9x 虽然以不稳定著称,但它的内核架构其实相当能打——VxD 模型虽然危险,但恰好能实现这种深度系统集成,而现代 Windows 已经基本把这条路堵死了。