¿Cómo los controladores NAND Flash borran páginas individuales de manera eficiente?

Estoy trabajando en un código para administrar un flash NAND y necesito borrar páginas individuales, dado que la unidad borrable más pequeña es un bloque, la única solución que se me ocurre es:

  1. Borrar un bloque reservado
  2. Copiar todo el bloque al reservado
  3. borrar el bloque
  4. Vuelva a copiar el bloque reservado y omita esa página.

Si bien esto funciona bien (no lo he probado mucho, pero debería funcionar en teoría) obviamente es muy lento, me preguntaba cómo los controladores de flash, por ejemplo en memorias USB, manejan el borrado de una sola página de manera eficiente.

¿Por qué necesita borrar la página en lugar de simplemente marcarla como descartada en los metadatos, o es un requisito de eliminación segura?
@ pjc50 porque necesito escribir la página y primero tengo que borrarla.
Los ciclos innecesarios de borrado y escritura agregan desgaste al flash, ¡especialmente si golpeas en un pequeño y pobre bloque reservado todo el tiempo! La respuesta de PJC es correcta: la reasignación extenderá el desgaste y eliminará las operaciones de borrado innecesarias.

Respuestas (2)

Eche un vistazo a este documento de Micron : use un mapeo de bloque lógico a bloque físico. Mantenga un suministro de páginas previamente en blanco y escriba en la siguiente disponible (o una elegida por su algoritmo de nivelación de desgaste).

Eventualmente, casi todos sus bloques están llenos, con algunos agujeros donde las páginas dentro del bloque han sido marcadas como "eliminadas", pero en realidad no borradas. Luego haces tu algoritmo: busca bloques con la mayoría de las páginas eliminadas, copia a la nueva ubicación, borra la ubicación anterior, coloca la ubicación anterior en la lista "libre".

Esto plantea entonces la cuestión de cómo almacenar los datos de mapeo en sí; un enfoque común es extender ligeramente los bloques y colocar los datos de mapeo en el propio bloque (como una "etiqueta"). En el arranque, el controlador puede almacenar en caché parte o la totalidad de la asignación en la RAM. Otro enfoque es usar el flash NOR del propio controlador para almacenar los datos de mapeo.

Como señaló pjc50, el concepto general es que uno evita tener una relación fija entre direcciones lógicas y direcciones físicas. Cada vez que se realiza una solicitud para escribir una página, simplemente use otra página que se sepa que está en blanco y tome nota de que el bloque ahora está almacenado en la nueva ubicación.

Conceptualmente, esto es agradable y fácil. Dependiendo de cuántas páginas mapeadas de forma independiente tenga que manejar, también podría ser relativamente fácil en la práctica (particularmente si la cantidad de páginas mapeadas es lo suficientemente pequeña como para permitirse el lujo de mantener la tabla completa de ubicaciones de página reales en RAM, y puede darse el tiempo de escanear todas las páginas activas y anotar sus ubicaciones en la tabla). Sin embargo, si el número de páginas es grande, puede ser necesario mantener algunas tablas en la memoria flash que estén organizadas de tal manera que encuentren rápidamente el bloque físico particular asociado con una dirección lógica. Intentar retener las ubicaciones de todas las páginas de 512 bytes en una memoria flash de 32 GB, por ejemplo, requeriría alrededor de 256 MB de memoria, e incluso si uno pudiera procesar un millón de páginas por segundo, cargar esa memoria tomaría más de un minuto.

Uno podría, en teoría, tener páginas que contengan la ubicación de otras 128 páginas, tener páginas que contengan la ubicación de 128 de ellas (indirectamente con la ubicación de 16 384 páginas), tener páginas que contengan 128 de esas (2 097 152 páginas) y tener una página que contenga alrededor de 32 de esos (que administrarían 67,108,864 páginas de datos). Para encontrar una página N, use los bits 21-25 del número de página para seleccionar una de las 32 direcciones de página en esa última página mencionada, luego los bits 14-20 para seleccionar una de las 128 direcciones de página en esa, luego los bits 7- 14 para seleccionar una de las 128 direcciones de página en esa, y finalmente los bits 0-6 para seleccionar una página en esa. Voila, uno ahora tiene la dirección de la página que necesita.

Desafortunadamente, este enfoque significa que leer cada página de memoria requiere leer cinco páginas del chip flash y, lo que es peor, escribir cada página de memoria requerirá volver a escribir la página que contiene su dirección, lo que a su vez requerirá volver a escribir la página que contiene la dirección de esa página, que a su vez requerirá volver a escribir la página que contiene la dirección de esa página, etc. Cinco páginas en total. asco

Se pueden mejorar las cosas considerablemente si se permite la posibilidad de que los datos en los mapas de página no necesiten mantenerse absolutamente actualizados si, cada vez que se reemplaza una página, la dirección de la nueva página se escribe en un lugar previamente en blanco en la etiqueta. recuerdo de la página antigua. Tal asignación puede degradar el rendimiento de lectura, ya que un puntero que se supone que debe ir a una página puede apuntar a una versión anterior, que puede apuntar a otra versión anterior, etc., antes de llegar finalmente a la página correcta. Por otro lado, dicha asignación puede mejorar enormemente el rendimiento de escritura.

Por ejemplo, incluso si uno solo permite un único nivel adicional de redirección (lo que significa que si una página se ha movido una vez sin actualizar el puntero principal, el puntero principal debe actualizarse en el siguiente movimiento), la mitad de las escrituras en una página solo requieren escribir una página más una etiqueta, un cuarto requeriría escribir dos páginas más una etiqueta, un ocho requeriría tres páginas más una etiqueta, etc. Una mejora bastante grande en comparación con cada escritura de página dirigida que requiere que se reescriban seis páginas. Si uno permite hasta tres niveles adicionales de direccionamiento indirecto (cada cuarta escritura en un nivel dado requiere una actualización principal), entonces 3/4 de las actualizaciones serán una escritura más una etiqueta, 3/16 serán dos, 3/64 serán tres, y solo 1/64 requerirá más que eso.

Tenga en cuenta que si bien permitir múltiples niveles de redirección puede ralentizar el rendimiento de lectura, esto puede compensarse con creces al almacenar en caché en RAM las direcciones de los bloques usados ​​recientemente. Si se pierde el contenido de una entrada de caché (ya sea porque se desconectó la energía o porque "caducó"), el próximo acceso a su página será más lento de lo normal, pero el uso de etiquetas para las actualizaciones significaría que los datos correctos aún estarían disponibles. encontró.

Diseñar buenos algoritmos para administrar un dispositivo flash es complicado. Aunque Micron parece sugerir que todo el chip sea una "zona" unificada, no creo que sea muy práctico. Como mínimo, debe haber un medio para ubicar la página maestra de indexación. Mi recomendación sería que, en un momento dado, la página maestra de indexación se limite a uno de un número relativamente pequeño de bloques. Las ubicaciones de esos bloques deben mantenerse en uno de los pocos bloques supermaestros que se dedican a ese propósito. Cada pocos cientos de veces que la página maestra de indexación ha pasado por sus bloques asignados, se debe elegir un nuevo conjunto de bloques para ella y los bloques supermaestros se deben actualizar para reflejar eso. La cantidad de bloques supermaestros sería lo suficientemente pequeña como para que el sistema pudiera examinarlos todos al inicio, y el número de bloques maestros enumerados en el bloque supermaestro activo sería lo suficientemente pequeño como para que el sistema pudiera examinarlos todos. Dado que podría haber miles de cambios en el bloque maestro para cada bloque supermaestro, no debería haber ningún problema con el desgaste de este último.