7月6日、cakehonoluluが「Linux on the Atari Jaguar. No, really.」と題した記事を公開した。1993年発売の家庭用ゲーム機「Atari Jaguar」上でLinuxカーネルを動作させるまでの全過程を記録したものだ。
動機は「because we can(_ish_)」、成果はBogoMIPS 1.04——極めて遅い。しかし動いた。RAM 2MB・MMUなし・クロスコンパイラのバグ・例外ベクタの空振りと、障害だらけの移植記録である。この記事はHacker News上でも反響を呼び、「なぜそんなことを?」「いや、どうやって?」という2つの問いが入り混じるスレッドが立った。答えは記事そのものにある。
Atari Jaguarとは何者か
Atari Jaguarは1993年11月に北米で発売された家庭用ゲーム機だ。「64ビットの純粋なパワー」を謳い物議を醸したが——実態はメインCPUが16ビットデータバスの68000、カスタムチップが64ビット演算対応という混成構成で、「64ビット」は誇大広告気味だった——商業的には惨敗に終わった。CDアドオン「Jaguar CD」を投入してもSony PlayStationやSega Saturnには歯が立たず、販売台数は約25万台にとどまり、1996年にAtariはゲーム機市場から撤退した。
メインCPUはMotorola 68000(CISC、内部32ビット/データバス16ビット、24ビットアドレスバスで最大16MBのアドレス空間)。カスタムIC「Tom」(GPU兼ブリッタ)と「Jerry」(DSP・サウンド担当)がこれを補佐する構成だ。Linuxはいまもなおmotorola 68000ファミリー向けのアーキテクチャコードをarch/m68k/以下に保持しており、CPUそのものはLinuxが動く対象として筋が悪くない。
最初の壁:MMUがない
LinuxはMMU(メモリ管理ユニット、仮想アドレスと物理アドレスの変換を担うハードウェア)なしでは動かない——というのが一般的な認識だ。Jaguarにはもちろんそんなものはない。
ここで登場するのが**uClinuxだ。MMUを持たない組み込みプロセッサ向けのLinuxで、現在はカーネル本体に統合されている。m68k向けのサポートも含まれており、仮想アドレス変換を行わないフラットメモリモデル**で動作する。menuconfigでMMUなし・フラットメモリモデルを指定してコンパイルすれば、理屈の上では動くはずだった。
メモリ2MBをどう乗り越えるか
Jaguarのメモリ構成は以下の通りだ。
- RAM:2MB(アドレス
0x000000) - ROM(カートリッジ):最大6MB(
0x800000)
2MBのRAMにLinuxカーネルをまるごとロードしようとすると即座にOOM(Out of Memory)になる。
解決策として採用したのがXIP(eXecute-In-Place)だ。カーネルの読み取り専用セクション(.rodata、.text)はROM(カートリッジ)上に置き、書き換えが必要な動的セクション(.data、.bss)のみRAMに配置する。Linuxはリロケーションを自動で処理してくれる。
起動に必要なドライバを自作する
Linuxのブリングアップ(初期移植)に最低限必要なものは2つだ。シリアル出力(カーネルメッセージの確認)とタイマー割り込み(スケジューラのキャリブレーション)。
シリアルコンソールはJerryのTXD/RXDピンをビットバン(ソフトウェアで直接ピンを叩く手法)して実装した。タイマーはJerryが持つ2つのハードウェアタイマーを流用し、68000への割り込みソースとして設定した。
コンパイラのバグに足を引っ張られる
設定は正しい、アドレスも正しい——なのに何も出力されない。
原因はUbuntuリポジトリのm68k-linux-クロスコンパイラだった。-m68000を指定してもアンアラインドメモリアクセス(4バイト境界に揃っていないメモリアクセス)を生成してしまう。ベースの68000はこれをハードウェアで処理しないため、即クラッシュする。ソースからm68k-elf-向けに専用ビルドしたコンパイラに切り替えて解決した。
さらに別の問題もあった。ROMが0x0ではなく0x800000にマップされているため、68000が起動時に例外ベクタテーブル(VBR)を0x0から読もうとして空振りする。これはJaguar固有のLinuxコードでベクタをmemcpyでRAMの先頭にコピーすることで対処した。GDBについてもUbuntuのgdb-multiarchではMAMEのgdbstubと正常に動作せず、m68k向けのソースビルドが必要だった。
ついに起動ログが流れる
苦労の末に得られた出力がこれだ。
Linux version 7.2.0-rc1+ (cakehonolulu@jaguar) (m68k-elf-gcc (GCC) 16.1.0, GNU ld (GNU Binutils) 2.46.1) #38 Sun Jul 5 11:56:37 CEST 2026
printk: legacy bootconsole [early_jerry0] enabled
uClinux with CPU MC68000
Flat model support (C) 1998,1999 Kenneth Albanowski, D. Jeff Dionne
...
Calibrating delay loop... 1.04 BogoMIPS (lpj=5248)
**BogoMIPS**はLinuxカーネルが起動時にCPUの大まかな速度を測る非公式な指標だ。1.04は極めて遅い数値だが、カーネルが起動し、スケジューラが動き、コンソールに文字が流れたことを意味する。
ユーザーランドの構築
カーネルが動いてもinitプロセスがなければ意味がない。ここにもMMUなし環境特有の制約がある。ELF形式は使えず、nommu環境ではFLATバイナリ形式が必要だ。
ツールチェインの構築には**buildrootを利用した。m68k nommu向けのパッチが2026年5月に取り込まれたばかりという好機も重なった。ユーザーランドのコマンド群にはnommuターゲットをサポートするbusybox**を採用した。
しかしbusybox --install(各コマンドへのシンボリックリンクを展開する処理)がOOMを引き起こすため、initスクリプトは最小限にとどめた。また、uClibcのメモリアロケーション戦略をデフォルトの高機能なアロケータからmalloc-simpleに変更している。デフォルトではメタデータだけでメモリを食い潰すためだ。完成したrootfsをcpioでパックしvmlinuxイメージに埋め込んで完成となった。
修正済みLinuxリポジトリはgithub.com/cakehonolulu/linux_jagで公開されており、ビルド手順も詳細に記載されている。
詳細はLinux on the Atari Jaguar. No, really.を参照していただきたい。