一台 2006 年发售的任天堂 Wii,插上存储卡转换器,按下电源键,40 秒后屏幕亮起了微笑的 Macintosh 图标,直接进到了 Mac OS 7.6 的桌面。2026 年 10 月 29 日,开发者 Rairii 在 Virtually Fun 公布了这项进展,不仅跑通了 Mac OS 7.6,还把 Mac OS 9.2.2 原生搬上了 Wii。这是自 1990 年代 CHRP 克隆机时代落幕以来,苹果公司以外的人首次在新硬件上把经典 Mac OS 原生引导至桌面。

更反直觉的是,同一套系统放在定制版 Dolphin 模拟器开发环境里,得熬上约 20 分钟才能挪进桌面,中途还会因为模拟器的低级硬件仿真误差,在加载调试器 MacsBug 时直接崩溃。而在真实 Wii 硬件上,哪怕走的是速度最慢的 SD-over-SPI 存储路径,开机也只要 40 秒。

很多人看到新闻的第一反应是,苹果当年的 PowerPC 电脑和任天堂自 GameCube、Wii 到 Wii U 的三代主机,用的都是 IBM 与摩托罗拉的 PowerPC 架构处理器,指令集相通,刷个系统顺理成章。

这个直觉错得很彻底。CPU 架构相同只是最表层的入场券,真正的天堑在于经典 Mac OS 内部积攒了十余年的硬件地址硬编码。

同套代码,两重天地:真机与模拟器的启动耗时及兼容性反差 任天堂 Wii 真实硬件 40 秒 存储路径:SD Gecko (SD-over-SPI) 调试表现:正常加载 MacsBug 无崩溃 传输机制:独占 CPU 轮询完成传输 定制版 Dolphin 模拟器 20 分钟 存储路径:迁就仿真缺陷的 EXI-IDE 调试表现:因仿真误差触发 MacsBug 崩溃 兼容局限:标准版 Dolphin 无法直接运行

别把三场移植混为一谈:OS 9 与 OS X 是两套物种

2026 年复古计算圈掀起了一股把苹果系统塞进任天堂游戏机的热潮,不少围观者把几个项目混作一谈,其实它们在底层架构上根本不是一回事。

把不同年代的苹果系统塞进两代任天堂主机,底层完全是两套架构
把不同年代的苹果系统塞进两代任天堂主机,底层完全是两套架构

今年活跃的三个项目各自占了一条赛道:

  • Wiintosh(Goldfish64 主导):已开源,目标是现代 Unix 血统的 Mac OS X,目前已支持在 Wii 上运行 10.0 至 10.2,在 Wii U 上运行 10.3 和 10.4(安装 Tiger 需使用 10.4.0 安装器)。不过 Goldfish64 也挑明了硬件死穴,由于 Wii U 的 Espresso 处理器存在缓存一致性问题,在 Wii U 上实现 Mac OS X 多核处理的可能性极低。
  • wiiMac(Bryan Keller 主导):2026 年 4 月 8 日公开记录的独立项目,走的是自定义引导加载器加内核修改的路线,专门把 Mac OS X 10.0 Cheetah 搬上了 Wii。
  • Classic Mac OS 移植(Rairii 主导):始于 2025 年 6 月 22 日,复用了 Goldfish64 的部分 OpenBIOS 驱动代码,但攻坚对象是比 OS X 古老得多的 Mac OS 7.6 与 9.2.2。

Mac OS X 底层是 XNU 内核与 BootX 引导程序,软硬件解耦相对现代;而新世界(New World)架构的经典 Mac OS 启动时,必须先由 Open Firmware 读取名为 Mac OS ROM 的 TBXI 文件,再交由引导加载器 Trampoline 初始化系统。

更妙的一处历史巧合藏在代码里:苹果当年为了在 PowerPC 芯片上兼容老软件,在 TBXI 文件里塞了一段 68k 模拟器代码,这段代码在整个 PowerPC 时代的内部代号,偏偏就叫 SuperMario。三十年前苹果工程师随手起的任天堂彩蛋,三十年后真在任天堂的主机上跑了起来。

借壳上市的障眼法:如何在内存里欺骗引导程序

为什么自 1990 年代末之后,就没人能在非苹果硬件上原生跑起这套系统?因为经典 Mac OS 是从 1984 年一路打补丁叠出来的产物,代码里到处写死了对苹果主板的具体假设。它默认机器一定有 PCI 总线、有苹果专属的微控制器、有特定的中断寄存器和串口。一旦找不到,系统连报错的机会都不给,直接死循环或踩碎低位内存。

在内存里给任天堂芯片贴上苹果硬件的假身份,骗过系统引导程序(示意图)
在内存里给任天堂芯片贴上苹果硬件的假身份,骗过系统引导程序(示意图)

任天堂这三代主机的集成芯片组——GameCube 的 Flipper、Wii 的 Vegas 与 Bollywood、Wii U 的 Latte——全部源自当年被 ATI 收购的 ArtX 公司的设计脉络,内存布局与苹果的 PowerMac 天差地别。Rairii 不想破坏原始系统安装光盘镜像,于是选择了一条极硬核的路线:在系统启动的瞬间,用运行时补丁在内存里给操作系统搭一座假舞台。

零修改镜像的运行时欺骗:四步绕过苹果硬件硬编码 1. 固件接管 改造 NT ARC 加载器 引导大端序 ELF 启动定制 OpenBIOS 读取 FAT 分区 TBXI 2. 地址重映射 拦截 0x8000_0000 将物理 0x0100_0000 映射至虚拟 0xE000_0000 填平物理内存空洞 3. 伪造设备树 把 Flipper 中断伪装为 小端序 PCI 控制器 塞入假 Mac99 电源设备 欺骗 Trampoline 4. 伪装存储与启动 EXI 总线伪装为 SCSI 修补 68k 串口死循环 绕过非对齐 DMA 陷阱 40 秒进入系统桌面

第一步是解决内存冲突。苹果的 Trampoline 引导程序铁了心认为,物理地址 0x8000_0000 往后必然是 PCI 总线的内存映射 I/O(MMIO)空间。但在任天堂的架构里,这块地方不仅不是 PCI,到了 Wii U 上干脆就是实打实的物理内存,而且物理内存之间还夹杂着空洞。Rairii 直接在内核内存块列表初始化时下刀,把物理地址 0x0100_0000 强行映射到虚拟地址 0xE000_0000(长度为 0x1000_0000),一举包揽了全部 MMIO 与跨段的内存区。至于 Wii U 上 0xD000_0000-0xEFFF_FFFF 那段用于 Radeon R7xx GPU 进行字节序转换的 HDP 区域,则留作后续适配再做取舍。

第二步是给硬件做假身份证。Trampoline 只认苹果钦点的几款中断控制器,Rairii 就在设备树里把任天堂的 Flipper 中断控制器伪装成苹果当年挂在 PCI 总线上的小端序控制器,并在内核里牺牲掉一个闲置驱动的空间,手写补丁接管中断屏蔽逻辑。同时,设备树里还塞进了一个假的 Mac99 电源管理设备,先把引导程序糊弄过去,等进了内核再替换成空桩驱动。

连苹果程序员三十年前留下的低级 Bug 都被这次移植炸了出来。在 SuperMario 的 68k 初始化代码里,有一段检测串口 2 是否存在的逻辑,当年苹果工程师从串口 1 复制粘贴代码时忘了改跳转标签;在真苹果机上因为永远有串口,这个 Bug 潜伏了三十年,而到了没有对应硬件的 Wii 上,系统当场跳进死循环。Rairii 只能挨个把这些不检查硬件存亡就乱写内存、乱调空指针的旧代码全部打上补丁,甚至把任天堂的 EXI 总线(本质是 SPI)包装成假 SCSI 控制器,才终于见到了笑脸图标。


拒绝 AI 的手工逆向,到底打了谁的脸

这桩硬核工程里,还有两个细节值得单拎出来看。

面对三十年前的无源码固件,AI 帮不上忙,全靠手工逆向(示意图)
面对三十年前的无源码固件,AI 帮不上忙,全靠手工逆向(示意图)

一个是为什么更老的 Mac OS 7.6 比 9.2.2 更容易跑通。按理说后期的新世界 ROM 已经砍掉了对旧版 System 7.5 和 7.6 的引导支持,但 Rairii 此前专门开源了一个名为 Universal TBXI Patchset 的独立补丁库,把后期 ROM 里被阉割的接口恢复出来,配合 CHRP System Enabler 硬是让新固件引导了老系统。这也为后续把系统塞进内存连 Mac OS 8.0 最低要求都够不着的 GameCube 铺平了路。反倒是更现代的 Mac OS 9.2.2 在启动时频频崩溃,最后排查发现罪魁祸首是网络与通信组件 Open Transport——这套组件根本没想过世界上会有既没串口也没网卡的苹果电脑,必须把它从扩展文件夹里删掉,9.2.2 才能顺利进桌面。

另一个细节是 Rairii 在文中特意立下的声明:从 2025 年 6 月 22 日 fork 上游 openbios 起,整个项目没有使用任何 AI 编程代理或大语言模型,所有逆向、编码与调试全凭手工完成。

AI 写得出八股全栈,却算不出三十年前一行忘改标签的复制粘贴。

我非常理解他为什么把话挑得这么明。在 2026 年的今天,科技圈恨不得把所有软件工程都归功于大模型自动生成,但恰恰是这种跨越三十年的底层移植,戳破了 AI 编程无所不能的幻觉。大语言模型擅长在公开语料充沛的现代框架里排列组合,可面对没源码、没文档、塞满 1980 年代历史包袱的二进制固件,面对仿真器与真机在 16 位 PIO 模式下面临的奇数内存地址非对齐偏移,AI 根本无从推理。

Rairii 此前已经给这套硬件移植过 Windows NT,这次他把 NT 的 ARC 固件加载器改造成大端序 ELF 加载器,又把 GameCube 手柄驱动从 NT 移植过来充当鼠标,这种在刀尖上跟寄存器和内存转储对账的功夫,靠的是人对硬件脉络的直觉。用他自己的话说,做这些就是为了好玩和学习,要是上了 AI,既不好玩,也学不到东西。

古人讲,器欲尽其能,必先得其法。如今满街都在谈论用生成式工具十倍速堆砌新代码,却少有人愿意俯身去拆解旧机器里真正咬合的齿轮。这类看似无用的复古折腾,恰恰是软件工业的活化石标本库:它不仅给老系统续了命,还顺手揪出了 Dolphin 模拟器在非游戏负载下的底层仿真漏洞。

  • 提醒.该项目目前远未达到公开发布状态,Wii 原生 SD 控制器与 USB 控制器尚未打通,经典 Mac OS 的部分内存限制与电源管理仍待解决,想在标准版模拟器或真机上一键体验的玩家还需耐心等待。

当年的苹果为了活命,在 ROM 里藏了个“超级马里奥”把旧生态渡往 PowerPC;三十年后,一位拒绝 AI 的极客用满屏内存补丁,逼着这位老马里奥在真正的任天堂主机上跑完了40秒的开机路。技术演进的幽默感,莫过于此。