YAFFS

YAFFS (Yet Another Flash File System) はCharles Manningによりデザインされ、記述された。所属はAleph Oneであり、ニュージーランドのWhitecliffsにある。
Yaffs1はこのファイルシステムの最初のバージョンであり、512バイトに16バイト(OOB;Out-Of-Band)の予備領域を持たせた当時最新鋭のNANDチップ向けの最初のファイルシステムであった。作業は2002年に開始され、その年の後半に最初にリリースされました。最初の作業は、Toby Churchill LtdとBrightstar Engineeringが後援しました。これらのより古いチップは通常1ページあたり2～3回書き換えることができた。YAFFSにおいて、ダーティーページはマークされ、特定の予備領域に記録された。
より新しいNANDフラッシュはより大きなページを持っている。最初は2048バイト＋64バイト予備領域であり、後に4Kのより大きいページを持ち、後者の方がより書き込み要件が厳しくなります。
消去ブロック（128キロバイト）内の各々のページはシーケンシャルに書き込まなければならず、しかも一度に書き込まなければならない。
「ライトワンスルール」（「ライトワンスプロパティ」）を適用するストレージシステムを設計することには、いくつかの利点があります。
YAFFS2はこれらのより新しいチップに対応するようデザインされた。YAFFS2はYAFFS1のソースコードに基づいていて、大きな違いとしては内部構造は512バイトサイズに固定されておらず、ブロックシーケンス番号は各々の書き込まれたページに置かれている。これにより古いページは「ライトワンス」ルールに違反すること無く論理的に上書きされる。2003年後半にリリースされました。
YAFFSは頑丈なログ構造ファイルシステムであり、データ完全性に高い優先度が設定されている。YAFFSの2番目の目標はハイパフォーマンスである。YAFFSはほとんどの代替よりも通常効率が良いだろう。またポータブルなデザインとなっており、Linux、WinCE、、RTEMS、eCos、ThreadXを始めとして様々な専用目的のOSで使用可能である。変種である「YAFFS/Direct」はOSを持たない環境、組み込みOS、ブートローダで使用され、中枢のファイルシステムとしてだけでなくOSとNANDフラッシュとのシンプルなインターフェイスとしての役割も持つ。
このファイルシステムはGPLおよびAleph Oneとのプロダクトライセンスの両方でライセンスされている。
YAFFS1.
フラッシュメモリを単に消去する以外に、YAFFSファイルシステムを初期化するための特別な手順はない。不良ブロックが検出されると、YAFFSはブロックのスペア領域の5番目のバイトをマークするスマートメディアスキームに従う。そのようにマークされたブロックは、それ以降は未割り当てのままである。
ファイルデータを書き込むために、YAFFSは最初にタイムスタンプ、名前、パスなどのファイルメタデータを説明するページ全体（YAFFS用語ではチャンク）を書き込む。新しいファイルには、一意のオブジェクトID番号が割り当てられ; ファイル内のすべてのデータチャンクには、スペア領域内にこの一意のオブジェクトIDが含まれる。YAFFSは、これらのチャンクの物理的な場所のツリー構造をRAMに維持する。チャンクが無効になると（ファイルが削除されるか、ファイルの一部が上書きされ）、YAFFSはチャンクのスペア領域の特定のバイトを「ダーティ」としてマークする。ブロック全体（32ページ）がダーティとしてマークされている場合、YAFFSはブロックを消去してスペースを再利用できる。 ファイルシステムの空き領域が少ない場合、YAFFSは適切なページのグループを新しいブロックに統合する。 次に、YAFFSは、元の各ブロック内のダーティページによって使用されていたスペースを再利用する。
YAFFSシステムがNANDフラッシュデバイスをマウントする場合、各ブロックにアクセスして、スペア領域をスキャンして有効なデータを確認する必要がある。次に、この情報を使用して、メモリに常駐するツリーデータ構造を再構成する。
YAFFS2.
YAFFS2は概念がYAFFS1に似ており、ほとんど同じコードを共有している; YAFFS2コードベースは、下位互換性を通じてYAFFS1データ形式をサポートする。主な違いは、YAFFS2は、最新のNANDフラッシュの「ライトワンス」要件を満たすために重要なフープを飛び越える必要があることである。
YAFFS2は、新しく書き込まれたすべてのブロックに、単調増加するシーケンス番号をマークする。チャンクのシーケンスは、ブロックシーケンス番号とブロック内のチャンクオフセットから推測できる。これにより、YAFFS2はフラッシュをスキャンし、同一のオブジェクトIDとチャンク番号を持つ複数のチャンクを検出するときに、最大のシーケンス番号を使用してどちらを使用するかを選択できる。効率上の理由から、YAFFS2ではシュリンクヘッダーの概念も導入されている。たとえば、ファイルのサイズが小さいサイズに変更されると、YAFFS1は影響を受けるすべてのチャンクをダーティとしてマークする。YAFFS2は「ライトワンス」ルールのためにこれを行うことができない。 YAFFS2は、代わりに「縮小ヘッダー」を書き込む。これは、その時点より前の特定のページ数が無効であることを示す。これにより、YAFFS2は、システムの再起動時にファイルシステムの最終状態を再構築できる。
YAFFS2は、NANDフラッシュのより抽象的な定義を使用して、さまざまなジオメトリ、不良ブロック処理ルールなどのさまざまなフラッシュパーツで使用できるようにする。
YAFFS2は後でチェックポインティングのサポートを追加した。これは通常のマウントスキャンをバイパスし、非常に高速なマウント時間を可能にする。 パフォーマンスは様々だが、2GBで3秒のマウント時間が報告されている。