世界を動かす技術を、日本語で。

Mac OS XをNintendo Wiiに移植しました

概要

  • 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移植の実践的なノウハウを提供する事例となっている。

Hackerたちの意見

こんなのが実現する可能性はゼロだね。正直、俺も同じこと言うと思った。素晴らしい仕事だ!

昔はハードコアなMacオタクで、プロにもなったんだ。俺の最高の逆アセンブリの成果は、iPhoneに公式のアプリストアがなかった頃に最初の「iOS」アプリの一つを作ったことかな。でも、これには本当に驚かされた。彼が成し遂げたことは、MacOSをWiiで動かすだけじゃなく、詳細な投稿自体もすごい。マジで素晴らしい。

すごい、これには dedication があるね!動かせたこと、おめでとう!

素晴らしい仕事だね。この話が好きなら、Mac OS XがIntelに移植された話も面白いかも。 https://news.ycombinator.com/item?id=4091216

ここでの驚くべきエンジニアリングに加えて、OPは経済クラスの飛行機の座席で開発してるのをさりげなく見せつけてるね。

これが一番すごいところだよ。エコノミークラスの席じゃ、ノートパソコンをちゃんと使うのも難しいし、画面を見える位置に置くことも、キーボードで打つことも同時にはできないからね。(Wiiを接続するなんて論外だし。)

このサイトのAIに関する話が、こんな素晴らしいものに置き換わったら、世界はもっと良くなるだろうね。

さあ、投稿しよう!自分が見たい変化になろう。

いい仕事とレポートだね!ちょっとした注意点だけど、.movの動画をタグの中に埋め込んでるね。これは全てのブラウザ(特にChromeやFirefox)と互換性がないから、動画が読み込まれないよ。

ChromeでもFirefoxでも動かないなら、ほとんどのブラウザと互換性がないってことだね。

おっと、ありがとう!修正したよ。

このプロジェクトにどう取り組むかを考える前に、まずそれが可能かどうかを知る必要があったんだ。2021年のRedditのコメントによると、「これが実現する可能性はゼロパーセント」だって。ちょっと励まされた気がして、基本から始めたよ。Wiiのハードウェアは何か、そしてその時代の本物のMacと比べてどうなのか。思わず笑っちゃった。

特に好きなのは、あるRedditユーザーのフォローアップコメントだね。>「どうぞ、ダウンボートしてくれ。俺が言ったことは全部正しいから。」

これはすごいよ。限界を押し広げるだけじゃなくて、時間と努力で何が達成できるかをはっきり示してくれてる。こんなに詳しくドキュメントしてくれてありがとう、そして完成おめでとう!

これはただのクールなプロジェクトじゃなくて、書き方も素晴らしい。最後まで夢中になっちゃったよ。特にこの部分が好きだな。>「この時点で、システムはMac OS XのGUIを表示するためのフレームバッファドライバを探していた。ログに示されているように、WindowServerは不満そうだった - これを解決するには、自分でフレームバッファドライバを書く必要があった。MacOSがこれほど抽象化されているとは驚きだね。I/O Kitの抽象化レイヤーは、実際に言っていることをやっているように見えた。NeXTの開発者たちにはちょっとした称賛を送りたい。」