今まではファイルシステムを使いませんでした。
実際の OS ではファイルの管理を行う必要があります。
DOS(MS-DOS,DR-DOS,FreeDOSなど)では
FAT と呼ばれるファイルシステムによりファイル管理を行います。
今回は、FAT の構造を説明します。
FAT では、最初に
管理テーブルをおき、その後に
ファイル(やディレクトリ)のデータを記録します。
管理テーブルはデータ領域のファイルへの割り当てを管理します。
ディスクに記録されたデータは次の順に並んでいます。
| データ | 内容 |
| セクタ 0(512バイト) | ドライブ情報 マスタブートローダです。 |
| 管理テーブル 1 | 管理テーブルです。 |
| 管理テーブル 2 | 管理テーブルのコピーです。 |
| ルートディレクトリ | ルートディレクトリデータの配列です。 |
| データ | ファイル、ディレクトリのデータ(クラスタの配列)です。 |
| オフセット | サイズ | 内容 |
| 00h | byte [3] |
必ず jmp 命令です。 先頭命令が jmp でない場合は FAT として認識されません。 short jmp の場合、次の1バイトは必ず nop です。 |
| 03h | byte [8] | OEM の名前です。 内容はチェックされません。 |
| 0Bh | 16-bit unsigned | 論理セクタのバイト数 |
| 0Dh | byte | 1クラスタの論理セクタ数 |
| 0Eh | 16-bit unsigned |
管理テーブルの前にある論理セクタ数です。 通常は 1 です。 |
| 10h | byte | 管理テーブルの数です。 通常は 2 です。 |
| 11h | 16-bit unsigned |
ルートディレクトリのエントリ数です。 (論理セクタのバイト数 / 32)の倍数です。 |
| 13h | 16-bit unsigned |
論理セクタ数です。 論理セクタ数が 65536 以上のときは 0 です。 |
| 15h | byte |
メディアの種類を表します。上位 4 ビットは 1111b です。 F0h:1.44MB以上のリムーバブルメディア(FD,MO etc.) F8h:HDD,F9h-FFh:その他のFD |
| 16h | 16-bit unsigned | 管理テーブルの論理セクタ数です。 |
| 18h | 16-bit unsigned | 1シリンダ、1ヘッドあたりのセクタ数です。 |
| 1Ah | 16-bit unsigned | 1シリンダあたりのヘッド数です。 |
| 1Ch | 32-bit unsigned |
隠れ論理セクタ数です。 HDD ではこのパーティションの前にある論理セクタ数です。 |
| 20h (DOS 4以降) | 32-bit unsigned | オフセット 13h が 0 のときの論理セクタ数です。 |
| 24h (DOS 4以降) | byte |
ドライブ番号のヒントです。 80hは最初のドライブ、00hはそれ以外を表すようです。 |
| 25h (DOS 4以降) | byte | 予約されています。0 です。 |
| 26h (DOS 4以降) | byte |
DOS 4 以降を表す ID (29h)です。 オフセット 20h 〜 35h が正しいことを表します。 |
| 27h (DOS 4以降) | 32-bit unsigned |
ボリュームシリアル番号(ディスク固有のID)です。 ディスクが交換されたかを調べるために用意されています。 |
| 2Bh (DOS 4以降) | byte [11] | ボリュームラベルです。 |
| 36h (DOS 5以降) | byte [8] |
ファイルシステムの名前です。 内容はチェックされません。 'FAT12 'や'FAT16 'と記録します。 |
| 3Eh | サイズ可変 | 起動コードです。 |
| 1FEh | byte [2] | 起動可能を表す ID です。55h,AAhを記録します。 |
| 値 | 内容 |
| 000h(FAT12) 0000h(FAT16) | 空きクラスタです。 |
| 001h(FAT12) 0001h(FAT16) | この値は使われません。 |
| 002h〜FF6h(FAT12) 0002h〜FFF6h(FAT16) | クラスタ番号です。 |
| FF7h(FAT12) FFF7h(FAT16) | 不良(スキップ)クラスタです。 このクラスタは使われません。 |
| FF8h〜FFFh(FAT12) FFF8h〜FFFFh(FAT16) | ファイル、ディレクトリの最終クラスタです。 |
| オフセット | サイズ | 内容 |
| 0 | byte [8] |
ファイル名です。 未使用部分はスペースで埋めます。 先頭が 00h:それ以降は未使用 先頭が E5h:削除済み 先頭が 05h:先頭バイトはE5h(通常のファイル) |
| 8 | byte [3] | ファイルの拡張子です。 未使用部分はスペースで埋めます。 |
| 11 | byte | ファイルの属性です。 01h:read only,02h:hidden,04h:system 10h:directory,20h:archive |
| 12 | byte [10] | 予約されています。 |
| 22 | 16-bit unsigned | 時刻です。 ビット割り当て形式は hhhhhmmmmmmsssss です。 |
| 24 | 16-bit unsigned | 日付です。 ビット割り当て形式は yyyyyyymmmmddddd です。 yearは1980年を0とした値です。 |
| 26 | 16-bit unsigned | 開始クラスタ番号です。 |
| 28 | 32-bit unsigned | ファイルサイズです。 |
ファイルを読み込む場合の流れは次のようになります。