YAFFS ( Yet Another Flash File System ) es un sistema de archivos diseñado y escrito por Charles Manning para la empresa Aleph One.
YAFFS1 fue la primera versión de este sistema de archivos y fue diseñado para los chips NAND de la época con un tamaño de página de 512 bytes (+ 16 bytes de espacio libre [OOB; Out-Of-Band]). El trabajo comenzó en 2002 y se lanzó por primera vez ese mismo año. El trabajo inicial fue patrocinado por Toby Churchill Ltd y Brightstar Engineering.
Estos chips más antiguos también suelen permitir 2 o 3 ciclos de escritura por página. [1] YAFFS aprovecha esto: las páginas sucias se marcan escribiendo en un byte de área libre específico. Los chips flash NAND más nuevos tienen páginas más grandes, primero páginas de 2K (+ 64 bytes OOB), luego 4K, con requisitos de escritura más estrictos. Cada página dentro de un bloque de borrado (128 kilobytes) debe escribirse en orden secuencial, y cada página debe escribirse solo una vez. [ cita requerida ]
El diseño de un sistema de almacenamiento que aplique una "regla de escritura única" ("propiedad de escritura única") tiene varias ventajas. [2]
YAFFS2 fue diseñado para adaptarse a estos chips más nuevos. Se basó en el código fuente de YAFFS1, con la principal diferencia de que las estructuras internas no están fijadas para asumir un tamaño de 512 bytes, y se coloca un número de secuencia de bloque en cada página escrita. De esta manera, las páginas más antiguas se pueden sobrescribir de manera lógica sin violar la regla de "escribir una vez". Se lanzó a fines de 2003.
YAFFS es un sistema de archivos robusto con estructura de registro que considera la integridad de los datos como una prioridad alta. Un objetivo secundario de YAFFS es el alto rendimiento. YAFFS normalmente superará a la mayoría de las alternativas. [3] También está diseñado para ser portátil y se ha utilizado en Linux , WinCE , pSOS , RTEMS , eCos , ThreadX y varios sistemas operativos especiales. Una variante 'YAFFS/Direct' se utiliza en situaciones en las que no hay sistema operativo, sistemas operativos integrados o cargadores de arranque: tiene el mismo sistema de archivos central pero una interfaz más simple tanto con el código de nivel superior e inferior como con el hardware flash NAND.
El código base de YAFFS está licenciado bajo la GPL y bajo licencias por producto disponibles en Aleph One.
YAFFS está bloqueado por partición a un alto nivel, lo que permite que solo un hilo escriba en un momento dado. [4]
No existe un procedimiento especial para inicializar un sistema de archivos YAFFS más allá de simplemente borrar la memoria flash. Cuando se encuentra un bloque defectuoso, YAFFS sigue el esquema de medios inteligentes de marcar el quinto byte del área libre del bloque. Los bloques marcados como tales permanecen sin asignar a partir de ese momento. [ aclaración necesaria ]
Para escribir datos de archivo, YAFFS escribe inicialmente una página completa (fragmento en la terminología de YAFFS) que describe los metadatos del archivo , como las marcas de tiempo , el nombre, la ruta, etc. Al nuevo archivo se le asigna un número de identificación de objeto único; cada fragmento de datos dentro del archivo contendrá este identificador de objeto único dentro del área libre. YAFFS mantiene una estructura de árbol en RAM de la ubicación física de estos fragmentos. Cuando un fragmento ya no es válido (el archivo se elimina o se sobrescriben partes del archivo), YAFFS marca un byte particular en el área libre del fragmento como "sucio". Cuando un bloque completo (32 páginas) se marca como sucio, YAFFS puede borrar el bloque y recuperar el espacio. Cuando el espacio libre del sistema de archivos es bajo, YAFFS consolida un grupo de páginas buenas en un nuevo bloque. Luego, YAFFS recupera el espacio utilizado por las páginas sucias dentro de cada uno de los bloques originales.
Cuando un sistema YAFFS monta un dispositivo flash NAND , debe visitar cada bloque para comprobar si hay datos válidos escaneando su área libre. Con esta información, reconstituye la estructura de datos del árbol residente en la memoria.
YAFFS2 es similar en concepto a YAFFS1 y comparte gran parte del mismo código; la base de código de YAFFS2 admite los formatos de datos de YAFFS1 a través de compatibilidad con versiones anteriores. La principal diferencia es que YAFFS2 necesita superar obstáculos importantes para cumplir con el requisito de "escritura única" de las memorias flash NAND modernas. [5]
YAFFS2 marca cada bloque recién escrito con un número de secuencia que aumenta de forma monótona . La secuencia de los fragmentos se puede inferir a partir del número de secuencia del bloque y el desplazamiento del fragmento dentro del bloque. De este modo, cuando YAFFS2 escanea la memoria flash y detecta varios fragmentos que tienen ObjectID y ChunkNumbers idénticos, puede elegir cuál utilizar tomando el número de secuencia más grande. Por razones de eficiencia, YAFFS2 también introduce el concepto de encabezados reducidos. Por ejemplo, cuando se cambia el tamaño de un archivo a un tamaño más pequeño, YAFFS1 marcará todos los fragmentos afectados como sucios; YAFFS2 no puede hacer esto debido a la regla de "escribir una vez". En su lugar, YAFFS2 escribe un "encabezado reducido", que indica que una cierta cantidad de páginas antes de ese punto no son válidas. Esto permite a YAFFS2 reconstruir el estado final del sistema de archivos cuando el sistema se reinicia.
YAFFS2 utiliza una definición más abstracta de la memoria flash NAND, lo que permite su uso con una variedad más amplia de piezas flash con diferentes geometrías, reglas de manejo de bloques defectuosos, etc.
Posteriormente, YAFFS2 agregó compatibilidad con puntos de control , que omiten el escaneo de montaje normal y permiten tiempos de montaje muy rápidos. El rendimiento variará, pero se han reportado tiempos de montaje de 3 segundos para 2 GB . [ cita requerida ]