OSのブートを行う場合、CD-ROMやFDDから行う事もありますが、HDDからのブートさせるのが一般的では無いかと思います。これからブートシーケンスを解析するに当ってはHDDからのブートに限定して見ていく事にします。その際に、後の解析でも役に立つと思われるHDDの仕組みや背景技術をまとめておきます。
OSのブートを行う場合、CD-ROMやFDDから行う事もありますが、HDDからのブートさせるのが一般的では無いかと思います。これからブートシーケンスを解析するに当ってはHDDからのブートに限定して見ていく事にします。その際に、後の解析でも役に立つと思われるHDDの仕組みや背景技術をまとめておきます。
HDDは一般的に下記のような構造となります。
とりあえず、ブートを解析する場合に必要な部分は以下のものでしょう。
HDDの記録単位には下記のものがあります。
プログラムがHDD上で読書きを行うためには、磁気ヘッドを読書きしたい位置に移動させる必要があります。このディスク上の位置を指定するアドレッシング方法として、CHS方式とLBA方式があります。
CHS方式はHDDの記録単位であるシリンダ(Cylinder:10bit)・ヘッド(Head:8bit)・セクター(Sector:6bit)を使い、3次元アドレスによるアクセスを行います。古いディスクコントローラであるIDE(Intelligent Drive Electronics)ではCHS方式でしたが、以下の制限がありました。
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の内容を部分的に先取りしたようなものになっています。
PC/ATの規格では、2次記憶装置の読書きを行うための最下層インターフェースとしてソフトウェア割り込みINT 13HをBIOSが提供しています。MBRのようなプログラムはこのINT 13Hを使用してディスクの内容の読込みを行っています。
INT 13HはCPUのレジスタに、いつかのパラメータをセットしてソフトウェア割り込みを発行させることにより、HDDのアクセスを行います。セットするパラメータは表のようになります。
入力 | |
---|---|
レジスタ | 内容 |
AH | 02h(読込み)、03h(書込み) |
AL | セクタ数 |
CH | トラック(シリンダ)番号の下位 8bit 分 |
CL | b5-b0: セクタ番号 b7-b6: トラック(シリンダ)番号の上位 2bit 分 |
DH | ヘッド番号 |
DL | ドライブ番号 |
ES:(E)BX | 読込み/書込み先のアドレス |
出力 | |
---|---|
レジスタ | 内容 |
CF | 0 (成功時) 1 (失敗時) |
AH | ステータスコード |
1回のINT 13H発行により、Block Access deviceの最小単位(512Byte)が読書き出来ます。もっと長いデータを読書きする場合は、INT 13Hを何度も発行する必要があります。
パラメータとしてどのディスクをアクセスするかと言う値を、DLレジスタにセットします。PCは「起動ドライブの検索」をするとき、2次記憶装置に固有のIDを振るがこのIDをDLレジスタにセットします。
IDの採番は次のようになります。
また、読書きを行うためには、HDDの位置情報も必要です。これには、CHSアドレスと呼ばれる3つのパラメータ、シリンダー・ヘッド・セクターを使いアクセスするポイントを指定します。
INT 13HはCHSでの位置指定が前提でしたが、ATA規格に準拠した大容量のHDDが製造されるようになると問題が出てきました。CHSで指定できるパラメータは
の計24bitですが。単純に考えて、このビットで表現できる空間は224であるから、224 × 512byte = 約8.5GBの領域しかアクセスすることが出来ません。
そこで登場したのが拡張INT 13Hです。INT 13Hのインターフェースはレジスタだったのに対して、拡張INT 13HはDisk Address Packetと呼ばれる構造体のアドレスをレジスタで渡すことにより、より大きな値を指定出来るようになりました。
入力 | |
---|---|
レジスタ | 内容 |
AH | 42h(読込み)、43h(書込み) |
AL | 0 or 1(Disk verify off)、2(Disk verify on) |
DL | ドライブ番号 |
DS:SI | 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での書/読込み先のアドレス |
出力 | |
---|---|
レジスタ | 内容 |
AH |
carry clearの場合0 carry setの場合error code |
拡張INT 13Hではアドレッシングのサイズが64bitに拡張されて、アクセス範囲は264 × 512 = 9.4Z ( ZはZeta=1021 ) までに広がりました。
HDDにはいくつかの規格と2つのソフトウェア最下層インターフェースがあることを説明しましたが、これらの組合わせによっては、一定以上の領域がアクセスできない「壁」が発生するようになってしまいました。
この壁は、CHS modeのHDDをINT 13Hでアクセスした場合発生します。
ATA規格ではシリンダに16bit、ヘッドに4bit、セクタに8bitと、計28bitのアドレッシングであったので、216 × 24 × (28-1) × 512 = 137GBの領域にアクセス出来る事になっていました。一方、BIOSはシリンダに10bit、ヘッドに8bit、セクタに6bitとなり最大で8.5GBのアクセスが可能でです。
この2つの方式でアクセスを行うと、それぞれのビット数が異なるので小さい方にビットが制限されてしまいます。
結果的に、210 × 24 × (26-1) × 512 = 528MBに制限されることになります。
BIOS MenuのTranslation Methodが[ LBA ]に指定されていると、BIOSはCHS->LBAジオメトリ変換を行います。この場合、INT 13Hの上限である C:1024 × H:255 × S:63 × 512 = 8.4GB まで扱える事になります。
これ以上のHDDを扱う場合は、拡張INT 13Hを使用する必要があります。
拡張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の起動は出来ないと思われます。
48bit LBAの限界が144P(ペタ)Bとなる。しばらくは、この壁を超えることは無いと思います。