概要
- Mac OS X 10.0 (Cheetah) をNintendo Wiiにネイティブ移植した技術的挑戦の解説
- Wiiの PowerPCアーキテクチャ とMacの互換性検証
- 独自ブートローダー 作成・カーネルパッチ・デバイスツリー生成の詳細
- カーネル起動プロセス の分析とデバッグ手法
- Wii上でMac OS Xを起動するための 主な課題と解決策
Mac OS X 10.0 (Cheetah)をNintendo Wiiでネイティブ起動
- 2007年のWii発売以降、LinuxやNetBSD、Windows NTなどの移植事例
- 今回、 Mac OS X 10.0 (Cheetah) をWiiに移植したプロジェクト紹介
- Wiiの PowerPC 750CL プロセッサはG3 iBookやiMacと近縁で互換性あり
- RAMは公式128MB要件に対し、Wiiは 88MB(MEM1: 24MB、MEM2: 64MB) 構成
- QEMU上で64MB RAMでもCheetah起動を検証済み
Wiiハードウェアとの互換性調査
- WiiのCPUは PowerPC 750CL、Mac G3世代と近い設計
- シリアルデバッグ用USB Gecko、SDカード、割り込みコントローラ、フレームバッファによるビデオ出力、USBマウス・キーボード対応
- 必要なハードウェアサポートをリストアップし、実装計画を策定
ソフトウェア互換性と起動プロセスの理解
- Mac OS Xの Darwin(XNUカーネル/IOKit) はオープンソース、上位層はクローズドソース
- Darwin部分を動作させれば、上位層も大きな修正なしで動作する見込み
- PowerPC Macは Open Firmware でハードウェア検出・デバイステリー構築・ブートローダー起動
- BootX がカーネルをロードし、起動後は依存しない設計
- Wiiは Homebrew Channel/BootMii で独自コード実行が容易
ブートローダー作成アプローチ
- Open FirmwareやBootXの移植は複雑で不要なため、 独自ブートローダー を新規開発
- ブートローダーの役割は、Wiiハード初期化・SDカードからカーネルロード・デバイステリー/ブート引数生成・カーネルへの制御移譲
- カーネル起動後は、ブートローダーのコードは不要となるため、最小限の実装に集中
ブートローダー実装詳細
- Wii向け低レベルサンプルコード ppcskel をベースに開発
- SDカードから Mach-O形式 のXNUカーネルをロードし、ロードコマンドに従いメモリ配置
- カーネルエントリーポイントへジャンプし、起動を開始
カーネル起動とデバッグ
- カーネル起動直後は画面が黒くなり、デバッグログも停止
- デバッグ手法として、カーネルバイナリの特定箇所を LED点灯命令 にパッチし、進行度を可視化
- Hopper Disassembler でバイナリオフセットとソース関数を突き合わせてパッチ箇所特定
- ブートローダー内でオンザフライでカーネルバイナリをパッチする機能を実装
デバイステリーの生成とカーネル引数
- Wiiのハード構成は固定のため、 デバイステリーをハードコーディング
- 最小構成(root/cpus/PowerPC,750/memory)からスタートし、必要に応じて拡張
- デバイステリーは boot_args 構造体でカーネルへ渡す
- デバイステリーを正しく渡すことで、起動時の例外エラーを回避
カーネルパッチと互換性問題の解決
- XNUカーネルはビデオ/I/Oメモリの配置を前提としているため、 Wiiのメモリマップ(MEM1/2) に合わせてカーネルソースを修正
- カーネルビルド環境の構築や、必要なパッチ作成を進行
今後の課題と展望
- Wii固有のドライバ(USB、SDカード、ビデオ、入力デバイス等)の実装
- Mac OS Xユーザーランドの動作検証と安定化
- 移植プロジェクトのドキュメント化とGitHubリポジトリ(wiiMac bootloader)での公開
- 他のPowerPCプラットフォームへの応用可能性
このプロジェクトは WiiのPowerPCアーキテクチャ と Mac OS XのDarwinカーネル の共通点を活かし、独自ブートローダー・カーネルパッチ・デバイステリー生成など、OS移植の実践的なノウハウを提供する事例となっている。