FAT12/16/32について調べてみた。

## この記事について
組み込み会社で新人の私が勉強のために調べて書いた記事となっておりまして、
ストレージをフォーマットするときに出てくる __「FAT16」__ や __「FAT32」__ って何？という人向けにまとめたものです。

## 初めに

__「FAT ファイルシステム」__ とは何かと一言でいうと、__「ストレージにデータを記録・管理することが可能なもの」__ です。

FATの横に書いてある16や32の __「数字」__ は何かというと、ざっくり説明すると __「クラスタ」__ というデータの塊に、住所のようなものを付けるための識別子が __「数字」bit分ありますよ__ ということを示しています。

また簡単に補足だけ伝えると、
ストレージの最大容量が大きなものほど対応するFATの数字も大きなものとなっていたりします。

## FAT12とは
主に __フロッピーディスクの時代によく使われていたフォーマット__ として現在残されているFATファイルシステムです。

 __総クラスタ数__ は __最大4084個__ となり、__クラスタサイズ__ は、__512byteから32KB__ まで使用できます。
総クラスタ数が12bitで管理されているのに対し、総セクタ数は16bitで管理されているため、
__セクタサイズが512byte__ の場合、__扱える容量は32MB__ までとなります。

<img width="550" alt="Sector_1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712966/4741270c-dad7-4950-8834-7162de7abc7c.png">

<!--
__外部記憶装置__ とは、__コンピュータから見た時__ の __主記憶装置以外の記憶装置__ を指します。
-->

::: note

#### [補足] 総クラスタ数の求め方
FATの横に書いてある数字が、何bitのクラスタの識別子を使うか表しているため、
__2 の [bit数] 乗 - 12__ を行うと総クラスタ数が求まります。

FAT12で計算例を示すと、
```math
2^{12}-12 = 4084
```
となります。
:::


___
上記で出てきた、セクタとクラスタについては以下の記事に詳しく書いています。

https://qiita.com/Cente_mw/items/78809f109377c40534f7

## FAT16とは

主に __小容量のストレージ__ で使用されているフォーマットです。

FAT12とは違い、__16bitのクラスタ識別子__ を利用しており
__総クラスタ数__ は、最大で __65,524個__ とかなり増えているものになっています。
クラスタサイズは、FAT12の時と同じく __512byteから32KB__ まで使用できます。
扱える容量は、最大で __2GB__ までとなります。

## FAT32とは

主に __大容量のストレージ__ で使用されているフォーマットです。

FAT32は、FAT16よりも大きい32bitのクラスタ識別子を利用しています。
しかし、__実際使えるのは_上位4bit分の予約領域を除いた28bit__ となっているため
総クラスタ数は、__理論上 268,435,444個__ という大量のクラスタを扱えます。
上記に合わせて、FAT32は32KBまでのクラスタサイズを使用できるので、__最大でおよそ8TBの容量が使用可能となる__ はずなのですが、
総セクタ数を32bit(最大4,294,967,295)で管理しているため、
__セクタサイズが512byteの場合扱える最大容量は「2TB」に制限されています。__

<!-- 

::: note

#### [豆知識] SDカードの種類
SDカードの種類について紹介します。

<details>
  <summary>(クリックしてください)</summary>


実は以下の図のようにSDカードの表面に様々なロゴが所々に書いてあるのですが、それはSDカードの規格を表しているものになっており、これを見れば書き込み速度やデータ容量がわかります。

- __「SDHC」__ と書いてある箇所はファイルシステムの規格別のロゴになっています。
  - 「SD」2GB以下，「SDHC」2GB超～32GB以下，「SDXC」32GB超～2TB以下，「SDUC」2TB超～128TB以下 
- __「➉」__ はスピードクラスといった書き込み性能の違いを表すマーク
  - ２,４,６,１０のクラスがあり、2MB/s,4MB/s,6MB/s,10MB/sの書き込み速度を保証するものとなっています。
- __「∪」__ は、UHSスピードクラスといったUHSインターフェース使用時の書き込み性能を表すマークとなっています。
  - １.３のクラスがあり、10MB/s,30MB/sとなっています。
- __「Ⅰ」__ はUHSバスインターフェイス規格になっています。
  - Ⅰ（UHS-Ⅰ)，Ⅱ（UHS-Ⅱ），Ⅲ（UHS-Ⅲ）

<img width="700" alt="Sector_1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712966/a08fe483-4db4-36c1-b831-c52c5e2e9a7d.png">

</details>

:::

-->

:::note
#### [補足]: 「SDカード」や「USB」は、どのFATでフォーマットされているのか？

__規格を策定している団体または製造メーカーが提供しているフォーマッターでフォーマットするのが良い__ のですが、他のフォーマッターを使用した場合も含め、FATファイルシステムの規格に則り __クラスタ数の範囲によってFATの種類が決まります__。

クラスタ数とFATの対応は以下のようになっております。
-  クラスタ数が4,085以下は、「FAT12」
-  クラスタ数が4,086以上，65,525以下は、「FAT16」
-  クラスタ数が65,526以上は、「FAT32」

クラスタ数で紹介されても馴染みがないと思うのでストレージの容量から簡単に分けると、一般的なフォーマットをする場合の __「FATが対応しているストレージ」__ は以下のようになります。
- __FAT12は、～128MB__
- __FAT16は、2MB～2GB__
- __FAT32は、32MB～2TB(32GB以上から専用フォーマッターが必要)__

<!--
クラスタ数とFATの対応は以下のようになっております。
-  クラスタ数が4,085以下は、「FAT12」
-  クラスタ数が4,086以上，65,525以下は、「FAT16」
-  クラスタ数が65,526以上は、「FAT32」

（セクタサイズを512byte、クラスタサイズを512～32Kバイト）
-->

:::

## 終わりの「ひとこと」
仕事以外の日常生活で、FATファイルシステム自体に触れる機会はそうそう無いですよね。
あったとしても、稀にwindowsの回復ドライブを作る時とか、SDカードを使う時くらいですかね。昔を知らないですがファイルシステムのあり方も時代に合わせて変わってきているんでしょうね。私も時代に合わせて変わった方がいいんでしょうかね。ここら辺は、難しいので一生の課題ということにしておきます。

この記事の次は、「MBR」について調べようと思います。
もし、よろしければまた見にきてください。

___
## 関連記事

ファイルシステムに関しての記事

https://qiita.com/Cente_mw/items/435458c4c233934d9f51

<!--
次の記事はこちらです。

https://qiita.com/A_Nakajima/private/ed45cfa6be5123279836
-->

組み込み開発技術ブランド「Cente」

https://www.cente.jp/