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

4. ディスクアクセス

ディスクに対して何かを読み書きするためには、 例えばセクタやブロックの番号を与えるなどの方法で、 ディスク上の位置を指定する必要があります。 ディスクが SCSI ディスクの場合は このセクタ番号は直接 SCSI コマンドにすることができ、 ディスクはそれを理解します。 ディスクが IDE ディスク で LBA を使用している場合は SCSI の場合とまさに同じ方法です。 しかしディスクが古く、RLL や MFM や、LBA 時代以前の IDE だったりする場合は、 ディスク上の希望の位置を指定するために、 ディスクのハードウェアは(シリンダ、ヘッド、セクタの)三つの値を要求します。

リニアナンバリングとこの三次元表記の対応は次のようになっています: C シリンダ H ヘッド S セクタ毎トラックを持つディスクにとって、 三次元または CHS 表記による位置 (c,h,s) は、 リニアまたは LBA 表記による位置 c*H*S + h*S + (s-1) と同じです。 (マイナス 1 する理由は、 この三次元表記では伝統的に 0 ではなく 1 からセクタを数え始めるからです)

それゆえ、とても古い非 SCSI ディスクにアクセスするためには、 そのジオメトリ、つまり C,H,S という値を知っている必要があります。

4.1 BIOS によるディスクアクセスと 1024 シリンダ制限

Linux は BIOS を使っていませんが、いくつかの他のシステムは使っています。 LBA 時代以前の BIOS は、入力として (c,h,s) を要求する INT13 というディスク I/O ルーチンを提供していました。 (より正確にいうと、AH (レジスタ)で実行するファンクションを、 CH でシリンダ数の下位 8ビットを、 CL の 7-6 ビットでシリンダ数の上位 2ビットを、5-0ビットでセクタ数を、 DH でヘッド数を、 そして DL でドライブナンバー(80h か 81h)を指定します。 これはパーティションテーブルの設計の章で説明しています。)

かくして、10 ビットのシリンダ数、8 ビットのヘッド数、 そして 6 ビットのトラックセクタ数(1-63 の値をとる)からなる 3 バイトに CHS はエンコードされます。 つまりシリンダ数は 0 から 1023 の値をとることができ、 1024 シリンダより上は BIOS では表現できないということになります。

DOS や Windows (訳注: Windows95 以前の Windows 3.1 等)といったソフトウェアは、 LBA をサポートした IDE ディスクが導入された時にも変更されませんでしたので、 ディスクジオメトリを必要とし続けました。 それは、(LBA を使った) 実際のディスク I/O の際には(ジオメトリは) もはや必要でないにも関わらず、 BIOS を通じてのみディスク I/O を行っていたからです。 これはさらに、今時のディスクを使っていても、 BIOS と会話するような場合や他の OS が必要とする場合には、 Linux もジオメトリを必要とすることを意味します。

この状態は 4年くらい前まで続いていて、 INT13 ファンクションで扱えないサイズのディスク (つまり (c,h,s) のための 10+8+6=24ビットでは 8.5GB 以上を扱えない) が市場に登場し、新しい BIOS インターフェースがデザインされました。 それは拡張 INT13 ファンクションと呼ばれ、 絶対ブロック数で始まる 8バイトを含む 16バイトのディスクアドレスパケットを DS:SI が指すというものです。

Microsoft の世界がこれらの拡張 INT13 ファンクションに移行するのは 非常に遅いです (訳注: Windows95 以降では対応しています)。 おそらく「ディスクジオメトリ」というコンセプトはあと数年は必要でしょう。

4.2 BIOS と IDE の「壁」(上限)の歴史

ATA 仕様書 (IDE ディスク用) - 137 GB まで

65536 シリンダ (0-65535 の範囲)、16 ヘッド (0-15 の範囲)、 255 セクタ毎トラック (1-255 の範囲) まで扱えます。 よって最大で 267386880 セクタの容量があり(512 バイト単位で)、 136902082560 バイト (137 GB) になります。 これは(西暦1999年の時点では)まだ問題とはなっていませんが、 あと数年もしたら問題になるかもしれません。

BIOS Int 13 - 8.5 GB まで

1024 シリンダ (0-1023 の範囲), 256 ヘッド (0-255 の範囲), 63 セクタ毎トラック (1-63 の範囲) まで扱えます。 よって最大で 8455716864 バイト (8.5 GB) になります。 これは今日では深刻な制限で、 DOS では今日の大容量ディスクが使えないことを意味しています。

528 MB の壁

BIOS Int 13 コールと IDE ディスク I/O の両方に同じ c,h,s の値を使った場合、 両方の制限が組み合わされ、 1024 シリンダ・16 ヘッド・63 セクタ毎トラックまでしか使用できず、 最大容量は 528482304 バイト (528MB) となります。 これが DOS と古い BIOS の組み合わせによる悪名高い 504MiB の壁です。 これは 1993年ごろに問題となり、人々はすべての種類のぺてんに訴えました。 すなわちハードウェア(LBA)、ファームウェア(BIOSによる変換)、 そしてソフトウェア(ディスクマネージャ)です。 「変換」の概念は 1994年にでっちあげられました: BIOS は、ドライブと会話する時のジオメトリと、それとは異なる、偽の、 DOS と会話する時のジオメトリを使い、そしてその 2つの間で変換を行います。

2.1GB の壁 (1996年 4月)

いくつかの古い BIOS では、シリンダ数を格納するための CMOS RAM 内の フィールドを 12 ビット分しか確保していません。 そのため、この数字は最大でも 4095 以下となり、 たった 4095*16*63*512=2113413120 バイトしかアクセスできなくなります。 大容量ディスクを接続した時に、ブート時にハングしたりするという影響が出ます。 この制限によって、 かえって 4092/16/63 というジオメトリを持つディスクが一般的になりました。 そして今日でも、多くのディスクドライブが 4092/16/63 に見せかけるための ジャンパを持っています。 over2gb.htm も参照してください。 その他の BIOS はハングはしませんが、2.5 GB の代わりに 429 MB といったように 非常に小容量なディスクとして検出してしまいます。 (訳注: つまりこの例では、上記の 2113413120 で割った剰余が ディスクの総容量として検出されているわけです)

3.2 GB の壁

これは Phoenix BIOS ファームウェアの 4.03 と 4.04 のバグで、 3277 MB を越える容量のドライブを繋いで CMOS セットアップを行うと システムがロックしてしまいます。 over3gb.htm を参照してください。

4.2 GB の壁 (1997年 2月)

単純な BIOS 変換 (ECHS=拡張(Extended)CHS、 しばしば `Large disk support' やあるいは単に `Large' と呼ばれます)は、 ヘッド数を 2倍しシリンダ数を半分にするという動作を、 DOS から見えるシリンダ数が 1024 以下になるまで繰り返します。 現在 DOS と Windows 95 は 256 ヘッダを扱えませんし、 一般的にディスクは 16 ヘッドであると答えるので、 これはつまりこの単純なメカニズムが 8192*16*63*512=4227858432 バイト(偽のジオメトリは 1024 シリンダ・128 ヘッド・63 セクタ/トラック) までしか動作しないことを意味します。 ECHS はセクタ毎トラックの数は変更しないことに注意してください。 そしてこれが 63 ではない場合は制限はもっときつくなります。 over4gb.htm を参照してください。

7.9 GB の壁

最初にヘッド数を 15 に調整することで上記のような問題 (ECHS を復習してください)を避けることのできる少し賢い BIOS は、 それによって 240 ヘッドまでの偽のジオメトリを得ることができるので、 1024*240*63*512=7927234560 バイトまで有効となります。

8.4 GB の壁

最後に、BIOS が可能な限りの変換に成功し、 255 ヘッドと 63 セクタ毎トラックを使うと (`assisted LBA' あるいは単に `LBA' と呼ばれる)、 1024*255*63*512=8422686720 バイトまで到達できます。 8.5GB 制限のちょっと手前ですが、 これは 256 ヘッダのジオメトリを避けなければならないからです。 (この変換はまず、ディスク容量が 1024*H*63*512 に収まるようにヘッド数 H を 16, 32, 64,128, 255 から選び、 次に総容量を (H*63*512) で割ってシリンダ数 C を計算します。)

33.8 GB の壁 (1999年 8月)

次のハードルは 33.8GB を越えるサイズで訪れました。 この問題は、デフォルトの 16 ヘッド 63 セクタ毎トラックでは、 シリンダ数が short int に納めることができない 65535 より大きい数になってしまうことです。 今日では、ほとんどの BIOS がそのようなディスクを扱えないでしょう。 (例えば正常に動作する新しいフラッシュ(ROM)のイメージを得るには Asus upgrades を参照してください) 2.2.14 / 2.3.21 より古い Linux カーネルではパッチが必要です。 後述の 34 GB 超のディスクにおける IDE の問題 を参照してください。

このトピックについてのその他の議論については、 Breaking the Barriers を参照してください。 さらに詳細については、 IDE Hard Drive Capacity Barriers を参照してください。

8.4 GB を越えるハードディスクは、 自分のジオメトリを 16383/16/63 と答えると思われます。 これは要するに「ジオメトリ」というものが時代遅れであることを意味し、 ディスクの総容量はもはやジオメトリからは計算できません。


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