MBRSCAN

Master Boot Record SCAN - partition table analyzer
Copyright (C) 1995, 1999 and 2003 by Nobumichi Kozawa

MBRSCAN comes with ABSOLUTELY NO WARRANTY; This is free software, and you are welcome to redistribute it under certain conditions: See GPL.TXT for details.

English Document is also available. 最新情報は N.Kozawa Program Library でチェックして下さい。

1.Introduction

MBRSCAN は、MBR (Master Boot Record) と各パティションのブート・レコードのダンプ、パティション・テーブルの解析を行う DOS プログラムです。
元々は、ある OS の導入時にブート・レコードが壊れてしまうという問題に遭遇した時に MBR のみをダンプする為に作ったプログラムでした。 最初は DEBUG コマンドで MBR を読み込んで表示したのですが、 他人に頼む時に簡単に済むように小さなプログラムに仕立てたのが始まりです。 ついでに、各パティションのブート・レコードの表示とパティション・テーブルの解析をする様にしました。
ある程度の知識を必要としますが、パティションやブート関連の問題の解析を自分でしたい場合には役に立つツールです。 パティション・テーブルの構造を学習するのにも最適です。

Files

MBRS112.ZIPには以下のファイルが含まれています。

MBRSCAN.EXE実行プログラム
MBRSCAN.CPPソース・プログラム
MBRSCAN.Hソース・プログラム・ヘッダー
MBRSCAN.HTM日本語ドキュメント
MBRSCANE.HTM英語ドキュメント
GPL.TXTGNU GENERAL PUBLIC LICENSE

History

Author

Author
Nobumichi Kozawa
Mail Address

2.Usage

MBRSCAN.EXE は DOS モードのプログラムです。 PC-DOS でも DOS/V、Windows 98 や OS/2 の DOS 窓でも動きます。 ブート・ドライブに対して実行するのなら、 オプション無しで実行するだけで良いです。
現バージョンでは論理ディスクの数は 15 までしかサポートしていません。

Options

A:\>mbrscan /?
MBRSCAN V1.11 Copyright (C) 1995-2003 by Nobumichi Kozawa

MBRSCAN comes with ABSOLUTELY NO WARRANTY;
This is free software, and you are welcome to redistribute it
under certain conditions: See GPL.TXT for details.

Usage: MBRSCAN [-opt][drive]

       opt: sd = Suppress Dump
            st = Suppress Partition Table Report
            sm = Suppress Partition Map
            sf = Suppress Free Space Report
       drive: 0 = FD-A
              1 = FD-B
              80 = 1st HDD
              81 = 2nd HDD ...
              default = 80 (1st HDD)

MBRSCAN -? で簡単なヘルプが出ます。
opt は MBRSCAN の出力を部分毎に抑制するための物で、それぞれの意味は次の通りです。

sd
マスター・ブート・レコードおよび各パティションのブート・レコードのダンプ出力を抑制。
st
パティション・テーブルの詳細出力を抑制。
sm
パティション・マップの出力を抑制。
sf
フリースペースのレポートを抑制。
ドライプの指定は、int 13 BIOS コールで使用するものと同じです。 ディフォルトは 80 で、ブート・ドライブです。 これは FDISK で DISK 1 と表示されるものと同じです。

Output

MBRSCAN V1.11 Copyright (C) 1995-2003 by Nobumichi Kozawa
LBA mode

INT13 BIOS コールが LBA をモードをサポートしているかどうかを調べた結果をレポートします。 LBA がサポートされていない場合は Non-LBA mode と表示します。 LBA モードがサポートされている場合は、 以下の全ての INT13 BIOS コールは LBA モードで行われます。

DRV:80  CC=03E0h(992), HH=80h(128), SS=3Fh(63), BLKS=7A1000h(7999488)

INT13 BIOS コールで取得したジオメトリー情報です。 CC はシリンダーの数、HH はヘッドの数、SS はトラックあたりのセクター数を表します。 BLKS はディスク全体のセクターの総数で、Non-LBA の場合は CCHHSS から計算した物です。
Windows 9x の DOS 窓では何故か失敗する事が多いです。 また OS/2 の DOS 窓ではヘッドの数が間違っている事もあります。

1 - Master Boot Record (00000000h)
0000:  EB 69 4C 49 4C 4F 01 00-14 00 A3 00 00 00 00 00   [ iLILO          ]
0010:  62 9E FA 36 25 DA 80 14-01 26 DA 80 14 01 24 DA   [ b 6            ]
0020:  80 14 01 01 00 00 00 00-00 00 00 28 DA 80 14 01   [                ]
0030:  0B D7 80 52 01 0C D7 80-52 01 0D D7 80 52 01 0E   [   R   R   R    ]
0040:  D7 80 52 01 0F D7 80 52-01 10 D7 80 52 01 11 D7   [  R   R   R     ]
0050:  80 52 01 12 D7 80 52 01-00 00 00 00 00 00 00 00   [  R  R          ]
0060:  00 00 00 00 00 00 00 00-00 00 00 B8 C0 07 8E D8   [                ]
0070:  8C 06 66 00 89 36 64 00-89 1E 68 00 88 16 6A 00   [   f  6d   h j  ]
0080:  B8 00 9A 8E C0 B9 00 01-29 F6 29 FF FC F3 A5 EA   [                ]
0090:  94 00 00 9A FA 8E D8 8E-C0 BC 00 B0 B8 00 90 8E   [                ]
00A0:  D0 FB B0 0D E8 57 00 B0-0A E8 52 00 B0 4C E8 4D   [                ]
00B0:  00 BE 30 00 BB 00 10 FC-AD 89 C1 AD 89 C2 09 C8   [                ]
00C0:  74 20 46 E8 43 00 72 06-81 C3 00 02 EB EA 50 B0   [                ]
00D0:  20 E8 2A 00 58 88 E0 E8-12 00 31 C0 88 C2 CD 13   [                ]
00E0:  EB CF B0 49 E8 17 00 EA-00 00 00 9B 50 C0 E8 04   [                ]
00F0:  E8 01 00 58 24 0F 04 30-3C 3A 72 02 04 07 30 FF   [                ]
0100:  B4 0E CD 10 C3 5A 59 5B-C3 F6 C2 40 74 52 80 E2   [                ]
0110:  BF 53 51 52 B4 08 CD 13-72 EB 88 F3 5A 88 16 6D   [                ]
0120:  01 88 F2 30 F6 88 F7 58-51 86 CD D0 C5 D0 C5 80   [                ]
0130:  E5 03 89 0E 6B 01 59 83-E1 3F F7 F1 FE C2 88 16   [                ]
0140:  6E 01 31 D2 43 F7 F3 88-D6 8A 16 6D 01 3B 06 6B   [                ]
0150:  01 77 13 86 C4 D0 C8 D0-C8 0A 06 6E 01 89 C1 5B   [                ]
0160:  B8 01 02 CD 13 C3 5B 31-C0 F9 C3 00 00 00 00 00   [                ]
0170:  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   [                ]
0180:  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   [                ]
0190:  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   [                ]
01A0:  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   [                ]
01B0:  00 00 00 00 00 00 00 00-00 00 00 00 33 CC 00 00   [                ]
01C0:  01 C1 05 7F FF DF 80 BF-17 00 80 50 62 00 00 00   [                ]
01D0:  01 01 06 7F 3F C0 80 1F-00 00 00 A0 17 00 00 00   [                ]
01E0:  00 00 00 00 00 00 00 00-00 00 00 00 00 00 80 01   [                ]
01F0:  01 00 0A 7F 3F 00 3F 00-00 00 41 1F 00 00 55 AA   [                ]

MBR(Master Boot Record) のダンプです。 PC がブートする時に最初にディスクから読み込まれるレコードで、 ブートストラップ(最初に実行されるプログラム)と基本区画のパティション・テーブルがあります。 ディスクの一番最初のセクターで、アドレスは LBA モードでは 0、Non-LBA では CCC-HH-SS = 000-00-01 になります。

1 - Partion table entry = 0  << Extended >>
01BE:  00 00 01 C1 05 7F FF DF-80 BF 17 00 80 50 62 00   [                ]
       ST HH CS CC ID hh cs cc START-SEC   NUMBER-SEC
   +0  00        STATUS:                Inactive
   +1  00 01 C1  START CYL-HEAD-SECTOR: 0C1h-00h-01h (193-0-1)
   +4  05        PARTITION ID:          Extended
   +5  7F FF DF  END CYL-HEAD-SECTOR:   3DFh-7Fh-3Fh (991-127-63)
   +8  0017BF80  START SECTOR:          1556352
   +C  00625080  NUMBER OF SECTORS:     6443136

パティション・テーブルはオフセット 0x1BE から 16 バイトづつ、 4 っつ存在します。 1 - Partion Table Entry = 0 の最初の 1 は、基本区画を表します。 拡張区画では、この数字が 2 以降となります。 最後の数字は、何番目のパティション・テーブルかを表し 0 から 3 の間の数字になります。
引き続き、パティション・テーブルの詳細を表示しています。 内容については、後述します。
この例では、パティション・タイプは Extended すなわち拡張区画をになっています。 もし通常の区画 (FAT32 等) の場合は、 続いて、その区画のブート・レコード (区画の先頭セクター) がダンプされます。

[ PARTITION MAP - LBA ]

          ABSOLUTE          PART-TABLE
       START     END      START    BLOCKS
      ======== ========  ======== ========
1-0 : 0017BF80 007A0FFF  0017BF80 00625080  Extended
1-1 : 00001F80 0017BF7F  00001F80 0017A000  DOS 16-bit >=32M
1-3 : 0000003F 00001F7F  0000003F 00001F41  OS/2 Boot Manag
2-0 : 0017BFBF 002FFCFF  0000003F 00183D41  Linux native
2-1 : 002FFD00 0030F8FF  00183D80 0000FC00  Extended
3-0 : 002FFD3F 0030F8FF  0000003F 0000FBC1  Linux swap
3-1 : 0030F900 007A0FFF  00193980 00491700  Extended
4-0 : 0030F93F 007A0FFF  0000003F 004916C1  DOS 16-bit >=32M

パティションの範囲をサマリーしたリストです。 ABSOLUTE 以下に表示されているのは PARTITION-TABLE の START, BLOCKS の値から、 LBA モードの実アドレスに変換したものです。
Non-LBA モードの場合は、CCC-HH-SS でスタート、エンドを表したリストも同時に表示されます。

[ FREE SPACE ]

None.

空きエリアを LBA モード・アドレスで表示します。 ジオメトリーが取得出来ていない場合は、ディスクの最後の部分は計算出来ません。

3.MBRSCAN Messages

MBRS001 Error(int1308) Get Geometry failed. RC=%X %s
非 LBA モードでのジオメトリーの取得に失敗した。 エラー番号と詳細メッセージを表示。
MBRS002 Error(int1348) Get Geometry Failed. RC=%X %s
LBA モードでのジオメトリーの取得に失敗した。 エラー番号と詳細メッセージを表示。
MBRS003 Disk reset error! DRV=%X RC=%X %s
ディスク・リセットでエラーが発生した。 エラー番号と詳細メッセージを表示。 処理は続行します。
MBRS004 ERROR(lbafree): Overlap! FREE:%08lX-%08lX SECTS:%08lX-%08lX
フリーエリアの計算中にエラーが発生した。 パティションのエリアがオーバーラップしている。
MBRS005 Geometry was not saved. Free space after %08lX is unkown.
ジオメトリーが取得出来ていないので、定義されたパティションの最後のブロックより後ろにフリースペースがあるかどうか分からない。
MBRS006 Ooops! Second extension found in a partition table.
一つのパティション・テーブル中に二つ以上の拡張パティション定義が見つかった。
MBRS007 Disk read error ! %s
ディスクのリードエラー(INT13 AH=02 or 42)が発生した。 エラー番号に応じたメッセージを表示。
MBRS008 Geometry Unmatched. Assuming Head Counts = %02X.
INT13 で取得したジオメトリーと一番最初のパティション・テーブルから推測されるヘッドの数が一致しなかった。 パティション・テーブルから推測されるヘッドの数を使用する。
MBRS009 Geometry Unmatched. Assuming Number of Sector = %02X.
INT13 で取得したジオメトリーと一番最初のパティション・テーブルから推測されるセクターの数が一致しなかった。 パティション・テーブルから推測されるセクターの数を使用する。
MBS0010 Number of Blocks re-calculated. Blocks = %02lX(%ul)
MBRS008 もしくは MBRS009 の発生により総ブロック数を計算しなおした。
MBRS011 Geometry was not saved. Assuming HH = %02x, SS = %02X
ジオメトリーの取得に失敗したため、最初のパティション・テーブルからヘッドとセクターの数を推測した。
MBRS012 START HEAD is usually 0x00 or 0x01.
パティションは通常ヘッド 0 か 1 で始まると思われるが、 それ以外であった。
このメッセージが出ていても、使用できないエリアが存在する物の正常に稼動しているのを見た事はあります。 もし、このメッセージの出るケースを発見したら、作者までお知らせ下さい。
MBRS013 START SECT should be 0x01.
パティションはセクター番号 1 で始まるはずだが、それ以外であった。
MBRS014 END HEAD should be %02X.
パティションは通常、最大のヘッド番号(シリンダー・バウンダリー)で終了するはずだが、それ以外であった。
MBRS015 END SECT should be %02X.
パティションは通常、最大のセクター番号(シリンダー・バウンダリー)で終了するはずだが、それ以外であった。
MBRS016 START LBA and CCHHSS unmatch. Calculated Block Address = %08lX
START CYL-HEAD-SECTOR から計算したブロック・アドレスと START SECTOR から求められる実ブロック・アドレスが一致しなかった。 CYL-HEAD-SECTOR から計算した値を表示。
MBRS017 END LBA and CCHHSS unmatch. Calculated Block Address = %08lX
END CYL-HEAD-SECTOR から計算したブロック・アドレスと START SECTOR, NUMBER OF SECTORS から求められる実ブロック・アドレスが一致しなかった。 CYL-HEAD-SECTOR から計算した値を表示。

4.Introduction to Hard Disk Drive

Matser Boot Record とパティション・テーブルの解説に先立って HDD の構成と INT13 BIOS コールについて簡単に説明しておく必要があります。

Structure of HDD

HDD 上の特定のデータにアクセスするために使用する INT13 BIOS コールの基本仕様は HDD のハードウェア上の構成に由来します。 そこで、それを理解するために必要なハードウェアの基礎的な事柄について説明します。

Disk and Head

ハード・ディスクという、その名前からも想像できるように円盤上のメディアの上にデータを記録しています。 これをディスクと呼びます。 そのディスクの上を移動しデータを読み書きする部分はヘッドと呼ばれます。 データはディスク上に同心円を描いてビット単位で書かれています。 この同心円一つをトラックと呼びます。 また、複数ディスク面の同じ位置のトラックの集まりをシリンダーと言います。 ヘッドを移動するということは、特定のシリンダーをアドレスするということに他なりません。

Sector

話をトラックに戻します。 PC で使用されるディスクではトラック上に固定長のレコード(通常は 512 Byte)を複数書いています。 このレコード一つをセクターと呼びます。 セクターは、ディスク上に記されている基点をもとに何番目のセクターかでアドレスされます。

Addressing

以上の事柄をまとめると、ディスク上のあるセクターは、シリンダーとヘッド、セクターのアドレスにより特定する事が出来ます。

Geometry

プログラムは、そのハードディスクに幾つのシリンダー、ヘッド、セクターが存在するかを知らなければなりません。 INT13 には、そのためのサービスが用意されています。 得られた情報をジオメトリーと呼びます。

INT13 BIOS CALL

INT13 の詳細は専門書にゆずるとして、ここでは INT13 で使用されるアドレスに注目したいと思います。

Non LBA mode

   inr.h.ah = 0x02;           // Read sector
   inr.h.al = 0x01;           // # of sectors
   inr.h.ch = plist->cyll;              // CYL low
   inr.h.cl = plist->cylhsec;           // CYL high + SEC
   inr.h.dh = plist->head;              // HEAD
   seg.es = FP_SEG(buff);     // buffer
   inr.x.bx = FP_OFF(buff);
   inr.h.dl = plist->drv;           // Drive
   int86x(0x13, &inr, &outr, &seg);
これは mbrscan.cpp の一部を少し編集したものでディスク上のあるセクターを一つ読むためのルーチンです。 この中でディスク上のあるセクターを特定しているのは ch, cl, dh レジスターです。
 |<---  dh  ---->| |<---  cl   --->| |<---  ch   --->|
 |7.6.5.4.3.2.1.0| |7.6.5.4.3.2.1.0| |7.6.5.4.3.2.1.0|
 |      HEAD     | |CYL|   SECTOR  | |  CYLNDER LOW  |
                    HIGH
レジスター dh は、そのままヘッド・アドレスを表します。 シリンダー・アドレスは cl の上位 2 ビットと ch を接続した 10 ビットで表されます。 セクターは cl の下位 6 ビットがアドレスとして使われます。
ここで注意が必要なのは、シリンダーとヘッドのアドレスは 0 から始まるが、 セクター・アドレスは 1 が一番若いアドレスになるという事です。 つまり、ディスク上で最初のセクターは CCC-HH-SS = 000-00-01 という事になります。

実際のハードディスクの構造と、ここで紹介したアドレスが一致していたのは、実は初期のハードディスクに限られます。 ハードディスクの容量の増加と小型化にともなって、シリンダーとセクターのアドレス・ビットが不足し、もともと余裕のあったヘッドのアドレスを不足分に転用するようになりました。 (ディスク面が 256 もあるディスク装置など考えられません) したがって、このシリンダー、ヘッド、セクターによるアドレスは論理的な物であり、物理的なディスクの構造とは別物になっていると考えた方がよいでしょう。 もっとも、ここで説明する事柄を理解する上においては、物理上の構造を考慮する必要はありません。

LBA mode

ここで簡単な計算をしたいと思います。 前の説明の CCC-HH-SS でアドレス出来る最大のディスクの容量は幾らになるでしょう。 ディスクの容量は、シリンダー数 X ヘッド数 X セクター数 X セクター容量、で表すことができます。
よって、0x400 X 0x100 X 0x3F X 512 = 8,455,716,864 bytes という事になります(セクターは 1 から始まる事に注意)。 すなわち、この方法では約 8.46GB (1k=1024 で計算し 7.8GB と表示することもあります) のディスク装置しか扱うことができません。

最近では、個人で 10GB 以上のディスク装置を入手する事も可能になっています。 そこで考えられたのが LBA モードというもので、最初のセクターを 0 として全てのセクターを単一の通し番号でアクセスする、全く新しい方法が考案されました。 これを、拡張 INT13 (INT13 Extension) と呼びます。 LBA モードでは DAP (Disk Address Packet) と呼ばれるデーター構造を使います。 この DAP の中に用意されているアドレス・ビットは 64 bits あり、 セクターが 512 bytes の場合、実に 9.4 x 10 の 21 乗 bytes のディスクにアドレス可能です。 実際の所 mbrscan.cpp では、半分の 32 bits しか扱わないようにしています。 それでも 2TB のディスク装置に対応できますので当面は問題無いと思います。

対象ディスクが IDE の場合は、IDE インターフェース上の制限も考慮しなければなりません。 IDE インターフェースではセクターをアドレスするために、もともとシリンダーに 16 bits、ヘッドに 4 bits、セクターに 8 bits の合計 28 bits が用意されています。 この 28 bits 全てを LBA アドレスとして使用するとセクターの数は 268,435,456 セクターになります。 ただし ANSI の規定を読むと IDENTIFY DEVICE というコマンドで得られる 'Total number of user addressable sectors' の取り得る値が 1 から 268,435,455 ということになっています。 そこで、この数値を使って計算してみます。 512 bytes/sector だとすると 137,438,952,960 bytes すなわち 137GB (1k = 1024 だと 128GB) までのディスクに対応できます。

拡張 INT13 の詳細については Phoenix Technologies 社のサイトにある Enhanced Disk Drive Specification をご覧下さい。

IDE limitation

INT13 のスペックを中心にアドレス可能なディスク容量を考えてきましたが、 IDE のインターフェース・スペック上の制限も見ておきましょう。 IDE では、シリンダーを 16 bits, ヘッドを 4 bits, セクターを 8 bits でアドレスするようになっています。 従って、最大容量は先の公式に当てはめると 0x10000 X 0x10 X 0xFF X 512 = 136,902,082,560 bytes になります。
初期の INT13 BIOS では BIOS コールに使用された CCC-HH-SS の値がそのまま IDE インターフェースに渡されていました。 そのため、アドレス・ビットは、それぞれのスペックのうち小さいものに制限されていました。 これを表にまとめると次のようになります。

INT13 BIOSIDE InterfaceAccessable
CYLINDER10 bits16 bits10 bits
HEAD8 bits4 bits4 bits
SECTOR6 bits8 bits6 bits
CAPACITY8.46GB (7.875GB)137GB (127.5GB)528MB (504MB)
EIDE (Non LBA)-Non EIDE

このため、この時代の PC では 0x400 X 0x10 X 0x3F X 512 = 528,482,034 bytes (1k=1024 だと 504MB) までしかアクセスできませんでした。 古くから PC に関わっている方は、よくご存知の事と思いますが EIDE サポート BIOS の登場により CCC-HH-SS を相互に変換することにより、 すなわち余ったヘッド・アドレスの 4 bits をシリンダーもしくはセクターに振る事により INT13 BIOS の限界値までアクセスする事が出来るようになりました。

Big Drive (48 bit LBA)

この文章を書き始めた頃には LBA モードで 137GB のディスクを扱えればしばらくの間、 困ることは無いだろうと思っていました。 ところがついに我が家にも 160GB の HDD がやってきました。 これは IDE limitation の項で書いた 137GB の限界を超えてしまっています。 これは通称 Big Drive と呼ばれ 48 bits の LBA アドレスを使用してアクセスします。 物理的な IDE のインターフェースに変更を加えず LBA アドレスを2回に分割して送り出す方法で LBA アドレスが拡張されました。 これで 281,474,976,710,655 セクター (IDENTIRY DEVICE から得られる addressable sectors によると) のアドレスが可能になります。 512 bytes/sector で計算すると 144,115,188,075,855,360 bytes 、おおよそ 144PB (1k = 1024 だと 128PB) までの HDD 容量に対応します。 こんどこそ、長持ちしそうな規格ですがどうなんでしょう。

INT13 Extension は以前から LBA アドレスとして 64 bits のフィールドを持っていますので BIOS のインターフェースには変更はありません。 MBRSCAN も BIOS が 48bit LBA をサポートしていれば問題なく動かすことが出来るはずです。

5.Partition Table Structure

ここではパティション・テーブルについて考えてみます。
私は、今までにパティション・テーブルの詳細について、 まとまった情報を目にした事がありません。 従って、ここで述べる内容およぴ MBRSCAN での解析の内容についても、 憶測がかなり含まれる事をご了承ください。 また、良いドキュメントをご存知の方は一報下されば幸いです。

Master Boot Record

マスター・ブート・レコードは略して MBR と呼ばれる事が多いです。 ディスク上で一番小さなアドレスを持つセクターであり、 その名の通り PC がディスクからブートする時に読み込まれ実際に実行されるプログラムが入っています。 DEBUG コマンドで逆アセンブルしてみると良く分かりますが、たいていの場合最初は 0xEB, 相対ジャンプ命令から始まっています。 続いてプログラム名やディレクトリーやファイル・システムの情報、続いてプログラム本体が入っています。
このセクターにはパティション・テーブルも含まれています。 パティション・テーブルはオフセットの 0x01BE から 16 bytes づつ 4 エントリー存在します。
最後にはシグネチャーの 0x55AA が書かれています。

Partition Table Entry

パティション・テーブルには四つのエントリーがあり、 それぞれセクター内のオフセット 0x1BE, 0x1CE, 0x1DE, 0x1EE から始まっています。
一つのパティション・テーブルは次の要素から成っています。

OFFSETLENGTH
0x001STATUSブート可能かどうか
0x013START CCHHSSパティションの開始位置(INT13 形式)
0x041PARTITION IDパティションの種類
0x053END CCHHSSパティションの終了位置(INT13 形式)
0x084START SECTORパティションの開始セクター
0x0C4NUMBER OF SECTORパティションの大きさ

CCHHSS は Non-LBA モードの INT13 BIOS CALL で、レジスター DH, CL, CH に、そのままロード出来る形になっています。 LBA モードでしかアクセス出来ない範囲(8.46GB over)については、この値は意味を持ちません。
パティションの開始セクターは、基本区画においては、そのまま実アドレスになりますが、拡張区画では相対的なアドレスになるので注意が必要です。

Primary Partition

MBR にある四つのパティション・テーブルで示されるパティションを特に基本区画と言います。

     +- MBR -+        +--------------------+
     |       |   +--->| Drive C:           | STATUS = Active
     |-------|   |    |                    |
01BE |ENTRY 0|---+    +--------------------+
     |-------|        | Another Drive C:   | STATUS = Inactive
01CE |ENTRY 1|------->|                    |
     |-------|        |                    |
01DE |ENTRY 2|->Empty |                    |
     |-------|        |                    |
01EE |ENTRY 3|->Empty |                    |
     |-------|        |                    | 
     |   55AA|        |                    |
     +-------+        |                    |
                      +--------------------+

Extended Partition

拡張区画は四つの基本区画では足りないときに基本区画内に拡張区画を示すエントリーを作成し、そのエントリーで示される開始セクターの中に新たにパティション・テーブルを作成するものです。

     +- MBR -+        +--------------------+
     |       |   +--->| Drive C:           | STATUS = Active
     |-------|   |    |                    |
01BE |ENTRY 0|---+    +--------------------+
     |-------|     +->| Another Drive C:   | STATUS = Inactive
01CE |ENTRY 1|-----+  |                    |
     |-------|        +--------------------+
01DE |ENTRY 2|------->| Extended Partition |
     |-------|        |                    |
01EE |ENTRY 3|->Empty |                    |
     |-------|        |                    |
     |   55AA|        |                    |
     +-------+        |                    |
                      +--------------------+
MBR で示される拡張区画は、後に続く論理ディスクのすぺてのエリアを包含します。

Logical Disk

論理ディスクは、全て MBR で示される拡張区画の範囲内に存在します。 一つのパティション・テーブルと一つの論理ディスクが必ずペアで作成されます。 最初のパティション・テーブルは、拡張区画の最初のセクターになります。 パティション・テーブルの最初のエントリーが論理ディスクを指定し、 続いて論理ディスクが存在する場合は、次のエントリーが続くパティション・テーブルと論理ディスクのエリアを指定します(パティション ID は拡張区画と同じ物が使われます)。 残りのエントリーは空になります。

 +--- EXTENDED PARTITION --------------------------------+
 |  _____+--------------+     --- +--------------+_____  |
 | |     |--------------|___   A  |--------------|     | |
 | |     |--------------|   |  |  |--------------|     | |
 | |     |--------------|   +->|  |--------------|     | |
 | | --- +--------------+      |  +--------------+ --- | |
 | |  A  | Drive D:     |      |  | Drive E:     |  A  | |
 | +->|  |              |      |  |              |  |<-+ |
 |    |  |              |      |  |              |  |    |
 |    V  |              |      V  |              |  V    |
 |   --- +--------------+     --- +--------------+ ---   |
 +-------------------------------------------------------+

Relative Address in the Partition Table

拡張区画内のパティション・テーブル・エントリーの開始セクター・アドレスは相対アドレスになっています。

BASE ADDRESS
ExtendedMBR の Extended の Start Address
Logical Disk一つ前の Extended の Absolute Start Address

ややこしいのは、論理ディスクと拡張区画(拡張区画内の拡張区画 ID)で、 元となるアドレスが異なる事です。 拡張区画 ID を持ったパティションの開始アドレスは MBR の拡張区画の開始アドレスを常にベース・アドレスとして使用します。 論理ディスクは、一つ上のレベルの拡張区画の実開始アドレスをペース・アドレスとします。
論理ディスクの実開始アドレス = MBR の拡張区画の開始アドレス + 一つ上の拡張区画の開始アドレス
実際のレポートを、じっくり見てもらう方が理解しやすいでしょう。

6.References


Nobumichi Kozawa