現在、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 -s1
1 MiB でFAT あたり 6 つのセクターを割り当てる計算:
- 私たちは忘れるクラスター以外の構造は、すべてのスペースがクラスターに使用されているかのように扱われます。
-S512 -s1
クラスターでは0.5 KiBです。1 MiBには、そのようなクラスターがちょうど2 Ki格納されます。この計算では、クラスターの数は膨らんだ厳密な値に関して。 - FAT12では、1つのエントリは12ビット(3バイトあたり2エントリ)を占めるので、1.5Bです。クラスタごとに1つのエントリが必要です。2Kiのエントリは3KiBを占めます。したがって、FATは3KiBを占めるはずであり、この数字も膨らんだ。
- 1セクターは0.5KiBです。3KiBを保持するには6セクターが必要です。3KiBはやや膨らんでいるため、せいぜい6つのセクター。
ツールはこの数値をより厳密に計算します。
FAT の数 ( -f
) はほとんど問題になりません。クラスターが別々の FAT に分割されるわけではありません。追加の FAT は単なるコピーであり、それぞれがすべてのクラスターに引き続き機能します。FAT が増えるとスペースがさらに必要になるため、クラスターの数はわずかに減少します。ファイルシステムの「しきい値サイズ」によっては、この現象が FAT あたりのセクター数に影響します。ただし、1 MiB の場合、-S512 -s1
FAT あたりの必要なセクター数は 6 です-f
(注: 私のテストでは、mkfs.vfat
4 つ以上の 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}'
1536k
9 を取得するための最小サイズではないことに注意してください。私のテストで1389k
は 9 が返され、 8 が返されました。これで、数値が1388k
どのように影響するかがわかります。 (デフォルト値) では 9 が返され、8 が返されます。 では9 が返され、8 が返されます。-f
1389k
-f2
-f3
1388k
-f1
-f2
私のテストベッド:
- デビアンGNU/Linux9
mkfs.vfat
シンボリックリンクとしてmkfs.fat
mkfs.fat
バージョン: 4.1 (2017-01-24)
参考文献:
- FATファイルシステムAndries Brouwer 著
(2002 年のものですが、FAT12 はそれ以来大きく変わっていないと思います) - FATファイルシステムの設計ウィキペディアで