ファイルとファイルシステム - kentakozuka/yetos GitHub Wiki
- 任意のバイト列に名前をつけたもの
- 名前以外にメタデータを付けることがある
- 名前とブロック番号の対応表を管理する機能を中心とした仕組み
- FAT
- NTFS
- ext4
- btrfs
- APFS
- ブロックデバイスの中身を記録したデータ
- 論理的なブロックデバイスともいえる。
- ループバックモードでマウントすれば通常の記憶装置と同じように操作できる。
dd if=/dev/zero of=fat_disk bs=1M count=128
mkfs.fat -n 'YET OS -s 2 -f 2 -R 32 -F 32 fat_disk
- ブロックデバイスを複数に分割した1つの領域
BPBの構造(FAT32の例)
フィールド名 | オフセット | バイト数 | fat_diskでの値 | 意味 |
---|---|---|---|---|
BS_jmpBoot | 0 | 3 | eb 58 90 | プログラムへのジャンプ命令 |
BS_OEMName | 3 | 8 | mkfs.fat | 任意の8バイト文字 |
BPB_BytsPerSec | 11 | 2 | 0x0200 | ブロックあたりのバイト数 |
BPB_SecPerClus | 13 | 1 | 0x02 | クラスタあたりのブロック数 |
BPB_RsvdSecCnt | 14 | 2 | 0x0020 | ボリューム先頭からの予約ブロック数 |
BPB_NumFATs | 16 | 1 | 0x002 | FATの数 |
BPB_RootEntCnt | 17 | 2 | 0x0000 | ※ルートディレクトリエントリ数 |
BPB_TotSec16 | 19 | 2 | 0x0000 | ※ボリューム全体の総ブロック数 |
BPB_Media | 21 | 1 | 0xf8 | メディア種別(今では使われていない) |
BPB_FATSz16 | 22 | 2 | 0x0000 | ※FATあたりのブロック数 |
BPB_SecPerTrk | 24 | 2 | 0x0020 | トラックあたりのブロック数 |
BPB_NumHeads | 26 | 2 | 0x0040 | ヘッド数 |
BPB_HiddSec | 28 | 4 | 0x00000000 | 隠しブロック数 |
BPB_TotSec | 32 | 4 | 0x00040000 | ボリューム全体の総ブロック数 |
BPB_FATSz32 | 36 | 4 | 0x000003f8 | FATあたりのブロック数 |
BPB_ExtFlags | 36 | 2 | 0x0000 | FATの冗長化に関するフラグ |
BPB_FSVer | 42 | 2 | 0x0000 | ファイルシステムバージョン(最新は0.0) |
BPB_RootClus | 44 | 4 | 0x00000002 | ルートディレクトリの開始クラスタ |
BPB_FSInfo | 48 | 2 | 0x0001 | FSINFO構造体の開始ブロック番号 |
BPB_BkBootSec | 50 | 2 | 0x0006 | ブートセクタのコピーが置かれているブロック番号 |
BPB_Reserved | 52 | 12 | . | 予約領域 |
BPB_DrvNum | 64 | 1 | 0x80 | BIOSのINT 0x13で使うドライブ番号 |
BPB_Reserved1 | 65 | 1 | 0x00 | 予約領域 |
BPB_BootSlg | 66 | 1 | 0x29 | 拡張シグネチャ |
BPB_VolID | 67 | 4 | 0x4f0c572f | ボリュームのシリアルナンバー |
BPB_VolLab | 71 | 11 | YET OS | ボリュームラベル |
BPB_FilSysType | 82 | 8 | FAT32 | ファイルシステム種別 |
※: FAT32では常に0 FATの仕様書ではブロックのことをセクタと呼ぶ。
Sec
はSectorの略。
- FAT12, FAT16, FAT32がある
- セクタ = ブロック
- バーティションのブートセクタ(先頭1ブロック)をPRB (Partition Boot Record)といって、メタデータが入る
- PBRの中でもBPB(BIOS Parameter Block)という領域に重要な情報がある。
FAT32 File System Specification
ある一つの完結したFATファイルシステムを論理ボリューム(または論理ドライブ)と呼びます。FATの論理ボリュームは3つまたは4つの領域で構成され、各領域は1個または複数のセクタで構成されます。それぞれの領域はボリューム上に次の順に配置されます。(FATボリュームマップ)
- 予約領域 (ボリュームの構成データ)
- FAT領域 (データ領域の割り当て表)
- ルートディレクトリ領域 (FAT32ボリュームでは存在しない)
- データ領域 (ファイルやディレクトリの内容が格納される)
データ領域は、クラスタという一定のセクタ数(BPB_SecPerClus)のブロックに区切られ、これを単位に各ファイルへのデータ領域の割り当てが行われます。各クラスタはクラスタ番号で識別され、FATの各要素(FATエントリ)は各クラスタと1:1で対応付けされています。FATの値は対応するクラスタの状態を示します。ただし、FATの先頭2エントリ(FAT[0], FAT[1])は予約で、クラスタには結びつけられていません。FAT[2]がデータ領域の先頭クラスタ(クラスタ番号2)に対応します。このように有効なクラスタ番号は2から始まるため、「クラスタ数N」のボリュームにおいて、「有効なクラスタ番号は 2~N+1」、「FATのサイズは N+2エントリ」となります。FATに記録されるデータについては、ファイルとクラスタの結びつけを参照してください。
- ディレクトリエントリという32バイトのデータ構造が配列状に並んだ構造になっている
- ディレクトリエントリの配列は
0x102000
から始まる
FAtファイルシステムのディレクトリエントリの構造
- BPBからルートディレクトリの位置を取得
- 中身をディレクトリエントリの構造に従って読む