マスターブートレコード(MBR )は、 IBM PC互換システム以降で使用される固定ディスクやリムーバブルドライブなどのパーティション化されたコンピュータ大容量記憶装置の最初のブロックにあるブートセクタの一種です。MBRの概念は、1983年にPC DOS 2.0で初めて一般に紹介されました。
MBRには、ディスクのセクター(別名「ブロック」)がどのようにパーティションに分割されているかに関する情報が格納されており、各パーティションは概念的にファイルシステムを含んでいます。MBRには、インストールされたオペレーティングシステムのローダーとして機能する実行可能コードも含まれています。これは通常、ローダーの第2段階に制御を渡すか、各パーティションのボリュームブートレコード(VBR)と連携して実行されます。このMBRコードは通常、ブートローダーと呼ばれます。
MBR のパーティション テーブルの構成により、パーティション ディスクの最大アドレス指定可能なストレージ スペースは 2 TiB (2 32 × 512バイト)に制限されます。[ 1 ] 32 ビット演算または 4096 バイト セクタを使用してこの制限をわずかに引き上げるアプローチは、既存のブート ローダー、ほとんどの MBR 準拠のオペレーティングシステム、および関連するシステム ツールとの互換性を致命的に損ない、厳密に管理されたシステム 環境以外で使用すると深刻なデータ破損を引き起こす可能性があるため、公式にはサポートされていません。そのため、MBR ベースのパーティショニング スキームは、ほぼすべての新しいコンピュータでGUID パーティション テーブル(GPT) スキームに置き換えられています。GPT は、古いシステムとの限定的な下位互換性を提供するために、MBR と共存できます。
MBRは、フロッピーディスク、スーパーフロッピーディスク、またはそのような動作をするように構成されたその他のストレージデバイスなど、パーティション化されていないメディアには存在しません。また、PC以外のプラットフォームで使用されるドライブにも必ずしも存在するとは限りません。
パーティション メディア、ひいてはマスター ブート レコード (MBR) のサポートは、当時新製品だったIBM Personal Computer XTの 10 MBハードディスクをサポートするために、1983 年 3 月にIBM PC DOS 2.0 で導入されました。当時はまだFAT12ファイルシステムを使用していました。MBR のオリジナル バージョンは、1982 年 6 月に IBM の David Litton によって作成されました。パーティション テーブルは、最大 4 つのプライマリ パーティションをサポートしていました。DOS 3.0 で新しいファイルシステムとしてFAT16が導入されても、この点は変わりませんでした。拡張パーティション(他のパーティションを格納するコンテナとして使用される特別なプライマリ パーティション タイプ) のサポートは、DOS 3.2 で追加され、拡張パーティション内のネストされた論理ドライブは、DOS 3.30 で導入されました。MS-DOS、PC DOS、OS/2、および Windows は、MBR から起動するように有効化されていなかったため、MBR フォーマットとブート コードは、1996 年までの DOS および OS/2 の時代を通じて、機能的にはほとんど変更されませんでした (一部のサードパーティの実装を除く)。
1996 年、 8 GBを超えるディスクをサポートするために、Windows 95B および MS-DOS 7.10 (IBM PC-DOS 7.1 と混同しないように) で論理ブロック アドレス指定 (LBA) のサポートが導入されました。ディスク タイムスタンプも導入されました。[ 2 ]これは、MBR がオペレーティングシステムとファイルシステムに依存しないことを意図しているという考えを反映したものでもあります。しかし、この設計ルールは、FAT16BおよびFAT32パーティション タイプ0x06 / 0x0Bに対してCHSアクセスを強制し、 0x0E / 0x0Cに対して LBA を使用する、より最近の Microsoft の MBR 実装で部分的に妥協されています。
MBR フォーマットの特定の内部詳細に関するドキュメントが不十分な場合もあり (互換性の問題を引き起こすこともあった) にもかかわらず、PC 互換コンピュータの普及と数十年にわたる半静的な性質により、事実上の業界標準として広く採用されてきました。これは、他のプラットフォームのコンピュータ オペレーティングシステムでもサポートされるほどでした。場合によっては、ブートストラップとパーティショニングのための既存の他の標準やクロス プラットフォーム標準に加えて、これが採用されました。 [ 3 ]
しかし、商用オペレーティングシステムで使用される MBR パーティションエントリと MBR ブートコードは 32 ビットに制限されています。[ 1 ]そのため、MBR パーティショニング方式 (32 ビット演算なし) で 512 バイトセクタ (実ディスクかエミュレートディスクかを問わず) を使用するディスクでサポートされる最大ディスクサイズは 2 TiB に制限されます。[ 1 ]その結果、2010 年以降広く利用可能になった大容量ディスクには別のパーティショニング方式を使用する必要があります。そのため、MBR パーティショニング方式はGUID パーティションテーブル(GPT) に置き換えられつつあります。公式のアプローチは、保護 MBRを使用することでデータの整合性を確保する以上のことはほとんど行いません。具体的には、GPT 方式もサポートしていないオペレーティングシステムとの下位互換性は提供されません。一方、サードパーティによって、ディスクの最初の2 TiBの物理領域にあるパーティションを両方のパーティション方式 で「並行して」維持したり、古いオペレーティングシステムがGPTパーティションから起動できるようにしたりするために、複数のハイブリッドMBRが設計・実装されてきた。しかし、これらのソリューションは現状では非標準であるため、特定のシナリオでさまざまな互換性の問題が発生する。
MBRは、ドライブの最初のセクターに位置する512バイト以上の領域です。
これには、以下の1つ以上が含まれる場合があります。
IBM PC DOS 2.0では、FDISKMBRパーティションの設定と管理を行うユーティリティが導入されました。この方式に従ってストレージデバイスがパーティション分割されると、そのMBRには、パーティションと呼ばれる線形領域の位置、サイズ、その他の属性を記述したパーティションテーブルが含まれます。
パーティション自体には、拡張ブートレコード(EBR)、BSD ディスクラベル、論理ディスクマネージャのメタデータパーティションなど、より複雑なパーティショニングスキームを記述するデータが含まれている場合もあります。[ 8 ]
MBR はパーティション内にはなく、デバイスの最初のセクタ (物理オフセット 0) にあり、最初のパーティションの前にあります。(パーティション化されていないデバイス、または個々のパーティション内に存在するブートセクタは、ボリュームブートレコードと呼ばれます。) コンピュータがDDO BIOS オーバーレイまたはブートマネージャを実行している場合、パーティションテーブルはデバイス上の別の物理的な場所に移動されることがあります。たとえば、Ontrack Disk Manager は、元の MBR コンテンツのコピーを第 2 セクタに配置し、その後起動される OS またはアプリケーションから自身を隠すことがよくありました。そのため、MBR のコピーは、最初のセクタにまだ存在するかのように扱われました。
慣例として、MBR パーティション テーブル スキームにはプライマリ パーティション テーブル エントリが 4 つだけありますが、一部のオペレーティングシステムやシステム ツールでは、これを 5 つ ( PTS-DOS 6.60 [ 9 ]およびDR-DOS 7.07 の Advanced Active Partitions (AAP))、8 つ ( ASTおよびNEC MS-DOS 3.x [ 10 ] [ 11 ]およびStorage Dimensions SpeedStor )、または 16 エントリ ( Ontrack Disk Managerの場合) に拡張しています。
PC XT時代のハードディスク技術の名残であるパーティションテーブルは、シリンダ、ヘッド、セクタ(CHSアドレッシング)という単位を用いて記憶媒体を分割します。これらの値は、現代のディスクドライブではもはや対応する単位とは一致せず、物理的にシリンダやヘッドを持たないソリッドステートドライブなどの他のデバイスでは無関係です。
CHS スキームでは、慣例としてセクター インデックスはセクター 0 ではなくセクター 1 から (ほぼ) 常に始まっており、7.10 を含む MS-DOS/PC DOS のすべてのバージョンにエラーがあるため、ヘッド数は一般的に 256 ではなく 255 [ h ]に制限されています。CHS アドレスがこれらのフィールドに収まらないほど大きい場合、現在ではタプル(1023, 254, 63) が一般的に使用されますが、古いシステムや古いディスク ツールでは、シリンダー値が 8 GB 付近の CHS バリアを法として折り返されることが多く、曖昧さやデータ破損のリスクが生じます。 (GPT を持つディスク上の「保護」 MBR が関係する場合、Intel の拡張ファームウェア インターフェイス仕様では、タプル (1023、255、63) を使用することが求められています。) 10 ビットのシリンダ値は、元の / レガシーINT 13h BIOS ディスク アクセス ルーチンへの呼び出しを容易にするために 2 バイト内に記録されます。このルーチンでは、16 ビットがセクタとシリンダの部分に分割され、バイト境界では分割されません。[ 13 ]
CHS アドレス指定の制限のため、[ 16 ] [ 17 ] LBA、つまり論理ブロック アドレス指定を使用するように移行されました。パーティション長とパーティション開始アドレスはどちらも、パーティション テーブル エントリに 32 ビットの値として格納されるセクタ値です。セクタ サイズは以前は 512 (2 9 ) バイトに固定されていると考えられており、チップ セット、ブート セクタ、オペレーティングシステム、データベース エンジン、パーティショニングツール、バックアップおよびファイルシステムユーティリティ、その他のソフトウェアなど、広範囲の重要なコンポーネントでこの値がハード コードされていました。2009 年末以降、4096 バイト セクタ ( 4Knまたはアドバンスト フォーマット) を使用するディスク ドライブが利用可能になりましたが、これらのドライブの一部のセクタ サイズは、ハード ドライブ ファームウェアでの変換によりホスト システムには 512 バイトとして報告され、512 エミュレーション ドライブ ( 512e ) と呼ばれていました。
ブロック アドレスとサイズは MBR のパーティション テーブルに 32 ビットを使用して格納されるため、512 バイト セクタ (実際またはエミュレート) を持つドライブを使用するパーティションの最大サイズと最高開始アドレスは 2 TiB − 512 バイト (2,199,023,255,040バイトまたは4,294,967,295 (2 32 −1) セクタ × 512 (2 9 ) バイト/セクタ)。[ 1 ]この容量制限を緩和することが、 GPT 開発の主な動機の 1 つです。
パーティション情報は、開始ブロック アドレスと長さを使用して MBR パーティション テーブルに格納されるため、理論的には、1 つのパーティションを除くすべてのパーティションが 2 TiB の制限より下に配置され、最後のパーティションがブロック 2 32 −1またはその近くから開始するように割り当てられ、サイズが最大 2 32 −1と指定され、それによってセクター アドレスへのアクセスに 32 ビットではなく 33 ビットを必要とするパーティションが定義される場合、512 バイト セクターのディスクに割り当てられた領域の合計サイズが4 TiB に近づくようにパーティションを定義することが可能です。ただし、実際には、内部で 64 ビット セクター アドレスを使用するLinux、FreeBSD、Windows 7 [ 18 ]などのLBA-48対応オペレーティングシステムのみがこれを実際にサポートしています。コード領域の制約と、MBRパーティションテーブルが32ビットしかサポートしないという性質上、ブートセクタは、LBA-28ではなくLBA-48をサポートするように有効になっている場合でも、LBA-48の全アドレス範囲をサポートするように特別に設計されている場合や、64ビットプラットフォームでのみ動作するように設計されている場合を除き、多くの場合32ビットの計算を使用します。内部的に32ビットセクタアドレスを使用するブートコードやオペレーティングシステムは、このパーティションへのアクセス時にアドレスがラップアラウンドし、結果としてすべてのパーティションで深刻なデータ破損を引き起こします。
USB外付けドライブなど、セクターサイズが 512 バイト以外のディスクの場合も制限があります。セクターサイズが 4096 の場合、MBR を使用して定義できるパーティションのサイズが 8 倍になり、最大 16 TiB (2 32 × 4096 バイト) のパーティションを作成できます。[ 19 ] Windows XP より新しいバージョンの Windows と Mac OS X は、より大きなセクターサイズをサポートしており、Linux は2.6.31 [ 20 ]または 2.6.32 [ 21 ]以降、より大きなセクターサイズをサポートしていますが、ブートローダー、パーティショニング ツール、およびコンピュータ BIOS の実装の問題により、特定の制限が生じます[ 22 ]。これは、セクター バッファ用に 512 バイトのみを予約するようにハードワイヤリングされていることが多く、より大きなセクター サイズのためにメモリが上書きされるためです。これにより、予測不可能な動作が発生する可能性もあるため、互換性と標準への準拠が問題となる場合は避けるべきです。
データストレージデバイスがGPT方式でパーティション分割されている場合、マスターブートレコードにはパーティションテーブルが含まれますが、その唯一の目的はGPTの存在を示すことと、MBRパーティションテーブル方式しか理解できないユーティリティプログラムが、ディスク上の空き領域とみなされる場所にパーティションを作成し、誤ってGPTを消去してしまうことを防ぐことです。
IBM PC互換コンピュータでは、ブートストラップファームウェア(ROM BIOS内に含まれる)がマスターブートレコードをロードして実行します。[ 23 ] PC /XT(タイプ5160)はIntel 8088マイクロプロセッサを使用していました。互換性を維持するために、すべてのx86 BIOSアーキテクチャシステムは、リアルモードと呼ばれる動作モードでマイクロプロセッサを起動します。BIOSはストレージデバイスからMBRを物理メモリに読み込み、マイクロプロセッサをブートコードの開始位置に指示します。BIOSはプロセッサをリアルモードに切り替え、MBRプログラムの実行を開始するため、MBRの先頭にはリアルモードマシンコードが含まれていることが想定されます。[ 23 ]
BIOSブートストラップルーチンは物理ディスクから正確に1セクタをロードして実行するため、ブートコードとともにパーティションテーブルをMBRに格納することで、MBRプログラムの設計が簡素化されます。MBRには、対象パーティションのボリュームブートレコード(VBR)をロードする小さなプログラムが含まれています。その後、制御はこのコードに渡され、実際のオペレーティングシステムのロードを担当します。このプロセスはチェーンローディングと呼ばれます。
人気のMBRコードプログラムはPC DOSとMS-DOSの起動用に作成され、同様のブートコードは現在も広く使用されています。これらのブートセクタはパーティションテーブルスキームが使用されていることを前提としており、MBRの埋め込みパーティションテーブル内のパーティションリストをスキャンして、アクティブフラグFDISKが付けられている唯一のパーティションを見つけます。[ 24 ]次に、アクティブなパーティションのボリュームブートレコード(VBR)をロードして実行します。
ブートコードの実装にはいくつかの種類があり、その一部はブートマネージャによってインストールされ、様々な方法で動作します。一部のMBRコードは、ディスクの最初のトラックからブートマネージャ用の追加コードをロードします。このトラックは、どのディスクパーティションにも割り当てられていない「空き」領域であると想定され、ロードされたコードが実行されます。MBRプログラムは、ユーザーと対話してどのドライブのどのパーティションから起動するかを決定し、別のドライブのMBRに制御を移す場合があります。他のMBRコードには、ロードして実行するブートマネージャコードの残りの部分のディスク上の場所のリスト(多くの場合、ファイルシステム内のファイルの内容に対応)が含まれています。(前者は、すべてのディスクパーティションユーティリティ、特にGPTの読み書きを行うユーティリティで共通ではない動作に依存しています。後者は、コードの残りの部分が移動するような変更が行われた場合、埋め込まれたディスク上の場所のリストを更新する必要があります。)
x86プロセッサを使用しないマシン、またはOpen FirmwareやExtensible Firmware Interface (EFI) ファームウェアなどの BIOS 以外のファームウェアを搭載した x86 マシンでは、この設計は不適切であり、MBR はシステム ブートストラップの一部として使用されません。[ 25 ] EFI ファームウェアは、GPT パーティション スキームとFATファイルシステム フォーマットを直接理解することができ、 EFI システム パーティションにファイルとして保持されているプログラムをロードして実行します。[ 26 ] MBR は、GPT パーティション テーブル スキームが使用されている場合に互換性のためにパーティション テーブルが含まれている可能性があるという点においてのみ関与します。
EFIファームウェアのブートストラップをエミュレートするMBR置換コードがあり、これによりEFI非対応のマシンでもGPTパーティション方式のディスクから起動できるようになります。このコードはGPTを検出し、プロセッサを適切な動作モードに設定し、ディスクからEFI互換コードをロードしてこのタスクを完了します。

ブートストラップコードとパーティションテーブルに加えて、マスターブートレコードにはディスク署名が含まれる場合があります。これは、ディスクメディアを一意に識別するための32ビット値です(ディスクユニットとは異なります。リムーバブルハードディスクの場合、この2つは必ずしも同じではありません)。
ディスク署名はWindows NTバージョン3.5で導入されましたが、現在ではLinuxカーネルバージョン2.6以降を含む複数のオペレーティングシステムで使用されています。LinuxツールはNTディスク署名を使用して、マシンがどのディスクから起動したかを判断できます。[ 27 ]
Windows NT (およびそれ以降の Microsoft オペレーティングシステム) は、ディスク署名を、その OS でコンピュータに接続されたことのあるすべてのディスク上のすべてのパーティションのインデックスとして使用します。これらの署名は、主にディスク パーティションとドライブ文字間の永続的なマッピングを保存するために、Windows レジストリキーに保持されます。また、Windows NT BOOT.INIファイル (ほとんどのファイルでは使用されていません) で、起動可能な Windows NT (またはそれ以降) パーティションの場所を記述するためにも使用されることがあります。[ 28 ] NT ディスク署名が Windows 2000/XP レジストリに表示されるキー (多数あります) の 1 つは次のとおりです。
HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices\
MBRに保存されているディスクの署名がA8 E1 B9 D2(この順序)であり、その最初のパーティションがWindowsの論理ドライブC:に対応している場合、キー値の下のデータは次のようになります。REG_BINARY\DosDevices\C:
A8 E1 B9 D2 00 7E 00 00 00 00 00 00
最初の 4 バイトはディスク署名です。(他のキーでは、これらのバイトは MBR セクターで見つかったものとは逆の順序で出現する場合があります。)これらに続いて、64 ビット整数をリトルエンディアン表記で形成する 8 バイトが続き、このパーティションのバイトオフセットを特定するために使用されます。この場合、00 7E は16 進数値0x7E00に対応します。32,256)。問題のドライブがセクターサイズを 512 バイトと報告すると仮定すると、このバイトオフセットを 512 で割ると 63 となり、これはパーティションの最初のセクターを含む物理セクター番号 (または LBA) です ( CHS タプルのセクター値で使用されるセクターカウントは1からカウントされますが、絶対セクター値または LBA セクター値は0からカウントを開始します)。
このディスクに、ディスク署名の後に値00 F8 93 71 02を持つ別のパーティションがある場合(たとえば、キー値の下)、バイトオフセット0x00027193F800 (\DosDevices\D:10,495,457,280)は、物理セクターの最初のバイトでもあります。20,498,940。
Windows Vista以降、ディスク署名はブート構成データ(BCD)ストアにも保存され、ブートプロセスはそれに依存します。[ 29 ]ディスク署名が変更されたり、見つからない場合、または競合が発生した場合、Windowsは起動できません。[ 30 ] WindowsがAdvanced Active PartitionエントリのLBAアドレスの重複部分を擬似ディスク署名として使用することを強制されない限り、Windowsの使用法はPTS-DOS 7およびDR-DOS 7.07のAdvanced Active Partition機能と競合します。特に、ブートコードが ディスクの最初の8 GBの外側にある場合は、LBAアドレッシングを使用する必要があります。
MBRはPC XTで誕生しました。[ 31 ] IBM PC互換コンピュータはリトルエンディアン方式を採用しており、プロセッサは2バイト以上の数値をメモリに最下位バイトから格納します。メディア上のMBRのフォーマットはこの慣例を反映しています。そのため、ディスクエディタではMBRの署名がのシーケンスとして表示されます55 AA。[ a ]
BIOS のブートストラップ シーケンスは、最初に見つかった有効な MBR をコンピュータの物理メモリのアドレス0x7C00から0x7DFFにロードします。[ 31 ] BIOS コードで最後に実行される命令は、MBR コピーの先頭に実行を指示するために、そのアドレスへの「ジャンプ」です。ほとんどの BIOS の主な検証はオフセット0x01FEの署名ですが、BIOS の実装者は、MBR にディスクの報告された容量を超えるセクタを参照するエントリのない有効なパーティション テーブルが含まれていることを確認するなど、他のチェックを含めることを選択できます。
BIOSにとって、リムーバブルディスク(フロッピーディスクなど)と固定ディスクは基本的に同じです。どちらの場合も、BIOSはメディアの最初の物理セクタを絶対アドレス0x7C00のRAMに読み込み、読み込んだセクタの最後の2バイトの署名をチェックし、正しい署名が見つかった場合は、ジャンプ(JMP)命令でセクタの最初のバイトに制御を移します。BIOSが行う唯一の本当の違いは、(デフォルト設定、またはブート順序が設定できない場合)最初の固定ディスクから起動する前に、最初のリムーバブルディスクから起動しようとすることです。BIOSの観点からすると、MBRがボリュームブートレコードをRAMにロードする動作は、フロッピーディスクのボリュームブートレコードがオペレーティングシステムローダのオブジェクトコードをRAMにロードする動作とまったく同じです。どちらの場合も、BIOSがロードしたプログラムは、オペレーティングシステムのチェーンロード処理を実行しています。
MBRブートセクタコードは物理アドレス0x0000 : 0x7C00にロードされることを想定していますが、[ i ]物理アドレス0x0000 : 0x0501(アドレス0x0000 : 0x0500はPhoenix BIOSで最後に使用されたアドレス)[ 13 ]から0x0000 : 0x7FFFまでのすべてのメモリ、[ 31 ]後に0x0000 : 0xFFFFまで緩和され[ 32 ](場合によっては[ j ] 0x9000 : 0xFFFFまで)最初の640KBの末尾がリアルモードで使用可能です。[ k ] BIOS割り込み呼び出しは、安全に割り当てることができるメモリ量を決定するのに役立つ場合があります (デフォルトでは、セグメント:オフセット位置0x0040 : 0x0013から基本メモリサイズ (KB) を読み取るだけですが、BIOS オーバーレイ、 RPLコード、ウイルスなどの他の常駐プリブート ソフトウェアによってフックされ、ブート セクタなどの他のブート ステージ ソフトウェアが上書きしないように、報告される使用可能なメモリ量を減らす場合があります)。INT 12h
512バイトのMBRのうち、最後の66バイトはパーティションテーブルやその他の情報のために予約されているため、MBRブートセクタプログラムは446 バイト以下のメモリに収まるように小さくする必要があります。
MBR コードはパーティション テーブルを調べ、適切なパーティションを選択し、通常は INT 13h BIOS コールを使用してブート プロセスの次の段階を実行するプログラムをロードします。MBR ブートストラップ コードは、「アクティブ」パーティションの先頭にある (ブート ローダーまたはオペレーティングシステムに依存する)ボリューム ブート レコードコードをロードして実行します。ボリューム ブート レコードは 512 バイトのセクタ内に収まりますが、MBR コードは、セクタ サイズについて仮定を置かない限り、1 セクタより長いブート ローダーに対応するために追加のセクタをロードしても安全です。実際、すべての IBM XT および AT クラスのマシンでは、アドレス0x7C00に少なくとも 1 KB の RAM が利用可能であるため、1 KB セクタを使用しても問題ありません。MBR と同様に、ボリューム ブート レコードは通常、アドレス0x0000 : 0x7C00にロードされることを想定しています。これは、ボリューム ブート レコードの設計が、BIOS ブート手順によってボリューム ブート レコードが直接ロードされる非パーティション メディアで始まったという事実に由来します。前述のように、BIOS は MBR とボリューム ブート レコード (VBR) [ l ]をまったく同じように扱います。これは MBR がロードされる場所と同じであるため、MBR の最初のタスクの 1 つは、メモリ内の別の場所に自身を再配置することです。再配置アドレスは MBR によって決定されますが、ほとんどの場合0x0000 : 0x0600 (MS-DOS/PC DOS、OS/2、および Windows MBR コードの場合) または0x0060 : 0x0000 (ほとんどの DR-DOS MBR) です。 (これらのセグメント化されたアドレスはどちらもリアルモードでは同じ物理メモリ アドレスに解決されますが、Apple Darwin が起動するには、MBR は0x0060 : 0x0000ではなく0x0000 : 0x0600に再配置する必要があります。これは、コードが MBR によって提供されるパーティション エントリへの DS:SI ポインタに依存しているにもかかわらず、誤って0x0000 :SI のみを介して参照しているためです。[ 33 ] ) 多くのVBR はブート ファイルをロードする際に特定の標準メモリ レイアウトを想定するため、メモリ内の他のアドレスに再配置しないことが重要です。
パーティションテーブルレコードのステータスフィールドは、アクティブなパーティションを示すために使用されます。標準に準拠したMBRでは、アクティブとしてマークできるパーティションは1つだけであり、これは有効なパーティションテーブルの存在を確認するための健全性チェックの一部として使用されます。複数のパーティションがアクティブとしてマークされている場合は、エラーメッセージが表示されます。一部の非標準MBRでは、これをエラー状態として扱わず、行内の最初にマークされたパーティションのみを使用します。
従来、 0x00 (非アクティブ) および0x80 (アクティブ)以外の値は無効であり、ブートストラップ プログラムがそれらに遭遇するとエラー メッセージを表示していました。しかし、Plug and Play BIOS 仕様およびBIOS Boot 仕様(BBS) により、1994 年以降、他のデバイスもブート可能になりました。[ 32 ] [ 34 ]その結果、MS-DOS 7.10 (Windows 95B) 以降の導入により、MBR はセット ビット 7 をアクティブ フラグとして扱い、0x01 〜 0x7Fの値に対してのみエラー メッセージを表示するようになりました。エントリは、後で対応するパーティションの VBR をロードするときに使用する物理ドライブ ユニットとして引き続き扱われ、0x80以外のブート ドライブも有効として受け入れられるようになりましたが、MS-DOS 自体はこの拡張機能を使用しませんでした。パーティション テーブルに実際の物理ドライブ番号を保存しても、通常は下位互換性の問題は発生しません。なぜなら、最初のドライブ以外のドライブ(いずれにせよ、以前はブート可能ではなかったドライブ)でのみ、値が0x80と異なるからです。ただし、他のドライブからブートできるシステムであっても、たとえば、ドライブが削除、追加、または交換されて物理ドライブの BIOS 割り当てが変更された後など、拡張機能が普遍的に機能しない場合があります。そのため、BIOS ブート仕様(BBS) [ 32 ]によれば、ビット 7 をアクティブ フラグとして受け入れる最新の MBR では、パーティション テーブルのエントリを使用する代わりに、BIOS によって最初に提供された DL 値を渡すのがベスト プラクティスです。
MBRはメモリ位置0x0000 : 0x7C00にロードされ、 CPUのリアルモードで前のブートストラップローダー(通常はBIOSのIPL )が0x0000 : 0x7C00にジャンプして実行を渡すと、次のCPUレジスタが設定されます。
プラグアンドプレイBIOSまたはBBSをサポートするシステムは、DLに加えてPnPデータへのポインタを提供します。[ 32 ] [ 34 ]
慣例として、標準に準拠した MBR は、メモリ位置0x0000 : 0x7C00に正常にロードされた VBR に実行を移し、 CPU のリアル モードで0x0000 : 0x7C00にジャンプし、以下のレジスタを維持または特別に設定します。
0x000C0x019またはセクタオフセット0x01FD)ロードされた VBR に実行を渡す前に、それらの VBR にロードします (NEWLDR オフセットを参照0x0014)。これにより、他のブートローダーが NEWLDR をチェーンローダーとして使用し、そのインメモリイメージをオンザフライで構成し、NEWLDR を介して VBR、EBR、または AAP のロードを「トンネル」することもできます。多くの実装において、MBRコードはVBRに追加情報を渡します。
boot1h、boot1u、および David Elliott のboot1fat32) もこのポインタに依存していますが、さらに DS を使用せず、代わりに0x0000に設定されていると想定しています。[ 33 ]この想定が間違っていると問題が発生します。OS/2 、MS-DOS 2.0 ~ 8.0、PC DOS 2.0 ~ 7.10、および Windows NT/2000/XP の MBR コードもこの同じインターフェイスを提供していますが、これらのシステムでは使用されていません。Windows Vista/7 の MBR では、この DS:SI ポインタは提供されなくなりました。一部の拡張機能は 16 バイトのパーティション テーブル エントリ自体にのみ依存しますが、他の拡張機能では 4 (または 5 エントリ) のパーティション テーブル全体が存在する必要がある場合があります。 DR-DOS 7.07では、拡張MBRとLOADERを組み合わせることで、オプションで拡張インターフェースが提供される場合があります。
GPT と連携して、拡張ディスクドライブ仕様(EDD) 4ハイブリッド MBR提案では、インターフェースの別の拡張が推奨されています。[ 37 ]
!GPT$PnPES:DI =インストールチェック構造(上記参照)を指しますさまざまなディスク エディタを使用して MBR セクターのバイトを直接操作することは可能ですが、MBR に固定された機能コードのセットを書き込むツールもあります。MS-DOS 5.0 以降、このプログラムにはMBR コードを書き換えるスイッチが含まれています。 [ 38 ] Windows 2000およびWindows XPでは、リカバリ コンソールを使用してコマンドでストレージ デバイスに新しい MBR コードを書き込むことができます。Windows VistaおよびWindows 7では、リカバリ環境を使用してコマンドで新しい MBR コードを書き込むことができます。MBRWizard などのサードパーティ ユーティリティを使用して、パーティション テーブルの内容を直接編集することもできます (16 進数やディスク/セクター エディタの知識は必要ありません)。[ o ]FDISK/MBRfixmbrBOOTREC /FIXMBR
ddは、MBR を含むストレージ デバイス上の任意の場所を読み書きするために一般的に使用される POSIX コマンドです。Linux では、 ms-sys を使用して Windows MBR をインストールできます。GRUBおよびLILOプロジェクトには、MBR セクタにコードを書き込むためのツール、具体的には と があります。GRUB Legacygrub-install対話型コンソールは、とコマンドlilo -mbrを使用して MBR に書き込むことができますが、GRUB2 では現在、をオペレーティングシステム内から実行する必要があります。setupembedgrub-install
様々なプログラムが、プライマリパーティションテーブルと拡張パーティション内の論理パーティションの両方の「バックアップ」を作成することができる。
Linux ( SystemRescueCDsfdisk上) は、プライマリおよび拡張パーティションテーブルのバックアップを保存できます。テキストエディタで読み取れるファイルが作成され、このファイルは sfdisk でプライマリ/拡張パーティションテーブルを復元するために使用できます。パーティションテーブルをバックアップするコマンドの例は で、復元するコマンドの例は です。このようにしてパーティションテーブルをあるディスクから別のディスクにコピーすることができ、ミラーリングの設定に役立ちますが、sfdisk は を使ってプロンプトや警告なしでコマンドを実行します。[ 39 ]sfdisk -d /dev/hda > hda.outsfdisk /dev/hda < hda.outsfdisk -d /dev/sda | sfdisk /dev/sdb
55hex AAhexAAhexAA55hex55AAhex00 00 00 00 00 00hex0000hex7C00hexA0000hex0000hex7FFFhex0000hexFFFFhexすべてのオペレーティングシステムには、MBRパーティションを管理するためのツールが含まれています。残念ながら、すべてのオペレーティングシステムはMBRパーティションをわずかに異なる方法で処理します。
Matthias [R.] Paul は次のように書いています。「[…]
PTS-DOS は
、MBR の他の 4 つのエントリの前に特別な 5 番目のパーティションエントリと、それに対応する AAP 対応の MBR ブートストラップ コードを使用します。[…]」
) や NEC DOS (タイプ)
などの一部の OEM システムでは、
MBR セクタに 4 個ではなく 8 個のパーティションエントリがありました。(Matthias R. Paul)。
(注:NEC MS-DOS 3.30およびAST MS-DOSの8エントリのパーティションテーブルには、オフセット0x017Cに署名が付加されています。)14hex24hex
A55Ahexこの NEC テーブルにパーティションを追加したとき、最初のエントリはオフセット
0x01EE
から
0x01FD
に配置され、次のエントリはそのすぐ上に追加されました。そのため、エントリは通常のテーブルとは逆の順序で挿入され、リストされます。したがって、ディスク エディタまたはパーティション リスト ユーティリティでこのようなテーブルを見ると、NEC の 8 エントリ テーブルの最初のエントリが、通常のパーティション テーブルでは最後のエントリ (4 番目のエントリ) として表示されます。
(注:8エントリのパーティションテーブルと、MS-DOS 3.30とのブートコードの違いを示しています。)
0x7C00[…] SYS […] /O[:nnn] IPL で報告されたブート ドライブ ユニット (n=0..126、128..254) を上書きします。 […] ターゲット ディスクを準備しています... FAT12 CHS ブート セクタを選択しています (ブート ユニットを報告するには IPL が必要です)。 ターゲットをフロッピー ディスクまたはスーパーフロッピー メディアとして扱います (ブート ドライブ ユニット 0)。 新しいブート セクタを書き込みます... […](注:SYSはマスターブートレコードではなくボリュームブートレコードを書き込みますが、どちらも基盤となるシステムによって最初にロードされる可能性があるため、入力レジスタインターフェースは(拡張機能を含めて)類似しています。)