把苹果系统跑在游戏主机上,听起来确实有点像天方夜谭,不过开源开发者 Bryan Keller 真的做到了。最近,他成功把苹果在 2001 年发布的经典操作系统 Mac OS X 10.0“Cheetah”移植到了任天堂 Wii 上,让这台 2006 年推出的老游戏机直接变成了一台可以正常运行的 Mac。

整个项目的细节在 Hacker News 上引起了不少讨论,这背后有哪些技术门道?我们一起来看看。
灵感来自前人,瞄准 PowerPC 架构
这个移植项目的起点,其实是 Keller 在网上看到有人把 Windows NT 移植到 Wii 上的消息。作为开发者,他马上想到:既然 Wii 用的是 IBM 的 PowerPC 架构处理器,而当年的 Mac 也是 PowerPC,那把 Mac OS X 搬过去,理论上也不是完全不可能。
支撑这个想法的关键在硬件上。Wii 使用的是 PowerPC 750CL 处理器,而苹果当年在 G3 iBook 和 iMac 上用的是 PowerPC 750CXe,这两款芯片属于同一系列,有“血缘关系”。也正是因为这一点,让 Keller 觉得这件事是“有机会搞成的”。
核心移植:改 Darwin 内核,编译定制版本
根据 Keller 在个人博客里的详细分享,这个移植过程技术难度非常高。他首先对 OS X 的核心源码做了一系列修改,然后编译出一个定制版的内核二进制文件。这一步可以说是整个项目最关键、也最难的一部分。

他在博客里提到,大致思路是:只要能把开源部分改到让 Darwin 内核运行起来,那些闭源部分理论上就可以直接用,不用额外改。但实际操作起来并没有这么顺利,在内核成功启动之后,后面还有大量需要手动处理的细节问题。
驱动难题:SD 卡、显示、USB 全都得自己搞
内核能跑起来之后,还远远不够,Keller 还得给 Wii 写一整套定制驱动,才能让 OS X 真正用起来。
首先是 SD 卡驱动,他专门写了一个驱动,让系统可以通过 Wii 的 SD 卡槽读取数据,从而完成文件系统启动。
然后是显示输出,这一块更麻烦。Wii 的视频硬件和 OS X 的图形系统在颜色处理上不兼容:Wii 用的是模拟视频信号,而 Mac 输出的是标准 RGB 数字信号,结果一开始启动时画面颜色完全不对。为了解决这个问题,他需要同时处理两套 framebuffer:一套给 OS X 内部用的 RGB framebuffer,另一套是给 Wii 输出用的 YUV framebuffer,中间还要手动做颜色格式转换。
最后是 USB 支持。为了让键盘和鼠标能用,他需要修改苹果的 AppleUSBOHCI 驱动,让它适配 Wii 的 USB 1.1 控制芯片。但问题是,这套驱动源码早就找不到了。最后他是在 IRC 聊天室里到处问,才找到很老的 OS X Cheetah USBFamily 源码,才把这一块补上。
硬件限制太明显:内存不够是最大问题
就算软件问题一个个解决了,Wii 本身的硬件限制还是绕不过去。Wii 只有 88MB 内存,而 Mac OS X 10.0 官方最低要求是 128MB,差了整整 40MB。

这就意味着必须拼命优化内存占用,才能让系统勉强跑起来。前期开发基本都是在另一台 MacBook 上完成的,到了后期,才慢慢调试到可以在 Wii 本机上正常运行。
度假都带着 Wii 写代码:靠毅力硬啃下来
整个移植过程很长,而且各种问题不断,但 Keller 的投入一点都没减少。据说他甚至去夏威夷度假的时候,也把 Wii 带在身边,抽时间继续调试。

在解决了一堆技术难题之后,Mac OS X Cheetah 的安装程序终于成功在 Wii 上跑起来了,键盘和鼠标也都能正常使用。这台原本只是用来打游戏的主机,就这样变成了一台真的可以操作的苹果电脑系统设备。
完整开源,感兴趣也可以自己试
Keller 已经把整个开源项目的源码放到了 GitHub 上,感兴趣的开发者可以直接拿来自己折腾,在 Wii 上装 OS X。他还在个人网站上详细记录了整个过程,每一个技术难点都有说明,是理解这个项目很好的参考资料。
其实在这之前,Linux、NetBSD、Windows NT 都已经被移植到 Wii 上了。现在再加上 Mac OS X 10.0“Cheetah”,可以说 Wii 已经成了能运行最多操作系统的游戏主机之一。
一个原本为客厅娱乐设计的游戏机,现在反而成了开源玩家眼里的“终极测试平台”。这大概也是 Wii 当年发布时,谁都没想到的一种另类“遗产”。