Atari Jaguar上のLinux: モダンなカーネルを64ビットコンソールハードウェアへ移植する
Atari Jaguar上のLinux: モダンなカーネルを64ビットコンソールハードウェアへ移植する
64ビットの強力なマシンとして販売された1993年のコンソール、Atari Jaguarは、現在モダンなLinuxカーネルをサポートしています。MMUを持たない動作のためにuClinuxを活用し、限られたRAMを管理するためにExecute-In-Place (XIP)を実装することで、システムは機能的なBusyboxシェルへと起動できます。
XIPとuClinuxによるメモリ制約の克服
Atari JaguarへのLinux移植における主な課題は、2メガバイトという深刻なRAMの制限です。カーネルを収めるために、このプロジェクトでは、メモリ管理ユニット (MMU) を持たないプロセッサ向けに設計されたLinuxのバリアントであるuClinuxを利用しています。これにより、システムは仮想メモリではなく、フラットメモリモデルを使用できます。
RAMの使用量をさらに最適化するために、カーネルはExecute-In-Place (XIP)を使用して2つのメモリ領域に分割されます:
- ROM (Cartridge):
.rodataや.textなどの読み取り専用セクションを格納します。 - RAM:
.dataや.bssなどの動的セクションを格納します。
LinuxカーネルにRAMとROMの境界を伝えることで、カーネルはリロケーションを自動的に処理し、起動プロセス中のOut-Of-Memory (OOM) クラッシュを防ぎます。
ハードウェアの立ち上げ: UART、タイマー、およびベクタ処理
カーネルの起動には、2つの基本的なコンポーネントが必要です:出力方法とシステムタイマーです。
Jerry ICによるシリアル出力
Jaguarの「Jerry」IC (DSP) には、TXDとRXDピンがあります。これらのピンをビットバンギングすることで小さなコンソールドライバを記述することにより、開発者は earlyprintk メッセージをキャプチャするためのUARTのようなシリアル出力を実装しました。これは起動シーケンスのデバッグに不可欠です。
システムタイマーとスケジューラ
Jerry ICは2つのタイマーも提供しています。そのうちの1つは、Programmable Interval Timer (PIT) として機能するように再利用され、Linuxカーネルがディレイループを校正し、スケジューラをセットアップし、システムティックを管理することを可能にします。これには、Motorola 68000 CPUのボード固有の初期化をオーバーライドする必要があります。
ベクタのリロケーション
ROMは 0x0 ではなく 0x80000 にマップされているため、Motorola 68000 CPUはリセット時に 0x0 にあるVector Base Register (VBR) へジャンプしようとします。システムがクラッシュするのを防ぐため、開発者は割り込みベクタをRAMのベースに memcpy しました。
ツールチェーンの課題とコンパイラの修正
標準的なクロスコンパイラは、ベースとなるMotorola 68000との不整合を起こすことがよくあります。このプロジェクトでは、2つの大きなツールチェーンの障害に直面しました:
- アラインメントされていないメモリ・アクセス: Ubuntuのリポジトリで利用可能な
m68k-linux-クロスコンパイラは、ベースの68000が処理できないアラインメントされていないメモリ・アクセスを生成するため、即座にクラッシュを引き起こします。これは、m68k-elf-をターゲットにした、ソースから特別にビルドされたコンパイラを使用することで解決されました。 - フラットバイナリ: システムにMMUがないため、標準的なELFファイルは使用できません。プロジェクトでは、
buildroot(具体的にはlinuxmdプロジェクトからの2026年5月のパッチ) を使用して、FLATバイナリを生成しました。
ユーザースペースとRootfsの実装
機能的なシェルを実現するために、プロジェクトでは vmlinux イメージに直接埋め込まれた cpio パックされたrootfsを使用しています。
Busyboxとメモリ最適化
Busyboxは、nommu ターゲットをサポートしているため、ユーザースペース環境として選択されました。しかし、Busyboxを使用しても、メモリは極めてタイトでした。init の実行中にOOMパニックが発生するのを防ぐため、以下の最適化が行われました:
- 簡略化されたInit:
--installコマンドのメモリオーバーヘッドを避けるため、initスクリプトは/bin/busybox shを呼び出す単純なシェバン(shebang)に削減されました。 - uClibc Malloc 戦略:
buildrootの menuconfig を通じて、uClibcライブラリの malloc 戦略をmalloc-simpleに変更しました。これにより、複雑なメモリ割り当て戦略に関連するメタデータが、残りのRAMを消費することを防ぎます。
ハードウェアへの展開
実機ハードウェアへの展開のため、vmlinux バイナリは、Jaguarカートリッジヘッダーに合わせて 0x80000 からの固定オフセットでコンパイルされる必要があります。これには、CONFIG_ROM_START、CONFIG_ROM_LENGTH、CONFIG_ROMVEC、および CONFIG_ROMSTART に8KBのオフセットを追加する必要があります。
さらに、実際のハードウェア上でカーネルが画面に直接テキストを出力できるように、「Tom」IC (GPU/blitter) 用のシンプルなコンソールドライバが実装されました。
コミュニティの洞察
愛好家たちの間での議論は、Motorola 68000アーキテクチャの歴史的重要性について強調しています。これは、オリジナルのMacintoshからSega Genesisまで、あらゆるものを動かしていたものです。ある貢献者は、ノート { "id": "contributor_1" } を、プリンタ、車、自動車、PDAに広く歴史的に展開されているため、68kサポートがLinuxソースツリーに残っているのだと指摘しました。
その他の技術的な提案は、コミュニティから以下のように寄せられています:
- RAM拡張: 追加のRAMを備えたカスタムカートリッジを製作して、8MBのアドレス空間を拡張する可能性。
- GPU/DSPの活用: JaguarのGPUとDSPをフル活用すれば、プロジェクトが「豪華なAtari ST」の体験を超えたものになるだろうという提案。