
2026/04/09 0:40
私、macOS XをNintendo Wiiにポート(移植)いたしました。
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
改良された要約
Mac OS X 10.0(Cheetah)は、Nintendo Wii 上でネイティブに動作するようにポートされ、コンソールをキーボード/マウス入力と GUI サポート付きの完全機能型デスクトップへ変貌させました。プロジェクトのコアは、ppcskel をベースに最初から書き直されたカスタムブートローダーです。このブートローダーは、Wii の PowerPC 750CL CPU を起動し、メモリレイアウトを設定し、最小限のデバイスツリー(root → cpus → PowerPC,750; memory)を作成します。SD カードから XNU カーネルをロードし、実行中にカーネルバイナリをパッチ(MEM1/MEM2 用の BAT 設定と USB Gecko へのコンソール出力)し、制御を XNU に渡します。
ブートローダーが提供する主要ドライバーは次の通りです:
- SD‑カードドライバー:Starlet MINI IPC コマンド(IPC_SDMMC_SIZE, READ, WRITE)を介して IOBlockStorageDevice を実装し、XNU が SD カードからルートファイルシステムをマウントできるようにします。
- フレームバッファドライバー:0x01700000 に RGB フレームバッファ(640×480 @ 16 bpp)を提供し、Wii のアナログテレビ出力用に YUV へ変換して Mac OS X GUI を実現します。
- USB サポート:PCI デバイスのニブ(NintendoWiiHollywoodPCIDevice)を作成し、AppleUSBOHCI をパッチして受け入れさせ、OHCI ドライバーからバイトスワップ処理を除去することでリバースレトルエンディアンハードウェアに対応し、USB キーボード/マウス機能をフル実装します。
ブートローダーは Apple Partition Map を解析し、起動可能なパーティションを一覧表示し、/chosen/memory‑map ノード経由でカーネル拡張を直接メモリにロードできるようにするため、改変されていない Mac OS X インストーラーパーティションからのインストールも可能です。必要なカーネル変更は最小限(BAT 設定、“hollywood” I/O ベース取得、フレームバッファキャッシュ整合性修正)で済み、その他すべてのドライバーはブートローダーが提供します。
この成果は、歴史的にサポートされていなかったプラットフォーム――Nintendo Wii――でも Mac OS X Cheetah をエンドツーエンドで動作させることを示し、ホビイストに低コストのレトロコンソールとして機能するデスクトップコンピュータを提供します。
本文
マック OS X 10.0(Cheetah)をニンテンドーWii上でネイティブに動かす
概要
2007年の発売以来、WiiはLinux・NetBSD・Windows NTをホストしてきました。
現在ではMac OS X 10.0 Cheetahも実行できるようになりました。このプロジェクトでは
Wii のハードウェアを学び、ブートローダを書き、XNU をパッチし、SD‑カード・フレームバッファ・USB 用の IOKit ドライバを構築しました。
1. 実現可能性
| 項目 | 内容 |
|---|---|
| ハードウェア | CPU:PowerPC 750CL(G3 iBooks / iMac 系列と同一) RAM:88 MB(24 MB 1T‑SRAM + 64 MB GDDR3 SDRAM) Cheetah は公式に128 MB が必要ですが、少ないメモリでもブート可能 必須ペリフェラル:USB Gecko(シリアルデバッグ)、SDカード(rootfs)、IRQ コントローラ、RAM フレームバッファ、マウス/キーボード用 USB ホスト |
| ソフトウェア | Darwin のコアはオープンソース。Wii 上で動作させるために必要なのはカーネルパッチだけ 実際のMac は Open Firmware → BootX → XNU を経て起動しますが、XNU が開始するとファームウェアや BootX への依存はなくなります |
2. ブートローダ設計
| タスク | アプローチ |
|---|---|
| ハードウェア初期化 | の雛形を使用。レジスタ設定、フレームバッファ、USB Gecko をセットアップ |
| カーネル読み込み | SDカードから Mach‑O をロードし、ロードコマンドを解析してセグメントを RAM にマップ |
| デバイスツリー構築 | 最小限のハードコード済みツリー(, , )を作成 |
| ブート引数渡し | を埋め込み、コマンドライン、DRAM バンク情報、ビデオ情報、deviceTreeP などを設定 |
| XNU 起動 | エントリポイントを関数としてキャストし、 で呼び出す |
- カーネルエントリポイントのパッチ
- 各重要ステージ(
,start.s
など)後に Wii の LED を点滅させるバイナリパッチをオンザフライで行う。シリアル出力が無い環境でも進捗確認が可能。ppc_init.c
- 各重要ステージ(
3. カーネルパッチ
- BAT 設定 – XNU のメモリマッピングを MEM1/MEM2 レイアウトに合わせる。
- I/O ベースアドレス – デバイスツリー内の
ノードから取得。hollywood - フレームバッファキャッシュ整合性 – 未キャッシュアクセスを強制。
開発環境:QEMU で Cheetah を実行し、ホスト Mac から NFS 経由で XNU ソースを取得、SSH でビルドをトリガー。
4. ドライバ開発
4.1 IOKit の基礎
- ドライバはオブジェクト、nubs はアタッチポイント。
- 例:PCI バスドライバが
nubs を生成し、イーサネットドライバがそれらにアタッチ。IOPCIDevice
4.2 Hollywood SoC ドライバ
bool NintendoWiiHollywood::publishBelow(OSIterator *iter) { IOService *nub; while ((next = (IORegistryEntry *)iter->getNextObject())) { nub = createNub(next); if (!nub) continue; if (nub->attach(this)) nub->registerService(); nub->release(); } iter->release(); return true; }
配下の各子ノードに対してナブを作成し、他のドライバがアタッチできるよう公開。/hollywood
4.3 SD‑カード ドライバ
をサブクラス化。IOBlockStorageDevice- Starlet の Mini IPC を利用し SD コマンド(
,IPC_SDMMC_SIZE
,READ
)を送受信。WRITE - DMA バッファ用に未キャッシュメモリを扱う。
4.4 フレームバッファ ドライバ
IODeviceMemory *NintendoWiiFramebuffer::getApertureRange( IOPixelAperture aperature) { return IODeviceMemory::withRange(0x01700000, 640 * 480 * 2); }
- RGB(Mac OS X が使用)と YUV(Wii のビデオハードウェアが期待)という二つのフレームバッファを提供。
- 60 Hz で RGB → YUV を変換し、YUV フレームバッファへコピー。
isConsoleDevice() は true を返すことで従来型テキストコンソールを抑制。
4.5 USB サポート
- 欠落したソース – 古い Apple CVS の
を取得。IOUSBFamily - ホストコントローラ –
を改造し、偽 PCI ナブ(AppleUSBOHCI
)を作成してドライバ人格を満たす。NintendoWiiHollywoodPCIDevice - エンディアン – Wii はリバース・リトルエンディアンであるため、不要なビットスワップ処理をバイナリから除去。
結果として USB キーボード/マウスが動作し、Wii を実用的な Mac に変えることに成功。
5. ブートローダ拡張
- パーティションブートメニュー – Apple Partition Map (APM) を解析してインストール・システムパーティションを一覧表示。
- ドライバ注入 – SDカードから kext を読み込み、
にロードして XNU 起動前にカーネルをクリーンに保つ。/chosen/memory‑map
6. 簡易化されたカーネル
必要なパッチはわずか三点:
- Wii メモリレイアウト用の BAT 設定。
- “hollywood” ノードから取得した I/O ベースアドレス。
- フレームバッファキャッシュ整合性修正。
ドライバは root ファイルシステムに置くことで、将来の 10.1 Puma への移植が容易になります。
7. 締めくくり
このプロジェクトは、一見不可能と思われるポートでも、粘り強さとハードウェア理解を深めれば実現できることを示しました。
得られた教訓は次の通りです:
- ブートローダ設計
- Mach‑O パース
- IOKit ドライバ構築
- Starlet 上の IPC リバースエンジニアリング
- エンディアン特有の問題処理
現在、Wii はフル機能の Mac OS X デスクトップを稼働し、GUI、キーボード/マウス入力、SDカード経由でのインストール・アップデートが可能です。