ファイルとファイルシステム - 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の略。

FAT

  • FAT12, FAT16, FAT32がある
  • セクタ = ブロック
  • バーティションのブートセクタ(先頭1ブロック)をPRB (Partition Boot Record)といって、メタデータが入る
  • PBRの中でもBPB(BIOS Parameter Block)という領域に重要な情報がある。

FAT32 File System Specification

FATボリューム

ある一つの完結したFATファイルシステムを論理ボリューム(または論理ドライブ)と呼びます。FATの論理ボリュームは3つまたは4つの領域で構成され、各領域は1個または複数のセクタで構成されます。それぞれの領域はボリューム上に次の順に配置されます。(FATボリュームマップ)

  1. 予約領域 (ボリュームの構成データ)
  2. FAT領域 (データ領域の割り当て表)
  3. ルートディレクトリ領域 (FAT32ボリュームでは存在しない)
  4. データ領域 (ファイルやディレクトリの内容が格納される)

クラスタ

データ領域は、クラスタという一定のセクタ数(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ファイルシステムのディレクトリエントリの構造
Screen Shot 2022-07-30 at 9 29 44 Screen Shot 2022-07-30 at 9 33 12

ボリュームを読み出す

  1. BPBからルートディレクトリの位置を取得
  2. 中身をディレクトリエントリの構造に従って読む
⚠️ **GitHub.com Fallback** ⚠️