在 Nintendo Wii 上跑起 Mac OS X 10.0:一場跨越 20 年技術斷層的低階奇航

本篇文章更新時間:2026/04/09
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知或向一介資男的 LINE 社群反應。
如果本站內容對你有幫助,歡迎贊助支持


在 Wii 上移植 Mac OS X 10.0:給老硬體一個新生命的極限挑戰

編輯前言:這篇文章記錄了一段不可思議的工程旅程——把 2001 年的 Mac OS X Cheetah 移植到 2006 年的 Nintendo Wii 上。對於任何喜歡低階系統、復古硬體,或是單純享受「做一件看似不可能的事」的人,原文都值得細讀。

核心觀點 (Key Takeaways)

  • Wii 的 PowerPC 750CL 與早期 G3 Mac 極為相近,使 Mac OS X 10.0 在 CPU 層面具備可行性。
  • 核心挑戰不在於硬體性能,而是 bootloader、裝置樹、舊版 XNU kernel patch、I/O 驅動 等龐大的相依問題。
  • 雖然 Mac OS X 本身封閉,但 Darwin 核心開放原始碼,使開發者能以「自訂 bootloader + kernel patches + 自寫驅動」方式重建整個啟動鏈。

深入解析

原文是篇長達多萬字的技術冒險,從 feasibility study 到 GUI 上桌面,每一步都像在荒野探路。以下整理我認為最關鍵的幾個面向。

1. Wii 與早期 Mac 的「意外親緣」

Wii 採用 PowerPC 750CL,與 iBook G3 的 750CXe 同族,加上 Mac OS X Cheetah 對記憶體的要求相對寬鬆,使作者判定:

CPU 與基本記憶體配置不會是阻礙。

接著,他確認 Wii 的特殊記憶體架構(MEM1 + MEM2)與 Mac OS X 的假設不完全對應,但仍能透過 QEMU 測試確認可行性。

2. 重建整套 Mac 的開機流程,但「不需要」Open Firmware

早期 PowerPC Mac 的啟動鏈如下:
Open Firmware → BootX → XNU

作者選擇完全繞過前兩者,自寫一個極精簡的 bootloader:

  • 初始化 Wii 硬體
  • 從 SD 卡載入 Mach-O 格式 kernel
  • 建立裝置樹 (device tree)
  • 跳進 XNU

這看似「偷吃步」,但其實是最務實的做法,因為 Wii 僅需支援一套固定硬體,不需要 Open Firmware 那樣的泛化設計。

3. 用 LED 閃爍偵錯:沒有輸出時的土法煉鋼

當 kernel 啟動後,它會重設 Wii 環境,使 bootloader 的 debug 輸出全失效。於是作者想出一招:

直接在 kernel binary 中 patch 指令,讓 LED 閃爍,確認程式執行到哪裡。

這段操作本身就超 hard-core:反編譯、對照 XNU 原始碼、手動替換 PowerPC 指令,像是在 1990 年代的韌體除錯現場。

4. 寫驅動才是最痛苦的部份:Hollywood SoC、Starlet 與 IOKit

Wii 的硬體是高度客製的 Hollywood SoC,沒有 PCI,沒有標準介面,因此:

  • 必須用 IOKit 自寫 Hollywood 驅動
  • 自己 publish 底層硬體的 nubs
  • 再用這些 nubs 實作 SD card、framebuffer、USB… 等其他驅動

SD 卡驅動尤其精彩:

  • Wii 的 SD 介面靠 Starlet ARM 核心代管
  • PPC 端需透過特殊記憶體位置向 MINI 發 IPC 指令
  • 還得處理 cache coherency,確保 PPC 能讀到 Starlet 寫入的資料

這些都是完全無文件的「考古工程」。

5. Framebuffer 雙緩衝:解決 Wii 顯示器只吃 YUV 的奇怪限制

Mac OS X UI 運作需 RGB framebuffer,但 Wii 的顯示硬體只接受 YUV。

為此,他實作:

  • 一塊 RGB framebuffer (Mac 用)
  • 一塊 YUV framebuffer (Wii 用)
  • 每秒 60 次自動轉換 RGB→YUV

這直接讓 GUI 正常顯示,也終於看到熟悉的 Aqua 介面出現在 Wii 上。

6. USB 最大的突破:透過古早 CVS 找到遺失的 IOUSBFamily 原始碼

最戲劇化的一段:

  • Cheetah 的 USB stack 原始碼 Apple 沒公開
  • 舊版 USB stack 預期跑在 PCI + little endian 設計的 Mac 上
  • Wii 的 OHCI 控制器是 reversed-little-endian + 非 PCI

沒有原始碼幾乎無法 patch,直至作者透過 IRC 拿到完整 CVS:

這成為突破 USB 的關鍵,最終讓鍵盤滑鼠運作,使 Wii 變成真正可操作的 Mac。

筆者心得與啟發

這篇文章最打動我的並不是技術成果,而是整段心態:

明知不可能,但還是開始做。

在作者眼中,這不是「讓 Wii 變成 Mac」,而是一次穿越未知領域、剝開層層黑箱的冒險。從 LED 閃爍、kernel patch、記憶體同步,到自行實作整套 USB stack,每一步都展示了真實的工程推進方式:

  • 找不到文件就 reverse
  • 沒有接口就自己寫
  • 系統 crash 就從最底層查起
  • 舊資料消失就去 IRC 問

看完之後,我重新思考了「興趣專案」的價值。那些我們覺得太大、太久、太難的想法,也許正因為如此,才值得開始。

如果你也有一個放了十年的技術夢,不妨就從今天開始動工。


Share:

作者: Chun

WordPress 社群貢獻者、開源社群推廣者。專注於 WordPress 外掛開發、網站效能最佳化、伺服器管理,以及 iDempiere 開源 ERP 導入與客製開發。曾參與 WordCamp Taipei 等社群活動,GitHub Arctic Code Vault Contributor。提供資訊顧問、WordPress 開發教學、主機最佳化與企業 ERP 整合服務。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *


文章
Filter
Apply Filters
Mastodon