ボリュームブートレコード( VBR ) (ボリュームブートセクタ、パーティションブートレコード、またはパーティションブートセクタとも呼ばれる) は、IBM パーソナルコンピュータで導入されたブートセクタの一種です。ハードディスクなどのパーティション化されたデータストレージデバイス、またはフロッピーディスクなどのパーティション化されていないデバイスに存在し、デバイスの他の部分に格納されているプログラム(通常はオペレーティングシステムですが、必ずしもそうとは限りません) を起動するためのマシンコードが含まれています。パーティション化されていないストレージデバイスでは、デバイスの最初のセクタです。パーティション化されたデバイスでは、デバイス上の個々のパーティションの最初のセクタであり、デバイス全体の最初のセクタはパーティションテーブルを含むマスターブートレコード(MBR)です。
ボリュームブートレコード内のコードは、マシンのファームウェアによって直接呼び出されるか、マスターブートレコード内のコードまたはブートマネージャによって間接的に呼び出されます。MBRとVBR内のコードは、基本的に同じ方法でロードされます。
ブートマネージャを介して VBR を呼び出すことは、チェーンローディングと呼ばれます。NTLDR (Microsoft の Windows NT 派生オペレーティングシステムのすべてのリリース (Windows XP および Windows Server 2003 まで) のブートローダー) などの一部のデュアルブートシステムでは、個々のオペレーティングシステムがインストールするブートストラップコードのコピーを単一パーティションの VBR に格納し、ブートローダーがユーザーにどのオペレーティングシステムをブートストラップするかを尋ねた後、ファイルから関連する VBR コンテンツをロードします。Windows Vista、Windows Server 2008以降のバージョンでは、NTLDR は置き換えられ、ブートローダーの機能はWINLOAD.EXEとWindows Boot Managerという 2 つの新しいコンポーネントによって提供されます。
FAT12(DOS 1.xを除く)、FAT16、FAT32、HPFS、NTFSなどのファイルシステムでは、VBRには、ファイルシステムの主要なディスク上のデータ構造の位置とレイアウトを指定するBIOSパラメータブロック(BPB)も含まれています。(FAT VBRのセクターレイアウト、さまざまなFAT BPBバージョンとそのエントリの詳細については、 FATの記事を参照してください。)
x86-CPU 用のIBM PC 互換ブート ローダーがブート セクタに存在することは、慣例として、ブート セクタ シグネチャと呼ばれる 2 バイトの 16 進数シーケンス (固定オフセット+1FEhに55h、+1FFhにAAh ) によって示されます (セクタ サイズが 512 バイト以上の場合)。[注 1 ] 512 バイトのセクタの場合、ブート セクタ シグネチャはセクタの終わりも示します。より小さいセクタやより大きいセクタの VBR では、実際のセクタ サイズの終わりにもシグネチャが表示される場合がありますが、ここで説明する意味は+1FEhの 16 ビット シグネチャにのみ適用されます。
この署名は、オペレーティングシステムを実際にロードできない場合でも、実行しても安全なダミーブートローダーが少なくとも存在することを示しています。ファイルシステムやオペレーティングシステム(あるいは特定のファイルシステムやオペレーティングシステム)の存在を示すものではありませんが、DOS 3.3 より前の古いバージョンでは、 FATフォーマットのメディアを検出するプロセスでこの署名に依存していました(新しいバージョンでは依存していません)。他のプラットフォームや CPU 用のブート コードでは、この署名を使用しないでください。BIOS が実行可能なコードが含まれていると想定してブート セクタに実行を渡すと、クラッシュする可能性があるためです。これは、非常に古いバージョンの DOS でも使用されるFAT12 / FAT16メディアは、オペレーティングシステムが含まれていない場合や、他のプラットフォームでのみブート可能である場合でも、この署名を維持する必要があることを意味します。したがって、少なくとも x86 互換の(ダミー)ローダーも含まれている必要があります(比較のために、Atari STおよびMSX-DOSでの FAT の例を参照してください)。しかしながら、他のプラットフォーム向けのメディアの中には、x86互換のダミーローダーがなくても誤って署名が含まれているものがあり、実際にはこのチェックは100%信頼できるものではありません。
IBM PC/AT以降、ほとんどのシステム BIOS で署名がテストされます(ただし、初代IBM PCやその他一部のマシンではテストされません)。さらに、ほとんどの MBR ブート ローダーでも、ブート セクタに制御を渡す前にチェックされます。一部の BIOS (IBM PC/AT など) は、固定ディスク / リムーバブル ドライブに対してのみチェックを実行しますが、フロッピー ディスクやスーパー フロッピー ディスクの場合は、06h 以上で始まるバイトがあり、最初の 9 ワードに同じ値が含まれていなければ、ブート セクタが有効とみなされ、フロッピー ディスク上の55h、AAhの明示的なテストが回避されます。古いブート セクタ (非常に古いCP/M-86および DOS メディア) は、正常にブートできるにもかかわらず、この署名がない場合があるため、一部の環境ではチェックを無効にすることができます。これは、フロッピー ディスクを 512 バイトより小さいセクタ サイズでフォーマットできるという事実も反映しています。
BIOS または MBR コードが有効なブート セクタを検出できず、ブート セクタ コードに実行を渡せない場合、次のブート デバイスを試します。すべてが失敗した場合、通常はエラー メッセージを表示し、INT 18hを呼び出します。[ 1 ]これにより、ROM 内のオプションの常駐ソフトウェア ( ROM BASIC )が起動するか、ネットワーク経由でリモート ブートを試みるか、ユーザーの確認後にINT 19hを介してシステムを再起動するか、次の電源投入までブート ストラッププロセスを停止します。 [ 1 ]
NTFS PBRでは、10進数オフセット72から79の間に、パーティションUUIDボリュームIDシリアル番号が含まれています。
VBR 内のブート コードは、BIOS がデータ構造と割り込みを設定し、ハードウェアを初期化していることを前提とすることができます。コードは、フェイル セーフ動作のために 32 KB を超えるメモリが存在することを前提とすべきではありません。[ 1 ]より多くのメモリが必要な場合は、 INT 12hに問い合わせる必要があります。これは、他のプリ ブート コード (BIOS 拡張オーバーレイ、暗号化システム、リモート ブート ストラップ ローダーなど) がメモリ内の他の場所にも存在する可能性があるためです (通常、報告される INT 12h メモリを適切に減らすことでブート セクタから自身を隠し、MBR および VBR の動作によって上書きされないようにします)。BIOS ブート仕様では 64 KB のメモリが許可されており、 MBR および/または VBR のメモリ領域として0000h:7C00hから0000h:FFFFh を明示的に推奨しています。[ 2 ] [ 1 ]ブート コードは、オリジナルのIntel 8088または8086 (オリジナルの PC で使用) よりも優れた CPU を想定してはならず、ハードウェアの正確な状態、割り込みシステム (割り込みは有効または無効にできます)、スタックの位置とサイズに関して想定してはなりません。オリジナルの IBM BIOS は、DS、ES、および SS CPUレジスタをセグメント0000hに初期化し、初期スタックをSS : SP = 0000h:0400hに維持しますが、すべての BIOS および MBR コードがこの慣例に従うわけではないため、これは頼りになる条件ではありません。以下に記載されていないレジスタは、初期化されていないものとして扱う必要があります。ハードウェアへの直接アクセスは通常許可されません。ディスクパラメータテーブル(DPT/FDPB)は通常、メモリ内の0000h:0078hに既に設定されていますが、VBRはINT 1Ehベクタが指すDPTをこの場所に移動(場合によっては修正)する必要があります(INT 1Ehは割り込みではなく、DPTへのファーポインタです)。
管理された環境では、いくつかの条件を緩和することができます。例えば、今日の一部のブートローダーは、通常の動作時に最大128KBのメモリを使用できることを前提としており(それ以上のメモリを要求することなく)、LBAアクセスを使用する一部のブートローダーは、少なくともIntel 80188または80186 CPUを前提としています。
VBR はメモリ位置0000h: 7C00h[ 1 ]にロードされ、前のブートストラップ ローダー (通常は BIOS または MBR ですが、場合によっては別のブート ローダー) が CPU のリアル モードで0000h:にジャンプして実行を渡すと、7C00h次の CPUレジスタが設定されます。
一部のCompaq製BIOSでは、誤って07C0h:0000hが使用されています。これは実モードメモリ上では同じ場所に解決されますが、非標準であるため避けるべきです。特定のレジスタ値を前提とするVBRコードや、再配置可能として記述されていないコードが正しく動作しない可能性があるためです。
00h= 1 番目、01h= 2 番目、 ...、7Eh;固定ディスク/リムーバブル ドライブ: 80h= 1 番目、81h= 2 番目、 ...、FEh; 値7Fhと はFFhROM / リモート ドライブ用に予約されており、ディスクでは使用してはなりません)。[ 3 ] DL は IBM BIOS および他のほとんどの BIOS でサポートされています。東芝 T1000 BIOS はこれを適切にサポートしていないことが知られており、一部の古い Wyse 286 BIOS ではハードディスクに 2 以上以上の DL 値を使用しています。スーパー フロッピーとして構成された USB スティックには通常、DL =00hまたはが割り当てられます01hが、まれな BIOS では、DL = を使用する代わりに、リムーバブル ドライブとして構成された USB スティックも誤って DL = として表示します。従来、BIOS はブート中に値と のみを渡しており、多くのブート セクタは固定値で動作するようにハードワイヤリングされていました。プラグ アンド プレイ BIOS 仕様とBIOS ブート仕様(BBS) により、他のデバイスもブート可能になります。[ 2 ] [ 4 ]後者では、MBR および VBR コードが内部的にハードワイヤードされたデフォルト値ではなく DL を使用することも推奨しています。[ 2 ] (注: MS-DOS / PC DOSおよびOS/2 VBR は、指定された DL 値を無視し、代わりに拡張 BIOS パラメータ ブロック(EBPB) のオフセットに格納されている値、または DOS バージョン 3.2 ~ 3.31 のセクター オフセットに格納されている値を取得します。DR-DOSの一部のバージョンは、7.02 以降で DL を使用します。 DR-DOS 7.07 VBR はデフォルトで DL を使用し、BPB 値を無視しますが、BPB 値を使用する古い動作を再度呼び出すか、特定のブート ドライブ ユニットをそこに格納するように強制することもできます。[ 3 ] FAT32ボリュームでは、FreeDOS はDL 値も利用しますが、 FAT12 / FAT16ボリュームでは、BPB 値が に設定されている場合にのみ利用します。)01h80h00h80h+19h+1FDhSYS /O[:nnn]nnnFFhプラグアンドプレイBIOSまたはBBSをサポートするシステムでは、DLに加えてPnPデータへのポインタが提供されます。[ 2 ] [ 4 ]
この情報により、ブートローダー(MBR または VBR 内)は、BIOS またはメモリ内の常駐 PnP / BBS オーバーレイとアクティブにやり取りして、ブート順序などを設定できますが、この情報はほとんどの標準 MBR および VBR では無視されます。理想的には ES:DI が渡されますが、PnP 対応のオペレーティングシステムは通常、後で PnP BIOS エントリ ポイントを取得するためのフォールバック メソッドも備えているため、ほとんどのオペレーティングシステムはこれに依存しません。ES:DI の情報はヒントとして使用できます。PnP BIOS 仕様によると、「$PnP」インストール チェック構造は、システム メモリの F0000h から FFFFFh まで、16 バイト境界ごとに ASCII 文字列 $PnP の署名を検索することで見つけることができます。
パーティション化されたメディアの場合、BIOSではなくMBR(または別のブートローダー)によってVBRが起動されると、多くの実装ではDL(場合によってはDHとES:DIも)に加えて、追加の情報がVBRに渡されます。
DR-DOS 7.07では、MBRとLOADERを組み合わせて、拡張インターフェースをオプションで使用できます。
0EDCh)NEWLDRセクタイメージの開始位置 (通常は 7C00h)GUIDパーティションテーブル(GPT)と併せて、拡張ディスクドライブ仕様(EDD)4ハイブリッドMBRの提案では、MBRからVBRへのインターフェースの別の拡張が推奨されています。[ 5 ]
54504721h(" !GPT")$PnPES:DI =インストールチェック構造(上記参照)を指します+0hとオフセット のパーティション タイプ+4hを除くすべてのビットが設定されています) と、それに続く追加データで構成されます。これは、上記の古い DS:SI 拡張機能と部分的に互換性があります。古い拡張機能では、パーティション テーブル全体ではなく、16 バイトのパーティション エントリのみが必要な場合です。+1FEh55h AAh55h+1FEhAAh+1FFhAA55h55AAh[…] SYS […] /O[:nnn] IPL で報告されたブート ドライブ ユニット (n=0..126、128..254) を上書きします。 […] ターゲット ディスクを準備しています... FAT12 CHS ブート セクタを選択しています (ブート ユニットを報告する IPL が必要です)。 ターゲットをフロッピー ディスクまたはスーパーフロッピー メディアとして扱います (ブート ドライブ ユニット 0)。 新しいブート セクタを書き込みます... […]