FAT関連メモ・続き

  • 各FAT仕様におけるディスク容量の最大値

 各FATにおいて、
 0x000 = 未使用、0x001 = 予約、0xFF7 = 不良クラスタ、0xFF8〜0xFFF = 終端
 となっているので、実際に利用可能なクラスタは、0xFF5個。
 よって、各FAT仕様における最大クラスタ数は、以下の通りになる(はず)

    • FAT12 = 0x0FF5 → 4,085(切り上げ 4096=4KiB)
    • FAT16 = 0xFFF5 → 65,525(切り上げ 65536=64KiB)
    • FAT32 = 0x0FFFFFF5 → 268,435,445(切り上げ 268,435,456=256MiB)

 それぞれにクラスタサイズを乗算した論理的な最大値を表にしてみる
 (とは言っても、端数が分かり辛いので、全部、切り上げて考える)

クラスタサイズ FAT12 FAT16 FAT32
0x01=512Byte 2MiB 32Mi 128GiB
0x02=1KiB 4MiB 64MiB 256GiB
0x04=2KiB 8MiB 128MiB 512GiB
0x08=4KiB 16MiB 256MiB 1TiB
0x10=8KiB 32MiB 512MiB 2TiB
0x20=16KiB 64MiB 1GiB 4TiB
0x40=32KiB 128MiB 2GiB 8TiB
0x80=64KiB 256MiB 4GiB 16TiB


 FAT32の論理的な最大値は、16TiBになるはずなのだが、
 総セクタ数が32bitで管理されているので、
 この上限となる2TiBに制限されてしまう。
 (つまり、現実的には、この上限に近付きつつあるわけだ... )

 FAT32が、最大、268,435,445個のクラスタを扱えると言っても、
 これらのクラスタ識別子を管理するテーブルだけでも、
 256MiB * 32bit(4Byte) = 1GiB程度の領域が必要となる。
 あくまで、最大ここまで使えるという事であって、
 実用的な範囲で、バランスを考えて使う必要がありそうだ。
 そこで、クラスタ数を適当に決めて、それぞれの最大容量を考えてみる。
 試しに、クラスタ数を、2のべき乗で用意してみる。

クラスタサイズ 64KiB=FAT16 128KiB 256KiB 512KiB 1MiB 2MiB 4MiB 8MiB
0x01=512Byte 32MiB 64MiB 128MiB 256MiB 512MiB 1GiB 2GiB 4GiB
0x02=1KiB 64MiB 128MiB 256MiB 512MiB 1GiB 2GiB 4GiB 8GiB
0x04=2KiB 128MiB 256MiB 512MiB 1GiB 2GiB 4GiB 8GiB 16GiB
0x08=4KiB 256MiB 512MiB 1GiB 2GiB 4GiB 8GiB 16GiB 32GiB
0x10=8KiB 512MiB 1GiB 2GiB 4GiB 8GiB 16GiB 32GiB 64GiB
0x20=16KiB 1GiB 2GiB 4GiB 8GiB 16GiB 32GiB 64GiB 128GiB
0x40=32KiB 2GiB 4GiB 8GiB 16GiB 32GiB 64GiB 128GiB 256GiB
0x80=64KiB 4GiB 8GiB 16GiB 32GiB 64GiB 128GiB 256GiB 512GiB


 とても綺麗な?表になった気がするけど、
 クラスタサイズを減らした分、クラスタ識別子を倍に増やせば、
 同じ最大値になるのが良く分かる。笑
 FAT16で2GiBのディスクを管理する場合、クラスタサイズが32KiBになるので、
 ここで発生するクラスタギャップによる未使用領域を考えれば、
 FAT32クラスタ数を8倍して512KiBにしたとしても、
 クラスタ管理領域としては、1MiB程で済むので、バランスが良いと考えるのか?
 Windowsでは、先にクラスタ数が決まっていて、
 ディスクの容量に合わせてクラスタサイズを変更しているみたい?
 2MiB以上、4MiB未満辺りの数っぽい。
 MSの資料によると、(http://support.microsoft.com/kb/314463/ja)

    • FAT32 ボリュームのクラスタ サイズを減らして、FAT のサイズが 16 MB から 64 KB を引いた値より大きくなるような値を指定することはできません。

 との事らしい...
 つまり、4,177,920クラスタって事になりますな。
 でも、これは、昔の話だろうから(Windows2000とか)、今はどうなんだろう?
 32bitプログラムか64bitプログラムかって話はあると思うけれど、
 今でも、16bitプログラムの制限とか、気にする必要があるのかなぁ?
 微妙だぁ...