
2026/07/14 3:18
セガ 32X 上で Linux。ハードウェア同期プリミティブなど必要なのか?
RSS: https://news.ycombinator.com/rss
要約▶
日本語訳:
まとめ:
このテキストの主な成果は、1994 年に発売され古めかしいアーキテクチャで知られるゲーム機セガ 32X に現代的な Linux オペレーティングシステムの移植に成功したことです。深刻なレガシー制約を克服し、開発者はデュアルプロセッサシステムを実用的なマルチ CPU 環境へと変えました。主な技術的ブレイクスルーとしては、メモリの制約を拡張するために FPGA ベースのフラッシュカートを使用し、オリジナルのハードウェアに必要な同期プリミティブが存在しなかったためソフトウェアによる同期アルゴリズムを実装することなどがあります。チームは、SH2 プロセッサで存在しないオペコードが原因となった重大なコンパイラエラーも解決しました。アタリジャガードおよびメディアテックスマートフォンへの移植での過去の成功を踏まえ、このプロジェクトはメモリアドレスマッピングに関する大幅なエンジニアリング努力が必要な場合でもレガシーハードウェアに現代的なシステムを実行できることを示す概念実証です。パフォーマンスはバス競合によって依然として著しく制限されていますが、最終的なセットアップでは安定性を確保するために専用の musl ツールチェーンを利用しています。提供された設定ファイルを用いて愛好家がこのユニークな移植を再現できるようにしており、特定の制約に対して十分な最適化が適用されれば、珍しいコンソールでも複雑なオペレーティングシステムを実行できることを示しています。
本文
セガ 32X への Linux 移植:jmp _linux
から会場の集合へ
jmp _linuxLinux on Jaguar の投稿が人気だったため、今回のエントリも linuxmd プロジェクトへの敬意と感謝から始まります。ハッカーニュースなどでも関心が寄せられました。なぜこの種のプロジェクトが続くのか?答えはシンプルです。ゼロからボードを立ち上げるスキルの向上のため、そして単純な作業以上の「結果を生むレイヤー」の実験が楽しいためです。
前例:1990 年代の携帯電話とメディアテック
開発活動が本格的になるきっかけは中学生時代でした。親から買ってもらった**MediaTek 6589 プロセッサ(1GB RAM)**搭載の初期モデル携帯電話で、Android 5.0 Lollipop を動かそうとした経験があります。
- ベンダーによるアップデート拒否を受け、GPL に基づいてソースコード公開を要望し、ついにリークされたALPS フルソースコードを手に入れました。
- ベンダー製画像の逆エンジニアリングを行い、欠落するデバイスドライバ(LCM、バッテリー等)を実装しました。
- Bluetooth 非対応でも、純粋な Material Design が動作する成功体験がありました。
前例:セガ 32X のハードウェア
セガ 32X はメガドライブとサターン中間の「アドオン」として登場しましたが、実はベースコンソールよりも遥かに強力な仕様を持っています。
| コンポーネント | セガジェネシス/メガドライブ | セガ 32X |
|---|---|---|
| メイン CPU | 1 × モトローラ 68000 @ 7.6 MHz | 2 × ヒタチ SH2 (SH7604) @ 23 MHz |
| ビット数 | 16 ビット | 32 ビット |
| 最大画面上の色数 | 64 | 768 |
| システム RAM | 64KB + 256KB SDRAM | - |
| ビデオ RAM | 64KB | 256KB(ダブルバッファリング) |
| グラフィックス | スプライトベース | ソフトウェアレンダリングされた 3D |
ソニープレイステーション 1 とほぼ同時発売という戦略的失敗もありましたが、Linux 移植の観点からはこの強力なアーキテクチャが魅力的でした。
移植工程:jmp _linux
から会場の集合へ
jmp _linuxSH2 に Linux を動作させるために、既存の Chilly Willy セット(開発キット例)をベースに独自の展開を行いました。
メモリ構成の工夫:256K + 64K
Linux を動作させるための最大の障害はメモリ確保でした。通常のフラッシュカートでは解決不可能でしたが、**Krikkz から発売されている拡張 SSFv2 マッパー(ROM->RAM)**を利用しました。
- このマッパーにより、外部 ROM を書き込み可能な RAM として扱うことが可能になります。
- これにより 4MB の RAM が確保でき、Linux ロードローダーと initramfs を収めるスペースを確保しました(最終的に約 540KB の ROM と残りの RAM のバランスで動作を確認)。
コンパイルと初期起動の壁
独自に作成した
sh2eb-elf クロスコンパイラーで Linux をコンパイルしましたが、いくつかの難関を突破する必要がありました。
- GCC 的 ICE (Internal Compiler Error):
のコンパイル時に発生し、手直しして回避しました。kernel/nstree.c - UART デバッグ: 初期段階では 32X からの出力が制限されるため、ジェネシスの UART を介してメッセージを確認しました。
- スタック破損の修正:
,ashlsi3
,ashrsi3
のレジスタ操作によりスタックが破壊され、無限ループになる問題を発見し、安全な実装に修正しました。lshrsi3 - 非存在命令
の対策: SH2 に存在しない命令を呼び出すとフリーズするため、関連コードから削除または代替処理を行いました。shrd - ツールチェーンの選定: 難易度の高いクロストルツールで戦い抜き、
を利用してmusl-cross-make
ツールチェーンを構築しました。sh2eb-linux-musldpic-
これにより、ELF FDPIC サポートを活用し、システムが最終的に起動するに至りました。
挑戦:SMP (対称多重プロセッシング) の実装
「ふざけているのではないか?」というレベルの困難なチャレンジとして、2 つの SH2 CPU を同時動作させることに取り組みました。
- ハードウェア上の同期プリミティブ(互斥ロックなど)やキャッシュ一貫性が存在しないため、純粋なソフトウェア実装が必要でした。
- Peterson のアルゴリズムを採用し、
などの機能もソフトウェアでスピンロックを介して実装しました。cmpxchg - IPI (Inter-Processor Interrupt) の配信には 68000 CPU をバスアダプターとして活用し、68000 がインポット信号を受けて各 SH2 に割り込みを通知する仕組みを構築しました。
- CPU ID の識別は、ハードウェア除算レジスタ
にマッピングしたソフトウェア定義のレジスタにより実現しました。DVSR
結果
以下のログのように、2 つの CPU が同時に起動することが確認できました。ただし、バス競合によりパフォーマンスは劣悪でしたが、「動作すること」自体が目的でした。
smp: 二次 CPU を立ち上げ中... MARS SMP: 二次 SH2 を 22082000 に解放しました smp: 1 ノード、2 CPUs を立ち上げました
スケジュールのバグや
default_idle() の修正など、開発には数多くの試行錯誤と深夜の追跡が必要でした。
まとめ:voilà
このプロジェクトは OOM (Out of Memory) やダイエットが必要な Linux/Busybox との戦いでもありましたが、非常に報われる体験となりました。
もし誰かが試すなら Misc. config ファイル
以下の設定ファイルが活用可能です。
- Linux ツリー:
mars_defconfig - Busybox 設定: ビューティボックス標準設定
- Init スクリプト: システム起動時に必要となる初期スクリプト