ああ

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 という。

Ⅲ.1.ルート ディレクト

 ファイルはルートを頂点とする逆ツリー構造で管理される。  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 によって管理される。

Ⅲ.3.サブ ディレクト

 サブ ディレクトリもファイルの一種で、ルート ディレクトリや他のサブ ディレクトリに、ファイル属性 "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 で埋める。