mkfs コマンドを使用して指定された FAT12 ファイルシステムを作成する

mkfs コマンドを使用して指定された FAT12 ファイルシステムを作成する

現在、Linux マシンで OS 開発を行っています。その過程で、ファイル (例: Disk.img) に FAT12 ファイルシステムを作成したいと考えています。次のように mkfs コマンドを使用します。

touch Disk.img
truncate Disk.img -s 1M
mkfs.vfat -F12 Disk.img

16 進エディターで表示すると、「SECTORS_PER_FAT」がデフォルトで 2 になっていることがわかります。これを 9 にしたいのですが、どうすればよいですか?

編集: BIOS パラメータ ブロックには次の情報が含まれています (手動で実行したくないので、代わりに mkfs を使用します)

(これはアセンブリスニペットですhttp://www.brokenthorn.com/Resources/OSDev5.html

bpbBytesPerSector:      DW 512
bpbSectorsPerCluster:   DB 1
bpbReservedSectors:     DW 1
bpbNumberOfFATs:    DB 2
bpbRootEntries:     DW 224
bpbTotalSectors:    DW 2880
bpbMedia:       DB 0xF0
bpbSectorsPerFAT:   DW 9    ;!!!!This is the thing I want to control!!!!
bpbSectorsPerTrack:     DW 18
bpbHeadsPerCylinder:    DW 2
bpbHiddenSectors:   DD 0
bpbTotalSectorsBig:     DD 0
bsDriveNumber:          DB 0
bsUnused:       DB 0
bsExtBootSignature:     DB 0x29
bsSerialNumber:         DD 0xa0a1a2a3
bsVolumeLabel:          DB "MOS FLOPPY "
bsFileSystem:           DB "FAT12   "

ところで... クラスターの総数とクラスターあたりのセクター数によって、FAT のサイズ (セクター数) が自動的に決定されると思います... そのため、BPB で sectors_per_fat を定義するのは冗長になる可能性があります... つまり、任意の値を取ることはできないということです...

答え1

'SECTORS_PER_FAT' はデフォルトで 2 になっています。これを 9 にしたいのですが、どうすればよいですか?

この数は自動的に計算されるようです。ファイル アロケーション テーブルにはクラスターごとに 1 つのエントリがあり、クラスターの数は有限で事前にわかっているため、FAT にさらに多くのセクターを割り当てる意味はありません。

あなたの場合、2 は「デフォルト」ではなく、ファイルシステムのサイズ ( のサイズDisk.img) とクラスターのサイズによって主に決まります。

最小のクラスタ サイズ(つまり、最小の論理セクター サイズ ( -S512) とクラスターあたりの最小のセクター数 ( -s1))を取得します。

# 'touch' is not needed, 'truncate' is enough
truncate Disk.img -s 1M
mkfs.vfat -F12 -S512 -s1 Disk.img
# the below line extracts the value we're after
<Disk.img od -j22 -N2 -tu2 | awk 'NR==1{print $2}'

これにより、指定されたファイル サイズの最大クラスター数、つまり FAT 内の最大エントリ数、最大 FAT サイズ、つまり FAT あたりに必要な最大セクター数がわかります。それでも、6 個だけです。

理論上は、正式にセクターを追加割り当てすれば、ファイルシステムは有効になると思います。ポイントは、すべてのクラスターがすでにこれらの 6 つのセクターのエントリでカバーされているため、FAT 内の追加セクターが使用されることはないということです。実際には、mkfs.vfatこのようにセクターを無駄にすることはありません。


粗い-S512 -s11 MiB でFAT あたり 6 つのセクターを割り当てる計算:

  1. 私たちは忘れるクラスター以外の構造は、すべてのスペースがクラスターに使用されているかのように扱われます。-S512 -s1クラスターでは0.5 KiBです。1 MiBには、そのようなクラスターがちょうど2 Ki格納されます。この計算では、クラスターの数は膨らんだ厳密な値に関して。
  2. FAT12では、1つのエントリは12ビット(3バイトあたり2エントリ)を占めるので、1.5Bです。クラスタごとに1つのエントリが必要です。2Kiのエントリは3KiBを占めます。したがって、FATは3KiBを占めるはずであり、この数字も膨らんだ
  3. 1セクターは0.5KiBです。3KiBを保持するには6セクターが必要です。3KiBはやや膨らんでいるため、せいぜい6つのセクター。

ツールはこの数値をより厳密に計算します。


FAT の数 ( -f) はほとんど問題になりません。クラスターが別々の FAT に分割されるわけではありません。追加の FAT は単なるコピーであり、それぞれがすべてのクラスターに引き続き機能します。FAT が増えるとスペースがさらに必要になるため、クラスターの数はわずかに減少します。ファイルシステムの「しきい値サイズ」によっては、この現象が FAT あたりのセクター数に影響します。ただし、1 MiB の場合、-S512 -s1FAT あたりの必要なセクター数は 6 です-f(注: 私のテストでは、mkfs.vfat4 つ以上の FAT の作成を拒否しました)。

与えられたファイルシステムのサイズに対してクラスターの数を最大化した後、FAT あたりのセクター数を増やす最も簡単な方法は、ファイルシステムを大きくすることです。1 MiB で 6 個になったので、おそらく 1.5 MiB で 9 個になるでしょう。実際:

truncate Disk.img -s 1536k
mkfs.vfat -F12 -S512 -s1 Disk.img
<Disk.img od -j22 -N2 -tu2 | awk 'NR==1{print $2}'

1536k9 を取得するための最小サイズではないことに注意してください。私のテストで1389kは 9 が返され、 8 が返されました。これで、数値が1388kどのように影響するかがわかります。 (デフォルト値) では 9 が返され、8 が返されます。 では9 が返され、8 が返されます。-f1389k -f2-f31388k -f1-f2


私のテストベッド:

  • デビアンGNU/Linux9
  • mkfs.vfatシンボリックリンクとしてmkfs.fat
  • mkfs.fatバージョン: 4.1 (2017-01-24)

参考文献:

  1. FATファイルシステムAndries Brouwer 著
    (2002 年のものですが、FAT12 はそれ以来大きく変わっていないと思います)
  2. FATファイルシステムの設計ウィキペディアで

関連情報