FD の構造と FAT12 - 物理構造と論理構造
park12.wakwak.com
Ⅰ.FD の論理構造
FD には様々な規格があるが、ここでは一般に広く使われている 2HD ディスクを、IBM-PC/AT 互換機 (DOS/V) 形式でフォーマットした 1.44MB タイプを扱う。
Ⅰ.1.管理単位
FD はディスクの記録面をトラックやセクターといった単位に分割して管理する。
トラック (track)
外周側から内周側向かって同心円状に80本に分割した単位をトラックと呼ぶ。
トラック番号は外周側から内周側に向かって 0 ~ 79 が振られる。
セクター (sector)
トラックを円周方向に 18 個の区画に細分化した単位をセクターと呼ぶ。
セクター番号は 1 ~ 18 が振られる。
OS はこの他に、クラスターという単位も使う。 これら FD の主な諸元は次の通り。
1.44 MB タイプ |
FD の諸元 |
80 tracks / surface |
( 1面当たり ) |
18 sectors / track |
( 1トラック当たり ) |
512 bytes / sector |
( 1セクター当たり ) |
1 sector / cluster |
( 1クラスター当たり ) |
※ 上表から FD 1枚の容量を計算すると 1.47MB となる。
( 80 トラック × 18 セクター × 512 バイト × 2 面 = 1.47MB )
ただし、フォーマットにより 33 セクターが管理領域等に割り振られるので、
実際に使用できるのは 2847 セクター × 512 バイト = 1.45MB となる。
【 クラスター 】
OS がディスクの管理に用いる最小単位。 アロケーション ユニットともいう。
複数のセクターで 1 つのクラスターを構成し、通し番号 ( 2以降の番号 ) を付与して管理する。
1.44 MB タイプ FD の 1クラスタは 1セクタ構成である。
Ⅰ.2.セクターのレイアウト
FD のセクターは次のように割り付けられる。
セクター番号 |
セクター数 |
内容 |
0 |
1 |
Boot Sector ( ブート セクター ) |
※1 |
1 ~ 9 |
9 |
FAT |
※2 |
10 ~ 18 |
9 |
FAT 予備 |
19 ~ 32 |
14 |
Root Directory ( ルート ディレクトリ ) |
※3 |
33 ~ 2879 |
2847 |
Data Area |
※1:Boot Sector : ディスクの情報と OS をロードするプログラム (IPL) で構成される。
※2:FAT ( File Allocation Table ) : ファイルの記録位置 (cluster) を管理する。 12bit 構成。
※3:Root Directory : ファイル名やファイル属性を記録した Directory Entry (32bit 構成) を管理する。
Ⅱ.ブート セクターの構成
ディスク先頭のセクターはブート セクター (Boot Sector) と呼ばれ、起動時に BIOS から真っ先に参照される。
ブート セクターはディスクの情報と OS 起動に関わる IPL で構成される。
Ⅱ.1.ブート セクターのレイアウト
ブート セクターの 512 バイトは次のようにレイアウトされる。
Offset |
バイト数 |
内容 |
0x0000 - 0x0002 |
3 |
IPL へ jmp するコード (一般的には EB 3E 90 ※) |
0x0003 - 0x000A |
8 |
OEM name string (メーカー名) |
0x000B - 0x0023 |
25 |
BPB ( BIOS Parameter Block ) |
0x0024 - 0x003D |
26 |
Extended BPB |
0x003E - 0x01FD |
448 |
IPL ( Initial Program Loader ) |
0x01FE - 0x01FF |
2 |
Boot Signature ( Boot Sector が正常であることの署名 : 0x55AA ) |
※ この他に "EB 3C 90", あるいは "EB 48 90" というコードも見られる。
2バイト目のコード (3C, 48) がジャンプ先のアドレスを指しているので、IPL のレイアウトもそのアドレスから始まる。
Ⅱ.2.BPB (BIOS Parameter Block) の詳細
BPB (BIOS Parameter Block) にはディスクの情報が (フォーマット時に) 記録されている。
これらは BIOS や OS に参照される。
Offset |
セクター先頭からの位置 |
バイト数 |
内容 |
0x00 - 0x01 |
0x000B - 0x000C |
2 |
セクター当たりのバイト数 ( 通常 512 ) |
0x02 |
0x000D |
1 |
クラスター当たりのセクター数 ( 1.44M-FDの場合、 1 ) |
0x03 - 0x04 |
0x000E - 0x000F |
2 |
起動プログラムが使用するセクター数 ( 通常 1 ) |
0x05 |
0x0010 |
1 |
FAT の数 ( 通常 2 ) |
0x06 - 0x07 |
0x0011 - 0x0012 |
2 |
ルート ディレクトリのエントリー数 ( 通常 224 ) |
0x08 - 0x09 |
0x0013 - 0x0014 |
2 |
セクター数 ( 通常 2880 ) |
0x0A |
0x0015 |
1 |
メディア タイプ F0 : 3.5 inch FD (1.44MB, 2.88MB)、 F8 : Hard Disk |
0x0B - 0x0C |
0x0016 - 0x0017 |
2 |
FAT 当たりのセクター数 ( 通常 9 ) |
0x0D - 0x0E |
0x0018 - 0x0019 |
2 |
トラック当たりのセクター数 ( 通常 18 ) |
0x0F - 0x10 |
0x001A - 0x001B |
2 |
磁気ヘッド数 ( 通常 2 ) |
0x11 - 0x14 |
0x001C - 0x001F |
4 |
隠しセクター数 |
0x15 - 0x18 |
0x0020 - 0x0023 |
4 |
セクター総数 (サイズの大きいディスク用) |
Ⅱ.3.Extended BPB の詳細
Extended BPB には BPB の拡張情報が記録される。
Offset |
セクター先頭からの位置 |
バイト数 |
内容 |
0x00 |
0x0024 |
1 |
物理ドライブ番号 |
0x01 |
0x0025 |
1 |
予約 |
0x02 |
0x0026 |
1 |
Signature ( 0x29 の時、以下 3 つの情報が有効) |
0x03 - 0x06 |
0x0027 - 0x002A |
4 |
シリアル番号 生成時刻などからユニークな ID が振られる |
0x07 - 0x11 |
0x002B - 0x0035 |
11 |
ボリューム名 |
0x12 - 0x19 |
0x0036 - 0x003D |
8 |
FAT タイプ |
ファイルの管理は、その名称や属性、サイズ等の情報を登録することで行われる。 この登録に使われる単位を Directory Entry という。
ファイルはルートを頂点とする逆ツリー構造で管理される。 FD のセクター 19 ~ 32 はルート ディレクトリと呼ばれ、 ルートに存在するファイルの Directory Entry を格納する専用領域となっている。
ルート ディレクトリのサイズは 14セクター × 512バイト = 7,168バイト。 一方 Directory Entry のサイズは 32 バイトなので、ルート ディレクトリには 224 個の Directory Entry が記録される。
Ⅲ.2.Directory Entry の詳細
ルート ディレクトリを構成する Directory Entry (32 バイト) の詳細は次の通り。
Offset |
バイト数 |
内容 |
0x0000 - 0x0007 |
8 |
ファイル名 ( 1バイト目が 0x00 は未使用エントリー、 0xE5 は削除ファイル ) |
0x0008 - 0x000A |
3 |
拡張子 |
0x000B |
1 |
属性 |
0x000C - 0x0015 |
10 |
予備 |
0x0016 - 0x0017 |
2 |
更新時刻 |
0x0018 - 0x0019 |
2 |
更新日付 |
0x001A - 0x001B |
2 |
先頭クラスター番号 |
0x001C - 0x001F |
4 |
ファイル サイズ |
※ ファイルを削除した場合、Directory Entry の先頭 1バイトは 0xE5 に書き換えられるが、
それ以外は手付かずで残る。 「 Ⅳ.2.2.ファイルの削除処理 」参照。
ファイル名や拡張子の文字数が短い場合、残りの部分は 0x20 (スペース) で埋められる。
属性はビット位置ごとに次の意味がある。
ビット位置 |
7 - 6 |
5 |
4 |
3 |
2 |
1 |
0 |
意味 |
予約 |
Archive |
Directory |
Volume |
System |
Hidden |
Read Only |
更新時刻データのビット構成。
ビット位置 |
15 - 11 |
10 - 5 |
4 - 0 |
適用 |
時刻 |
分 |
秒 |
更新日付データのビット構成。
ビット位置 |
15 - 9 |
8 - 5 |
4 - 0 |
適用 |
年 |
月 |
日 |
※ 1980 年を基準とし 2107 年まで表示可能。
先頭クラスター番号。
ファイルを保存したクラスターの先頭番号。
ファイル サイズが 0 ならクラスター番号も 0 になる。
▼ 実際のファイルを格納するデータエリアには、クラスター番号 2以降が適用される。
▼ 512 バイト (1クラスター) を超えるファイルを格納したクラスター番号は、FAT によって管理される。
サブ ディレクトリもファイルの一種で、ルート ディレクトリや他のサブ ディレクトリに、ファイル属性 "Directory" として登録される。
その構成は Directory Entry の集合で、実態は一部 (先頭2個分の Directory Entry) を除いてルート ディレクトリと同様である。
( Directory Entry については、「Ⅲ.2.Directory Entry の詳細」参照 )
先頭2個の Directory Entry は、自己アドレスと親アドレスを記録している。 以下にその構造を示す。
【 サブ ディレクトリの先頭 Directory Entry 】
Offset |
バイト数 |
内容 |
0x0000 - 0x0007 |
8 |
ファイル名 先頭に 0x2E (ピリオド) 1文字で、残りは 0x20 (空白) で埋められる |
0x0008 - 0x000A |
3 |
拡張子 すべて 0x20(空白) |
0x000B |
1 |
属性 0x10 (ディレクトリ) |
0x000C - 0x0015 |
10 |
常に 0x00 |
0x0016 - 0x0017 |
2 |
更新時刻 |
0x0018 - 0x0019 |
2 |
更新日付 |
0x001A - 0x001B |
2 |
自己クラスター番号 |
0x001C - 0x001F |
4 |
常に 0x00 |
【 サブ ディレクトリの 2番目の Directory Entry 】
Offset |
バイト数 |
内容 |
0x0000 - 0x0007 |
8 |
ファイル名 先頭 2文字が 0x2E (ピリオド) で、残りは 0x20 (空白) で埋められる |
0x0008 - 0x000A |
3 |
拡張子 すべて 0x20(空白) |
0x000B |
1 |
属性 0x10 (ディレクトリ) |
0x000C - 0x0015 |
10 |
常に 0x00 |
0x0016 - 0x0017 |
2 |
更新時刻 |
0x0018 - 0x0019 |
2 |
更新日付 |
0x001A - 0x001B |
2 |
親クラスター番号 親クラスターがルート ディレクトリの場合は 0x00 |
0x001C - 0x001F 4 常に 0x00 |
▼ サブ ディレクトリ内でのファイル操作において、自己ディレクトリをピリオド 1つ ( .)、親ディレクトリをピリオド 2つ
( ..) で表現できるのは、この 2つの Directory Entry の働きである。
Ⅲ.4.LFN (Long File Name) 対応
複数の連続した Directory Entry を用いることで、8文字 (ASCII文字換算) 以上のファイル名に対応している。 LFN に対して従来 (8文字以下) の方式を SFN (Short File Name) という。
ASCII文字換算で 8文字以上のファイル名入力があった場合、複数の LFN 用 Directory Entry に入力ファイル名を格納し、 1つの SFN 用 Directory Entry に省略したファイル名と属性を格納することで対処する。
【 LFN 用 Directory Entry 】
Offset |
バイト数 |
内容 |
0x0000 |
1 |
Flag |
※1 |
0x0001 - 0x000A |
10 |
File Name part 1 |
0x000B |
1 |
属性 常に 0x0f |
0x000C |
1 |
予約 0x00 |
0x00D |
1 |
CRC ( SFN を基に作ったチェックサム ) |
0x000E - 0x0019 |
12 |
File Name part 2 |
0x001A - 0x001B |
2 |
常に 0x00 |
0x001C - 0x001F |
4 |
File Name part 3 |
※1:Flag : LFN Entry の順番を示す。
ファイル名先頭の LFN を 1 として順に番号を振り、最終 LFN Entry には 0x40 との OR を記録する。
LFN Entry の並び (登録順) は、ファイル名末尾の LFN Entry から順に並べ、最後に SFN 用の Entry を配置する。
3個の LFN Entry を使った場合の Directory Entry の並び方は以下のようになる。
登録順 |
Entry の種類 |
Flag |
1 |
最終 LFN |
0x43 |
2 |
No.2 LFN |
0x02 |
3 |
No.1 LFN |
0x01 |
4 |
SFN |
― |
LFN Entry はファイル名のみを記録し、属性等は記録しない。
拡張子、先頭クラスター番号、属性等は SFN 用の Directory Entry に記録する。
また、SFN 用には 8バイトに省略したファイル名も記録する。
ファイル名は File Name part 1 ~ 3 に分散記録される。
1つの LFN Entry には、2バイト文字で最大 13文字を格納する。
ASCII (1バイト) 文字の場合は、上位バイトを 0x00 で埋める。
2バイトの "0" (0x0000) がファイル名の終端を表し、余った部分は 0xffff で埋める。