FATファイルシステムの概要 | ブートセクタについて | クラスタについて | FATチェインについて |
図2.にブートセクタの内容を示します。
ブートセクタは、ディスクの構成を示すBPB(BIOSパラメーターブロック)とOSをロード起動するためのブートプログラム領域があります。
ブートブログラム領域は、86系CPUコードが記録されているため、eFILEでは使用しません。
| 位置(バイト) | サイズ | 内容 |
| 0x00~0x02 | 3バイト | ジャンプコード |
| 0x03~0x0A | 8バイト | 名称 |
| 0x0B~0x0C | 2バイト | 1セクタ当たりのバイト数 |
| 0x0D | 1バイト | 1クラスタ当たりのセクタ数 |
| 0x0E~0x0F | 2バイト | 予約セクタ数 |
| 0x10 | 1バイト | FAT数 |
| 0x11~0x12 | 2バイト | ディレクトリエントリー数 |
| 0x13~0x14 | 2バイト | 総セクタ数 |
| 0x15 | 1バイト | メディアディスクリプタ |
| 0x16~0x17 | 2バイト | 1FAT当たりのセクタ数 |
| 0x18~0x19 | 2バイト | 1トラック当たりのセクタ数 |
| 0x1A~0x1B | 2バイト | ヘッド数 |
| 0x1C~0x1F | 4バイト | 隠されたセクタ数 |
| 0x20~0x23 | 4バイト | 大容量ディスクの総セクタ数 |
| 0x24 | 1バイト | 物理ドライブ番号 |
| 0x25 | 1バイト | 予約 |
| 0x26 | 1バイト | 拡張ブートレコードシグネチャ |
| 0x27~0x2A | 4バイト | ボリュームシリアル番号 |
| 0x2B~0x35 | 11バイト | ボリュームラベル |
| 0x36~0x3D | 8バイト | FATタイプ |
| 0x3E~0xFD | 448バイト | ブートプログラム領域 |
| 0x1FE~0x1FF | 2バイト | ブートレコードシグネチャ |
ブートセクタの先頭の3バイトはOSをロードするためのブートプログラムへのジャンプ命令が記録されます。
ジャンプコードは、86系CPUの命令コードで通常は、”EB”、”3E”、”90”が設定されています。
eFILEでは、このフィールドは使用していません。
このフィールドには、メーカー名や製品名などの文字列が記録されます。
eFILEでフォーマットした場合は、"EFILE"と記録されます。
このフィールドには、1セクタ当たりのバイト数が記録されます。
AT互換機では、512バイトのみが使用されています。
現在のPCはほとんどがAT互換機なのでWindowsも実質512バイト固定となっているのが現状です。
eFILEでは、512バイトのみ有効です。
このフィールドには、1クラスタ当たりのセクタ数が記録されます。
1,2,4,8,16,32,64のどれかの値が設定されています。
1クラスタは、複数のセクタで管理します。
この値が“4”であれば、4セクタ(2KB)を1クラスタとしてデータ領域を管理することになります。
このフィールドには、ブートレコードで使用しているセクタ数が記録されます。
通常は、”1”が設定されています。
このフィールドには、FATの数が記録されており、通常”2”が設定されています。
FATは2個持っているのが普通です。
RAMディスク等では容量がもったいないという理由からFATを1つしか持たないディスクも存在しましたが、SDカード、メモリスティック、ハードディスク等外部記憶装置では、FATは必ず2個記録されています。
このフィールドには、ルートディレクトリとして使われるディレクトリの数が記録されます。
ディレクトリエントリーは1エントリーで32バイト使用されます。
従って、1セクタには16個のディレクトリエントリーが記録できます。
ディレクトリエントリー数の最大は512個なので、ルートディレクトリには、最大で512個のファイルを作成できます。
このフィールドには、ディスクの全セクタ数が記録されます。
このフィールドは2バイトなので、最大65535セクタ(32MB)の容量まで扱うことができます。
32MBを超える容量のディスクを扱う場合は、(14)の大容量ディスクの総セクタ数に全セクタ数が記録されます。
その場合、このフィールドには0が設定されます。
このフィールドには、通常”0xF8”が記録されます。
メディアがフロッピィディスクの場合は”0xF0”を設定しますが、その他のメディアでは、”0xF8”を設定するのが普通です。
メディアディスクリプタとFATの先頭にあるFATIDは、同じ値になっています。
このフィールドには、1つのFATが使用しているセクタ数が記録されます。
このフィールドには、ディスクの物理的な1トラックのセクタ数が記録されます。
論理セクタ番号から物理的なセクタ位置を計算する際に必要となる値です。
このフィールドは、MS-DOSのディスクドライバで使用されていましたが、Windowsでは使用していないようです。(Windowsでは、このフィールドに”0”を設定しても動作します)
Windowsのファイルシステムは、メディアがディスクの場合、論理セクタ番号から物理的なセクタ位置(シリンダ、ヘッド、セクタ位置)への変換は、ドライバで行うのが一般的となっているためと思われます。
また、SDカードやメモリスティック等では、そもそもトラックやヘッドが存在しないため意味がありません。
eFILEでも、ドライバへは論理セクタ番号を渡すため、このフィールドは使用していません。
このフィールドには、ディスクの物理的なヘッドの数が記録されます。
これも(11)と同様に、論理セクタ番号から物理的なセクタ位置を計算する際に必要となる値です。
このフィールドも、MS-DOSのディスクドライバで使用されていましたが、Windowsでは使用していないようです。(Windowsでは、このフィールドに”0”を設定しても動作します)
eFILEでも、このフィールドは使用していません。
このフィールドには、ブートセクタより前にあるセクタ数が記録されます。
ハードディスク等ではMBR(マスターブートレコード)を先頭のセクタに確保する場合があります。
その場合は、MBRで確保したセクタ数がこのフィールドに設定されます。
MBRにはパーティションの先頭セクタ番号が入っており、パーティションの位置はこの値で知ることができます。
このフィールドも、MS-DOSのディスクドライバで使用されていましたが、Windowsでは使用していないようです。(Windowsでは、このフィールドに”0”を設定しても動作します)
eFILEでも、このフィールドは使用していません。
また、eFILEではMBRが存在するデバイスに対しては、ドライバ側でパーティションの開始セクタ番号を取得し対処する必要があります。
このフィールドには、ディスクの容量が32MB以上のディスクの全セクタ数が記録されます。
32MB未満のディスクの全セクタ数は、(8)総セクタ数のフィールドに記録されます。
このフィールドには、AT互換機用のブートセクタのブートプログラムが使用する物理的なドライブの番号が記録されます。
このフィールドも、Windowsでは使用していないようです。
eFILEでもこのフィールドは使用していません。
このフィールドには、常に”0x00”が記録されています。
このフィールドには、通常”0x29”が記録されており、この場合はこの後に(18)ボリュームシリアル番号、(19)ボリュームラベル、(20)FATタイプが存在します。
”0x00”が記録されている場合は、これらの情報は存在しないことを意味します。
このフィールドには、フォーマット時に付けられた4バイトの値が記録されています。
このフィールドには、フォーマット時に付けられたボリュームラベルが記録されています。
このフィールドには、FATを識別する文字列が記録されます。
FAT12の場合は、文字列で"FAT12"と記録され、FAT16の場合は"FAT16"と記録され、FAT32の場合は、"FAT32"と記録されます。
このフィールドには、86系CPUコードでブートプログラムが記録されます。
eFILEは、この領域は使用していません。
このフィールドには、必ず、”0x55”,”0xAA”が記録されます。
ブートセクタかどうか、このシグネチャをチェックして、一致していればBPB情報の解析を行います。