# YAFFS

YAFFS (de sus siglas inglés: Yet Another Flash File System, Sólo otro sistema de ficheros flash) es el primer sistema de ficheros que fue diseñado específicamente para Memoria Flash NAND, fue ideado por Charles Manning para la compañía Aleph One.
Es un sistema de ficheros de registros con soporte a transacciones que automáticamente provee wear leveling para prolongar la vida útil de las memorias Flash y robustez ante fallos de energía. Además funciona bien sobre grandes dispositivos Flash, en términos de tiempo de inicio y uso de RAM. Se usa actualmente en productos como Linux o WinCE, que ha probado ser realmente fiable. Una variante llamada "YAFFS/Direct" se usa en situaciones donde no hay sistema operativo, sino que hay un sistema operativo empotrado o son sistemas empotrados sin SO: tiene el mismo núcleo como sistema de ficheros pero una interfaz mucho más simple para el sistema operativo y el hardware NAND de la flash.
El sistema de ficheros se publica con licencia GPL y la licencia por producto de Aleph One.

## Diseño

El diseño de YAFFS tienen como prioridades las siguientes cuestiones:
* Memoria Flash NAND como soporte fundamental.
* Robustez a través de las estrategias de registro.
* Reducir significativamente la sobrecarga de RAM y los tiempos de inicio derivados de JFFSx.
Los datos de un fichero son almacenados en "trozos" consistentes con el tamaño de una página (por ej. 512B). Cada página es marcada con un identificador de fichero y un número de trozo, los números de trozo se numeran como 1, 2, 3, etc., siendo 0 la cabecera. Estas etiquetas son almacenadas en la región de datos dispersos de la memoria Flash. El número de trozo se determina dividiendo la posición del fichero por el tamaño de trozo.
Cada página dentro de un bloque debe escribirse en orden secuencial, y cada página se debe escribir una sola vez.
Cuando los datos son sobrescritos, los trozos relevantes son reemplazados por nuevas páginas escritas conteniendo los nuevos datos pero las mismas etiquetas. Los datos sobrescritos se marcan como "descartados". Las cabeceras de los ficheros son almacenados en una única página, marcada para ser diferenciada de las demás. Un bloque con sólo páginas descartadas es un bloque sucio candidato para la recolección de basura. En otro caso, las páginas válidas pueden ser copiadas a un solo bloque para que todo un bloque sucio puede ser utilizado en la recolección de basura.

## Versiones

YAFFS tiene dos versiones con las siguientes limitaciones:
YAFFS1:
* 2$^{18}$ ficheros (> 260.000)
* Tamaño máximo de fichero de 2$^{20}$ (512 MiB)
* Tamaño máximo del sistema de ficheros: 1 GiB
YAFFS2:
* Tamaño máximo del sistema de ficheros: 8 GiB

## Ventajas

Además de esa reducción de limitaciones en YAFFS2 se obtienen los siguientes beneficios:
* Añade soporte a páginas de 2KB en vez de 512B.
* Habilidad para explotar programación de página simultánea en varios chips.
* Mejora las prestaciones (escritura:1.5x a 5x, borrado: 4x, recolección de basura: 2x).
* Puede soportar partes MLC de Toshiba/Sandisk.
* Menor huella en RAM (aproximadamente 25% a 50% sobre YAFFS1).
A diferencia de JFFSx, soporta dispositivos, enlaces duros y simbólicos, y tuberías.