HDDの話

OSのブートを行う場合、CD-ROMやFDDから行う事もありますが、HDDからのブートさせるのが一般的では無いかと思います。これからブートシーケンスを解析するに当ってはHDDからのブートに限定して見ていく事にします。その際に、後の解析でも役に立つと思われるHDDの仕組みや背景技術をまとめておきます。

HDDの構造

HDDは一般的に下記のような構造となります。

HDDの構造
HDDの構造

とりあえず、ブートを解析する場合に必要な部分は以下のものでしょう。

プラッタ
データを記録する部分。HDDは複数のプラッタが"ハノイの塔"のように積み重なった形で構成されている。
磁気ヘッド
磁気データを読み書きする部分。プラッタは両面読書きできるので、1つのプラッタに対して裏表、2つの磁気ヘッドが存在することになる。
アクチュエータ
磁気ヘッドを任意のトラック上に移動するための装置。この装置で磁気ヘッドを読取り位置を左右に移動させる。

HDDの記録単位

HDDの記録単位には下記のものがあります。

トラック
磁気ヘッドを固定した状態で、ディスクを1周させた時に出来る円をトラックと呼ぶ。
シリンダ
磁気ヘッドは互いに固定されているため、そのトラックの位置はすべての磁気ヘッドで同じである。各プラッタのトラックをひとまとめにしてシリンダと呼ぶ。
セクタ
各トラックはセクターと呼ばれるのデータの最小単位で分割される。PCの場合1セクターは512bytesである。
HDDの記録単位
HDDの記録単位

ディスク上の位置情報

プログラムがHDD上で読書きを行うためには、磁気ヘッドを読書きしたい位置に移動させる必要があります。このディスク上の位置を指定するアドレッシング方法として、CHS方式LBA方式があります。

CHS(Cylinder/Head/Sector)方式

CHS方式はHDDの記録単位であるシリンダ(Cylinder:10bit)・ヘッド(Head:8bit)・セクター(Sector:6bit)を使い、3次元アドレスによるアクセスを行います。古いディスクコントローラであるIDE(Intelligent Drive Electronics)ではCHS方式でしたが、以下の制限がありました。

LBA(Logical Block Addressing)方式

IDEには、上記のような制限事項が存在していたので、これらの欠点を解消したATA規格が作成されました。(現在ではATA-8までの規格が存在し、シリアル伝送方式用のSATA規格などもある。)。 この規格では、HDDのアドレッシング方法として、先頭セクタから順番に番号を振り、その番号でディスク上の位置を表すというLBA方式が採用ました。(SCSI HDDは元々、LBA方式を採用しています)。

最近のHDDはATA準拠なので、LBA方式のアクセスが可能です。また、ATA準拠以前のものをIDEと呼びこれらはCHS方式でのアクセスとなります。現在でもATA規格のHDDを「IDE HDD」と呼びますが、正確には「ATA HDD」が正しい呼び名でしょう。

また、IDEからATAの規格に移る過渡期にE-IDE(Enhanced-IDE)が存在しましたが、これはATA-1の制定が遅れていたため、業界が独自に規格を作り上げたもので、内容的にはATA-2の内容を部分的に先取りしたようなものになっています。

INT 13H

PC/ATの規格では、2次記憶装置の読書きを行うための最下層インターフェースとしてソフトウェア割り込みINT 13HをBIOSが提供しています。MBRのようなプログラムはこのINT 13Hを使用してディスクの内容の読込みを行っています。

INT 13H

INT 13HはCPUのレジスタに、いつかのパラメータをセットしてソフトウェア割り込みを発行させることにより、HDDのアクセスを行います。セットするパラメータは表のようになります。

INT 13Hの入力パラメータ
入力
レジスタ 内容
AH 02h(読込み)、03h(書込み)
AL セクタ数
CH トラック(シリンダ)番号の下位 8bit 分
CL b5-b0: セクタ番号
b7-b6: トラック(シリンダ)番号の上位 2bit 分
DH ヘッド番号
DL ドライブ番号
ES:(E)BX 読込み/書込み先のアドレス
INT 13Hの出力パラメータ
出力
レジスタ 内容
CF 0 (成功時) 1 (失敗時)
AH ステータスコード

1回のINT 13H発行により、Block Access deviceの最小単位(512Byte)が読書き出来ます。もっと長いデータを読書きする場合は、INT 13Hを何度も発行する必要があります。

パラメータとしてどのディスクをアクセスするかと言う値を、DLレジスタにセットします。PCは「起動ドライブの検索」をするとき、2次記憶装置に固有のIDを振るがこのIDをDLレジスタにセットします。

IDの採番は次のようになります。

  1. FDDの場合は、0x00から始まり0x01,0x02....とナンバリングされます。
  2. HDDの場合は、0x80から始まり0x81,0x82...ナンバリングされます。

また、読書きを行うためには、HDDの位置情報も必要です。これには、CHSアドレスと呼ばれる3つのパラメータ、シリンダー・ヘッド・セクターを使いアクセスするポイントを指定します。

拡張INT 13H

INT 13HはCHSでの位置指定が前提でしたが、ATA規格に準拠した大容量のHDDが製造されるようになると問題が出てきました。CHSで指定できるパラメータは

  1. シリンダー:10bit
  2. ヘッド:8bit
  3. セクタ:6bit

の計24bitですが。単純に考えて、このビットで表現できる空間は224であるから、224 × 512byte = 約8.5GBの領域しかアクセスすることが出来ません。

そこで登場したのが拡張INT 13Hです。INT 13Hのインターフェースはレジスタだったのに対して、拡張INT 13HはDisk Address Packetと呼ばれる構造体のアドレスをレジスタで渡すことにより、より大きな値を指定出来るようになりました。

拡張INT 13Hの入力パラメータ
入力
レジスタ 内容
AH 42h(読込み)、43h(書込み)
AL 0 or 1(Disk verify off)、2(Disk verify on)
DL ドライブ番号
DS:SI Disk Address Packetのアドレス
Disk Address Packetのパラメータ
Disk Address Packet
offset 内容
00H このpacketのサイズ (10h or 18h)
01H reserved (0)
02H 読書きするブロック数(max 007Fh?)
04H 書/読込み先のアドレス
この値がFFFF:FFFFがセットされた場合、offset 10Hの値が使用される。
08H HDD上の開始ブロック
non-LBA HDDの場合は、次のような変換が必要
      LBA = (C1 * H0 + H1) * S0 + S1 - 1
	C1 = Selected Cylinder Number
	H0 = Number of Heads (Maximum Head Number + 1)
	H1 = Selected Head Number
	S0 = Maximum Sector Number
	S1 = Selected Sector Number
10H 64bit flat addressでの書/読込み先のアドレス
拡張INT 13Hの出力パラメータ
出力
レジスタ 内容
AH carry clearの場合0
carry setの場合error code

拡張INT 13Hではアドレッシングのサイズが64bitに拡張されて、アクセス範囲は264 × 512 = 9.4Z ( ZはZeta=1021 ) までに広がりました。

HDDの壁

HDDにはいくつかの規格と2つのソフトウェア最下層インターフェースがあることを説明しましたが、これらの組合わせによっては、一定以上の領域がアクセスできない「壁」が発生するようになってしまいました。

528MBの壁

この壁は、CHS modeのHDDをINT 13Hでアクセスした場合発生します。

ATA規格ではシリンダに16bit、ヘッドに4bit、セクタに8bitと、計28bitのアドレッシングであったので、216 × 24 × (28-1) × 512 = 137GBの領域にアクセス出来る事になっていました。一方、BIOSはシリンダに10bit、ヘッドに8bit、セクタに6bitとなり最大で8.5GBのアクセスが可能でです。

この2つの方式でアクセスを行うと、それぞれのビット数が異なるので小さい方にビットが制限されてしまいます。

528MBの壁
528MBの壁

結果的に、210 × 24 × (26-1) × 512 = 528MBに制限されることになります。

8.4GBの壁

BIOS MenuのTranslation Methodが[ LBA ]に指定されていると、BIOSはCHS->LBAジオメトリ変換を行います。この場合、INT 13Hの上限である C:1024 × H:255 × S:63 × 512 = 8.4GB まで扱える事になります。

これ以上のHDDを扱う場合は、拡張INT 13Hを使用する必要があります。

8.4GBの壁
8.4GBの壁

137GBの壁

拡張INT 13Hを使用した場合でも、現在のATA規格では28bit(137GB)が上限となっています。これはATA規格の変更をしない限りアクセス不可能で、現在Maxtorが提唱したBig Drive規格をATA 規格を策定する「The ANSI NCITS T13 TechnicalCommittee」に提案中で, 次世代 ATA規格であるATA/ATAPI-6での採用を目指している。Big Drive規格ではLBAのビットを28bitから48bitに拡張している。

拡張INT 13HではLABアドレスとして、64bitまで拡張されているのでBIOS側とのインターフェースには変更はない。ただし、MBRのパーティション開始位置(LAB)の情報が32bitなので、2TB以上の領域からOSの起動は出来ないと思われます。

144P(ペタ)Bの壁

48bit LBAの限界が144P(ペタ)Bとなる。しばらくは、この壁を超えることは無いと思います。

参考資料

Hard Disk Drives
Last modified: Wed Jan 23 16:14:29 2008 JST