10 ポイント 投稿者 GN⁺ 22 일 전 | 3件のコメント | WhatsAppで共有
  • WiiのPowerPCベースのハードウェアを使い、**Mac OS X 10.0(Cheetah)**をネイティブで実行する移植プロジェクトを完成
  • Darwin/XNUカーネルをWii向けに改修し、ブートローダー・デバイスツリー・ドライバーを自作してGUI環境までの起動に成功
  • SDカード・フレームバッファ・USB入力デバイスをサポートするカスタムIOKitドライバーを実装し、完全なシステム動作を実現
  • BAT設定の衝突修正Hollywood SoC向けドライバー層の構築RGB→YUV変換フレームバッファなど、Wii特有の構造を反映
  • 10年以上にわたる試行の末、WiiでMac OS Xの完全起動と操作を実現し、一見不可能に思えるプロジェクトにも挑戦する価値があることを示した

WiiでMac OS Xを動かすプロジェクト概要

  • Mac OS X 10.0(Cheetah)Nintendo Wiiでネイティブ動作させるための移植プロジェクトを実施
  • WiiにはすでにLinuxNetBSDWindows NTなどのOS移植事例があり、今回そこにMac OS Xが加わった
  • WiiのPowerPCベースのハードウェアを活用してDarwin/XNUカーネルを動かし、必要なドライバーとブートローダーを自作
  • 結果としてWiiでMac OS XのGUI環境まで完全に起動し、キーボード・マウス入力にも対応

実行可能性の調査

  • WiiのPowerPC 750CL CPUは、G3 iMac/iBookで使われたPowerPC 750CXeの後継にあたり、CPU互換性の問題はない
  • Wiiの88MB RAM(MEM1 24MB + MEM2 64MB)は公式要件の128MBより少ないが、QEMUテストにより64MBでも起動可能であることを確認
  • 対応ハードウェアはUSB Gecko(シリアルデバッグ)SDカード割り込みコントローラーフレームバッファ映像出力USBポート
  • Mac OS Xのオープンソースコアである**Darwin(XNUカーネル、IOKit)**をWii向けに調整すれば、上位のGUIレイヤーも動作可能
  • WiiはHomebrew ChannelBootMiiによって自作コードの実行が可能で、移植実験に適している

移植アプローチ

  • 3つの起動戦略から選択:
    1. Open Firmwareの移植
    2. BootXの移植
    3. カスタムブートローダーの自作
  • Wii専用のブートローダーを新規作成し、ハードウェア初期化カーネル読み込みデバイスツリー生成カーネルへの制御移譲を実行
  • カーネル実行後はブートローダーコードは不要となり、その後はカーネルパッチとドライバー作成が中心となった

ブートローダー作成

  • ppcskelのサンプルコードを基に、Wiiの初期化とSDカード・フレームバッファ・USBデバッグ機能を実装
  • Mach-O形式のXNUカーネルをメモリにロードし、指定されたエントリポイントへジャンプして実行
  • カーネル実行確認のため、LED点滅パッチを挿入してカーネル突入段階を追跡
  • カーネル実行経路を逆追跡した結果、device_tree.cの段階で300例外が発生していることを確認 → デバイスツリー受け渡しの必要性を認識
  • デバイスツリーの生成と受け渡し

    • Wiiの固定ハードウェア構成を基に、ハードコードした最小ツリーを構成(/cpus, /memory
    • boot_args構造体にデバイスツリーポインタを含めてカーネルへ渡す
    • その後、カーネルが正常にツリーを認識して起動が進行

カーネルパッチ

  • XNUの**BAT(Block Address Translation)**設定がWiiのメモリマップと衝突するため、カーネルソースの修正が必要
  • **Mac OS X Cheetahゲスト(QEMU)**環境でカーネルビルド環境を構築
  • BAT修正USB Geckoへのコンソール出力リダイレクトを追加し、デバッグを可能にした
  • その後、仮想メモリ、IOKit、BSDサブシステムが正常に初期化
  • 起動ログに「Still waiting for root device」というメッセージが出力 → SDカードドライバーの必要性を確認

ドライバー作成

  • IOKit構造の理解

    • IOKitはC++ベースのカーネル拡張フレームワークで、**ドライバー-ナブ(nub)**構造を通じてハードウェア層を表現する
    • 例: IOPCIBridgeIOPCIDeviceSomeEthernetCardIOEthernetInterface
    • Wiiは**PCIバスではなくSoC(Hollywood)**構成を使うため、IOPCIFamilyを置き換えるカスタムドライバーが必要
  • Hollywoodドライバー

    • NintendoWiiHollywoodドライバーを作成し、デバイスツリー内の「hollywood」ノードとマッチング
    • 下位ハードウェアを表現する**NintendoWiiHollywoodDeviceナブ**を生成・登録
    • これにより、SDカードなど下位デバイス用ドライバーを接続可能にした
  • SDカードドライバー

    • IOBlockStorageDeviceを継承してWiiのSDカードアクセスを実装
    • MINI(Starletコプロセッサ)IPCコマンドIPC_SDMMC_SIZE, READ, WRITE)を使ってSDカードと通信
    • キャッシュされたメモリに起因する問題を解決するため、非キャッシュメモリバッファを使用
    • 成功裏にIOMediaナブが生成され、ルートファイルシステム認識と完全起動が可能に
    • 起動ログでBSD root: disk0s4を確認
  • フレームバッファドライバー

    • IOFramebufferを継承し、Wiiの**MEM1領域(0x01700000)**をフレームバッファに指定
    • 初期テキストコンソールとGUI切り替えのため、isConsoleDevice()trueを返すよう設定
    • Wiiの映像ハードウェアはYUVフォーマットを使うため、RGB→YUV変換用の二重フレームバッファを実装
    • 変換ループによって60Hzで色変換を実行 → 正常な色でGUI表示に成功
  • USB入力対応

    • WiiのOHCI USB 1.1コントローラーを動かすため、AppleUSBOHCIの利用を試行
    • 問題1: IOUSBFamilyのソース不在によりデバッグ不能
    • 問題2: IOPCIDevice依存のため、Wii向けのダミーNintendoWiiHollywoodPCIDeviceを作成
    • 問題3: エンディアン不一致(Wiiはreversed-little-endian)のため、ソフトウェア側のバイトスワップを削除する必要があった
    • IRC経由でMac OS X Cheetah向けIOUSBFamilyソースを入手し、修正・ビルドに成功
    • 結果としてUSBキーボード・マウス入力が動作し、Wiiが完全なMac OS Xシステムとして機能

ブートローダーおよびカーネルの改善

  • ブートローダー改善

    • SDカードパーティション探索と起動メニューを追加し、**Apple Partition Map(APM)**の解析を実装
    • **カーネル拡張(kext)**をブートローダーから読み込み、/chosen/memory-mapノードに登録
    • これにより、未改変のMac OS Xインストールイメージからの起動が可能になった
  • カーネルの簡素化

    • Wii専用のカーネル修正を最小限に整理:
    • BAT設定の修正
    • 「hollywood」ノードベースのI/Oアドレス認識
    • フレームバッファのキャッシュ整合性修正
    • ドライバーをカーネル外へ分離し、ビルド効率と保守性を向上

まとめ

  • 2013年の大学時代に構想したプロジェクトを、10年以上を経て完成
  • Windows NTのWii移植事例に触発されて挑戦
  • 結果としてWiiでMac OS X 10.0の完全起動とGUI操作を達成
  • 「不可能に見えるプロジェクトほど挑戦する価値がある」という教訓を強調

3件のコメント

 
ffdd270 22 일 전

おいしい文章に、素敵な書き手ですね…。

 
jjpark78 22 일 전

オタクの中のオタクは、やはり海外オタクということか..

 
GN⁺ 22 일 전
Hacker Newsのコメント
  • このプロジェクトは本当に驚異的な仕事だった。記事自体も引き込まれる内容で、最後まで夢中で読んだ
    特に「WindowServer が不満を示し、これを解決するには自分で framebuffer ドライバを書く必要があった」というくだりが印象的だった
    MacOS のI/O Kit 抽象化レイヤーが実際にきちんと機能しているのを見て驚いた。NeXT の開発者たちに拍手を送りたい

    • 自分も同じように感じた。ドライバを初めて書く立場では学習曲線は急だったが、システムが生きて動くのを見て IOKit のアプローチを理解できた
      他のプラットフォームでドライバ開発をした経験がないので比較は難しいが、構造的にはかなり魅力的だった
    • IOKit は OS X のために一から新しく作られたもので、NeXT 時代にはDriverKitという別のモデルを使っていたと聞いている
      以前 NetBSD の開発者たちが Mach/IOKit 互換レイヤーの上で PPC Darwin を動かし、Xquartz まで起動したこともあった。NetBSD が IOKit 呼び出しを翻訳していたという点が興味深い
    • Linux のスタックとも似ている点が多いので、Linux on Wii プロジェクトを見て framebuffer の問題をどう処理したのか比較してみようと思う
      Wii の上でこれほど多くの OS が動くというのはいまだに信じがたい
    • OPENSTEP の時代から複数のアーキテクチャと OS を対象にしていた経験が、こうした抽象化に役立ったのだろう
    • 「MacOS がどれほどよく抽象化されているかに驚く」という言葉に共感する
      実際、良い抽象化と悪い抽象化の違いは、どれだけうまく説明されているかにかかっている
  • エンジニアリング自体もすごいが、筆者がエコノミークラスで開発していたという点が本当に印象的だった

    • 自分ならエコノミークラスでノート PC をまともに使うだけでも大変なのに、Wii までつないでデバッグしていたなんて信じられない
    • 昔 Apple が機内で編集する広告を作っていたことがあった(YouTube リンク
    • 隣の席の人はたぶん「何だあれ?」と思いながらスマホだけ見ていたんだろう。自分だったら我慢できずに聞いていたと思う
    • 写真を見るとバスにも飛行機にも見えた。いずれにせよ移動中に Wii を持ち出して開発していたのは、ものすごい集中力と献身の証拠だ
      (追記すると、最初の写真はバス、2枚目は飛行機だった)
    • 移動中にこんな複雑なプロジェクトに没頭できるのが驚きだ。写真を見返したが、列車かバスのようにも見える。とにかくすごい見せつけ方だ
  • 私はNetBSD の Wii および Wii U 向けポートの作者として、このプロジェクトに心から祝意を送りたい
    これからどんな問題をどう解決したのかを見るのが楽しみだ

    • あなたのポートは大きな刺激になった。この分野に多くの貢献をしてくれてありがとう
  • 昔は自分も筋金入りの Mac マニアで、リバースエンジニアリングで初期の非公式な「iOS アプリ」を作ったこともあった
    だが今回のプロジェクトはそのすべてを上回っている。Wii で MacOS を動かしたことも驚きだが、記事自体があまりに精緻で面白い

    • 温かい言葉をありがとう :)
  • Wii の RAM が88MBしかないと初めて知った。ゲームが電子ベースでなくてよかった

    • 興味深い歴史的事実だが、Wii が発売されたのと同じ月に Windows Vista も北米で登場した
      Vista の最小要件は 512MB だったが、当時のほとんどの PC はそれより少ないメモリしか積んでいなかった
      今では 8GB が減って 16GB が標準になりつつあるのを見ると、時代は大きく変わったと感じる
    • Wii の設定メニューがHTML の Web ページでできていたという事実が面白い。2006 年のコンソールですら Web の手から逃れられなかった
  • プロジェクトを始める前に「そもそも可能なのか?」を確認したところ、2021 年の Reddit コメントに「可能性 0%」と書かれていた
    それを見て逆にやる気が出た。そこで Wii のハードウェアを分析しながら始めた。本当に笑えた

    • こういうプロジェクトの価値は、この手の「絶対に不可能」という発言を永遠に記録することにもある
      人は「ほぼ不可能なこと」を絶対に起こらないことだと決めつけ、自分では原則ある懐疑主義者だと勘違いしてしまう
    • 昔の Linux ジョークを思い出した。「Linux で X をどうやるのですか?」と聞くのではなく、「Linux では X は不可能だ」と言えば、誰かがすぐ方法を見せてくれるという話だ
    • 自分も Adafruit の MacroPad ドキュメントで「BLE や WiFi は追加できない」という文を見てプロジェクトを始めた
      「本当か?」と思って UART ポートを再構成し、ESP32 をつないだ
    • 「すべてがマゼンタ色だ」というデバッグ場面も面白かった
    • 多くのネットのコメント投稿者は、こういうふうに皮肉を知性と取り違えている
      無知な皮肉という概念がないのが問題だ
  • Wii でカーネルパニックをデバッグしながら飛行機のエコノミークラスに座っていたなんて、その集中力のレベルは想像もつかない
    たいていの人は飛行機で本を 1 冊読むだけでも大変なのに

  • 本当に素晴らしいプロジェクトだった。昔の低レベル開発の黄金時代を思い出す
    昔は VGA を初期化してピクセルを打つのも簡単で、6502 のようなチップも扱いやすかった
    だが今ではシステムが複雑になりすぎて、参入障壁が高くなった
    そのうえ AI は開発を単純化しているように見せながら、かえってアクセスしにくくしている

  • 自分も同じようにMac OS 9 を Wii U に移植しようと試みている
    このプロジェクトを見て完全に感銘を受けたし、「不可能だ」と思うたびにまた勇気をもらえる

    • 本当にすごい。Mac OS 9 はクローズドソースだから、さらに難しい挑戦になりそうだ
    • XNU や Darwin のソースがないのは不利だが、System 7.1 の流出ソース、Ghidra、MCP のようなツールで補えるはずだ。幸運を祈る
  • 記事も素晴らしかったが、.mov 動画を <video> タグで埋め込んだのはブラウザ互換性の問題がある
    Chrome や Firefox では再生されない

    • Chrome と Firefox で動かなければ、実質的にほぼすべてのブラウザで動かないと考えていい
    • ありがとう! すでに修正した