次のページ 前のページ 目次へ

2. Milo って何?

Intel ベースの PC システムでは、 BIOS のファームウェアがシステムをセットアップし、 DOS ファイルシステムのブートブロックから実行イメージを読み込みます。 これは Milo が Alpha ベースのシステムで行っていることとそれほど変わりません。 しかし、 Milo と BIOS ファームウェアには、いくつかの興味深い相異点があります。 その一つは、 標準的な Linux のデバイスドライバが手を加えずに組み込まれているということです。 また、自分自身の読み込みを BIOS ファームウェアに頼っている LILO とは違って、 Milo はそれ自身がファームウェアです。Milo の主な機能は次のようなものです:

  1. PALcode
  2. メモリセットアップコード(ページテーブルを作り、仮想アドレッシングを有効にする)
  3. ビデオコード(BIOS エミュレーションコードと TGA(21030))
  4. Linux カーネルコード(これには、割り込み処理などの実際の Linuxカーネルコードと擬似カーネルコードが含まれます)
  5. Linux ブロックデバイスドライバ(フロッピードライバなど)
  6. ファイルシステムサポート(ext2・MS-DOS・ISO9660)
  7. ユーザインターフェースコード(MILO)
  8. カーネルインターフェースコード(Linux 用のメモリマップと HWRPB のセットアップ)
  9. 環境変数を制御する NVRAM コード

以下にこれらの機能の詳細を述べます。

PALcode とは、 チップを特定のオペレーティングシステムに合わせる 単純なソフトウェアレイヤと考えることができます。 PALcode は PALmode という特殊なモードで動きます。 このモードには制限がありますが、 標準の Alpha 命令セットと 5 つの拡張命令のみで動作します。 このモードを使うことによって、Windows NT、Open VMS、 Digital Unix、 そしてもちろん Linux といった様々なオペレーティングシステムを Alpha チップ上で実行させることが可能になります。 Milo の使う (すなわち Linux の使う) PALcode は、 Milo の他の部分と同様にフリーウェアです。 この PALcode は Digital 社の評価用ボードの Digital Unix PALcode の例を元にしています…。 Alpha チップと種々の Alpha ベースのシステムにある I/O アドレスのマッピングや割り込み処理の違いによって (21066 ベースのシステムは 21064+2107x ベースのシステムでは I/O マップが違います)、 PALcode が変わってきます。

Milo が正しく動作するためには、 メモリのどの部分が利用可能かわからねばなりませんし、 Linux の実行開始位置も知っておかねばなりません。 また、 Linux のデバイスドライバ用に、一時的にメモリを割り当てる必要もあります。 Milo のコードは、 常に確保しておくページや一時的に確保するページのエントリを管理します。 Milo は起動直後に自分自身を物理メモリの適切な場所に展開します。 次に自分を圧縮しておけるだけのメモリと、 (カーネルが必要とする) PALcode といくらかのデータ領域を確保し、 Linux カーネルに制御を渡します。 これによって、Linux 自身にメモリのほとんどを残しておきます。

メモリコードの最後では、 Linux が必要とするデータ構造が仮想メモリの 適切な位置にくるように仮想アドレッシングを設定します。

Milo にはシステムのビデオデバイスを初期化し利用するビデオコードが 含まれています。ビデオコードは、まず VGA を使おうとし、 見付からなかったら TGA (21030) ビデオデバイスを使おうとします。 それでも失敗すると、グラフィックデバイスはないものと見なします。 標準のコンパイル済み BIOS エミュレーションコードには Digital 社の BIOS エミュレーションコードが含まれています。 このエミュレーションコードを使えば、全てとはいいきれませんが、 ほとんどの標準的なグラフィックデバイスを使うことができます。

Linux のデバイスドライバはカーネルに埋め込まれていますので、 サービスの一部はカーネルにに任せてしまいます。 例えば割り込みのハンドルなどは、 カーネルの擬似ルーチンだけが入っています。

Milo の最も強力な点は、選択されていない [訳注:カーネルに入っていない] Linux デバイスドライバを内蔵できるところです。 これによって Linux の全てのデバイスドライバに対応できる可能性が出てきます。 Milo には、Linux カーネル内の多くのブロックデバイスに対応する ブロックデバイス(例えば ll_rw_blc())が組み込まれています。

Milo は、ブートブロックや他の特殊な場所 [訳注:SRM など]からではなく、 実際のファイルシステム、すなわち MSDOS、EXT2、ISO9660 ファイルシステムから Linux のカーネルを読み込みます。 gzip で圧縮されたファイルも読み込めますので、 特にフロッピーから読み込む場合にはお薦めです。 Milo はファイル末尾が .gz であるファイルを 圧縮ファイルだと認識します。

Milo は単純なキーボードドライバとビデオドライバを内蔵しており、 それらを使って簡単なユーザインターフェースを実現しています。 このインターフェースによって、設定済みのファイルシステムのリストを取ったり、 Linux をフラッシュメモリから起動したり、 ユーティリティをアップデートしたり、 システムの起動を制御する環境変数を設定したりできます。 LILO のように、カーネルに引数を与えることもできます。

Milo はシステムの種類・塔載メモリの量・フリーメモリの量を Linux カーネルに渡します。 これは HWRPB (HardWare Restart Paramater Block) というデータ構造体と メモリクラスタの記述を使って実現されています。 これらは、 Linux カーネルに制御が移る直前に、 仮想メモリの適切な場所に配置されます。


次のページ 前のページ 目次へ