1994年のSEGAスーパー32XでLinuxが起動、23MHzのSH2を2個とも動かす

1994年に出たゲーム機の周辺機器でLinuxを動かす。Makerのcakehonolulu氏が、セガの「スーパー32X」にLinuxを移植し、2つのCPUを同時に使うところまで持ち込んだ経過を公開した。前作のAtari JaguarでのLinux起動に続く挑戦になる。同氏は、ボードの立ち上げ作業そのものが面白く、腕を鍛える目的もあると書いている。

スーパー32Xは、1994年12月3日に発売されたメガドライブ用の周辺機器だ。カートリッジスロットに挿すと、23MHzのSH2を2個追加して32bit機に引き上げる。ただしメモリは厳しい。本体側の64KBに、32X側の256KBが加わるだけだ。

最初の関門はそのメモリだった。同氏は、Krikkz製フラッシュカートに載る拡張マッパーの機能を使い、カートリッジのROM領域へ書き込めるよう設定を切り替え、4MBをRAM代わりに使った。うち540KBほどをROMとして残し、そこにLinux本体とinitramfsを置く。起動時にローダーがRAMへ展開して飛び移る形にした。

CPUが3つある点も面倒だ。SH2が2個あり、これにメガドライブ側の68000が加わる。しかも32XからはUARTを直接たたけない。そこで既存の32X向け開発キットのサンプルを広げ、文字を68000へ渡して出力させる仕組みを組んだ。

移植そのものは、細かい不具合の連続だった。SH2向けのクロスコンパイラを作ると、カーネルの一部でコンパイラが落ちた。起動が途中で止まる症状も出た。原因は、ビットシフトを担う関数が、触ってはいけないレジスタを壊していたことだった。ログ出力の呼び出しがスタックを壊して戻ってこない点から突き止めた。32XのSH2に存在しない命令が使われていた箇所も塞いだ。時計の校正で止まったときは、SH2内蔵のタイマー向けにドライバーを書いた。

面白いのはここからだ。同氏はSH2を2個とも使うSMPに手を出した。ところが32XのSH2には、CPU同士の排他制御に使うハードウェアの仕組みがない。キャッシュの一貫性を保つ仕組みもない。そこでsparc32のコードを参考に、Petersonのアルゴリズムをソフトウェアだけで実装した。CPU間の割り込みは68000に配らせ、事実上のバス調停役に仕立てた。共有する変数はキャッシュを使わない領域に置き、古い値を読まないようにした。どちらのCPUかを見分ける手段もないため、使い道のない除算器のレジスタに識別番号を書き込み、CPU番号として読ませた。

結果、Linuxは2つのCPUを認識して起動した。性能について同氏は、ひどいものだしバスの取り合いも激しいが、それでも動くのだから自分は満足だと書く。メモリ不足も頻発したため、カーネルとBusyboxを削って収めた。カーネルツリーと設定ファイル、起動スクリプトは公開している。

関連情報

fabsceneの更新情報はXで配信中です

この記事の感想・意見をSNSで共有しよう
  • URLをコピーしました!

最新記事

YouTube / PodCast

【PR】読んで役立つ注目記事

目次