1.2. バージョン 22 (ベータ)

Version 22 (beta) -- John Coffman <johninsd@san.rr.com>

このバージョンは拡張 BIOS コール(INT 0x13, AH=0x42)とパケットコールの インターフェースを使って、8.4Gb 以上のディスクからのブートを可能にするために 作られました。これらのコールは 1998 年以降のシステムにおいてや、EZ-DRIVE(tm) のような 拡張ソフトウェア BIOS を通じてサポートされます。

私が LILO にこれらの変更を施すにあたって、まず心がけたことは、従来のものは 何も変えないことです。それ故セクターの 32bit ダイレクトアドレスはファイル lilo.conf の新しいキーワード lba32 に よってサポートされます。このキーワードはキーワード linear と 相互に排他です。コマンドラインではこれらのオプションは、それぞれ新しい -L スイッチと、以前からの -l スイッチに よって呼び出されます。

Werner Almesberger に対しては、直接連絡を取ることなく、これらの変更、追加を 行なったことをお詫び致します。しかし最新の lilo.lsm ファイルに 書かれた彼の e-mail アドレスでは、彼とコンタクトを取れませんでした。 私は LILO のバージョンを飛び越えるつもりはありません。

ディスクのセクターアドレスはマップインストーラ(実行ファイル lilo)によって第 1, 第 2 両ステージのブートローダに以下の 5 バイト 構造体で与えられます。

     sector    [1..63] と、シリンダーの上位 2bit 分
     cylinder  [0..1023] このバイトは下位 8bit 分に割り当て
     device    [0..3]はフロッピー用に,[0x80..0x8F]は ハードディスク用
     head      [0..254] 最大値は 254 で、255 ではない
     count     [1...] 転送すべきセクター数

最初の 2 バイトは通常 CX レジスターにロードされ、次の 2 バイトは DX レジスター にロードされ、最後のバイトは AL レジスターにロードされます。これはオリジナルの IBM-BIOS の CHS アドレス機構のために使われる BIOS コールです。LILO はコール が 64kB DMA 境界を跨がないこと、及び count 値がディスクの 1 トラック当たりの セクター数を決して超えないことを検査します。

linear キーワードが指定された場合、24bit 長の 0 で始まる アドレス機構が採用され、下位 8bit は sector に、中間 8bit は cylinder に、そして上位 8bitは head に割り 当てられます。linear アドレスであることを示すため、フラグ が device バイトの bit 6(マスク 0x40)にセットされます。 count フィールドは 128 が最大値です。これより大きいと 64kB DMA 境界を跨ぐからです。トラック境界を跨がないかを検査するのは、ローダコード (第 2 ステージローダだけですが)の役割です。

lba32 アドレスの場合は、もっと状況は複雑になります。device バイトに bit 5 にフラグがセットされます。32bit アドレスは、 下位バイトから上位バイトまで、sector, cylinder, head, count の各フィールドに渡ります。 このフル 32bit アドレスが明示的に指定されたときはいつでも、転送すべき現実の セクターは 1 であるとされます。この事実は device バイトの bit 4(マスク 0x10)がセットされることで示します。マルチセクター転送を行なう場合 は、上位 8bit は明示的に指定せず、以前の転送と同じであると推定し、転送すべき セクターの count は 2 から 127 の範囲となり、device バイトの bit 4(マスク 0x10)はクリアされます。

第 1 ステージローダはシングルセクター転送しか使わず、そのため単純なディスク リードルーチンを使い、常に転送セクターは 1 であると見なし、device バイトに lba32 モードを見つけた時は常にフル 32bit アドレスであると見なします。しかし、第 2 ステージローダはマップ圧縮が利用され たとき(-c オプションが指定 されるか、compact グローバルオプションを指定)は、マルチセクター転送が可能となり、initrd やカーネルのイメージのロードにフル機能のリードルーチンを使い ます。

linearlba32 の両オプションはもし利用可能 なら、拡張 BIOS パケットコールを使います。そうでない場合、ディスクアドレスは int 0x13 AH=8 によって返されるディスクジオメトリを使って C:H:S アドレスに変換 されます。もしシリンダーが、例えば 1023 を越えて溢れた場合、エラーコード 9f を発行します。

BIOS コールは「Enhanced Disk Drive Specification, version 3.0, rev 0.8, dated March 12, 1998」に準拠して大容量ディスク起動を実装しています。この文書は Phoenix Technologies Ltd., の Web サイトにある以下の URL からオンラインで 入手できます−

http://www.phoenix.com/products/specs.html

既知の問題− チェーンローダ os2_d.b は、まだ OS2 4.0 を私の``D:'' ドライブの第 2 パーティションから起動できません。ブートマネージャは可能なので、私は 引き続きこの問題に取り組んでいます。