# NVM Express

NVM Express (NVMe) o la especificación de interfaz de controlador de host de memoria no volátil (NVMHCIS) es una especificación abierta de interfaz de dispositivo lógico para acceder a medios de almacenamiento no volátiles conectados a través de un bus PCI Express (PCIe). El acrónimo NVM significa memoria no volátil, que a menudo es memoria flash NAND que viene en varios factores de forma física, incluidas unidades de estado sólido (SSD), tarjetas adicionales PCI Express (PCIe), tarjetas M.2 y otras formas NVM Express, como interfaz de dispositivo lógico, ha sido diseñado para aprovechar la baja latencia y el paralelismo interno de los dispositivos de almacenamiento de estado sólido.
Por su diseño, NVM Express permite que el hardware y el software del host exploten por completo los niveles de paralelismo posibles en los SSD modernos. Como resultado, NVM Express reduce la sobrecarga de E/S y ofrece varias mejoras de rendimiento en relación con las interfaces de dispositivos lógicos anteriores, incluidas múltiples colas de comandos largas y latencia reducida. (Los protocolos de interfaz anteriores se desarrollaron para su uso con unidades de disco duro (HDD) mucho más lentas donde existe un retraso muy largo (en relación con las operaciones de la CPU) entre una solicitud y transferencia de datos, donde las velocidades de datos son mucho más lentas que las velocidades de RAM, y donde el disco, la rotación y el tiempo de búsqueda dan lugar a nuevos requisitos de optimización.
Los dispositivos NVM Express están disponibles principalmente en forma de tarjetas de expansión PCI Express de tamaño estándar y como dispositivos de factor de forma de 2.5 pulgadas que proporcionan una interfaz PCI Express de cuatro carriles a través del conector U.2 (anteriormente conocido como SFF- 8639). Sin embargo, también hay dispositivos de almacenamiento que utilizan SATA Express y la especificación M.2 que admiten NVM Express como interfaz de dispositivo lógico. Estos se han convertido recientemente en un caso de uso popular para NVMe y se están convirtiendo rápidamente en la forma dominante de almacenamiento de estado sólido para computadoras de escritorio y portátiles.

## Especificaciones

Las especificaciones para NVMe lanzadas hasta la fecha incluyen:
* 1.0e (enero de 2013)
* 1.1b (julio de 2014)
* 1.2 (noviembre de 2014)
** 1.2a (octubre de 2015)
** 1.2b (junio de 2016)
** 1.2.1 (junio de 2016)
* 1.3 (mayo de 2017)
** 1.3a (octubre de 2017)
** 1.3b (mayo de 2018)
** 1.3c (mayo de 2018)
** 1.3d (marzo de 2019)
* 1.4 (junio de 2019)
** 1.4a (marzo de 2020)
** 1.4b (septiembre de 2020)
** 1.4c (junio de 2021)
* 2.0 (mayo de 2021)
** 2.0a (julio de 2021)
** 2.0b (enero de 2022)
** 2.0c (octubre de 2022)
El cambio principal entre 1.2 y 1.3 y las nuevas características son:
* Identificar la lista de retorno del espacio de nombres de identificadores de espacio de nombres
** Una lista de estructuras de descriptor de identificación de espacio de nombres se devuelve al host para el espacio de nombres especificado.
Se han agregado una serie de diferencias y características opcionales, que incluyen: autocomprobación del dispositivo, desinfección, directivas, partición de arranque, telemetría, mejoras de virtualización, mejoras de administración de NVMe-MI, administración térmica controlada por el host, marca de tiempo, mejora del rendimiento del controlador emulado, junto con ver una serie de cambios con respecto al comportamiento anterior.

## Antecedentes

Históricamente, la mayoría de los SSD usaban buses como SATA, SAS o Fibre Channel para interactuar con el resto de un sistema informático. Desde que los SSD estuvieron disponibles en los mercados masivos, SATA se ha convertido en la forma más típica de conectar SSD en computadoras personales; sin embargo, SATA fue diseñado principalmente para interactuar con unidades de disco duro mecánicas (HDD), y se volvió cada vez más inadecuado para SSD, lo que mejoró en velocidad con el tiempo. Por ejemplo, dentro de aproximadamente 5 años de la adopción generalizada del mercado masivo (2005–2010) muchos SSD ya se vieron retenidos por las velocidades de datos comparativamente lentas disponibles para los discos duros, a diferencia de los discos duros, algunos SSD están limitados por el rendimiento máximo de SATA.
Las SSD de gama alta se habían creado utilizando el bus PCI Express antes de NVMe, pero utilizando interfaces de especificación no estándar. Al estandarizar la interfaz de los SSD, los sistemas operativos solo necesitan un controlador para funcionar con todos los SSD que cumplan con la especificación. También significa que cada fabricante de SSD no tiene que usar recursos adicionales para diseñar controladores de interfaz específicos. Esto es similar a cómo los dispositivos de almacenamiento masivo USB están diseñados para seguir la especificación de clase de dispositivo de almacenamiento masivo USB y funcionan con todas las computadoras, sin necesidad de controladores por dispositivo.

## Historia

Los primeros detalles de un nuevo estándar para acceder a la memoria no volátil surgieron en el Intel Developer Forum 2007, cuando se mostró NVMHCI como el protocolo del lado del host de un diseño arquitectónico propuesto que tenía el Open NAND Flash Interface Working Group (ONFI) en el lado de los chips de memoria flash. Ese año se formó un grupo de trabajo NVMHCI dirigido por Intel. La especificación NVMHCI 1.0 se completó en abril de 2008 y se lanzó en el sitio web de Intel.
El trabajo técnico en NVMe comenzó en la segunda mitad de 2009. Las especificaciones NVMe fueron desarrolladas por NVM Express Workgroup, que consta de más de 90 compañías; Amber Huffman de Intel fue la presidenta del grupo de trabajo. La versión 1.0 de la especificación se lanzó el 01 de marzo de 2011, mientras que la versión 1.1 de la especificación se lanzó el 11 de octubre de 2012. Las principales características agregadas en la versión 1.1 son E/S de múltiples rutas (con espacio de nombres compartido) y E/S de dispersión de longitud arbitraria. Se espera que las futuras revisiones mejoren significativamente la gestión del espacio de nombres. Debido a su enfoque de características, NVMe 1.1 inicialmente se llamó "Enterprise NVMHCI". En enero de 2013 se lanzó una actualización para la especificación básica de NVMe, llamada versión 1.0e. En junio de 2011, se formó un Grupo Promotor liderado por siete compañías.
Los primeros chipsets NVMe disponibles comercialmente fueron lanzados por Integrated Device Technology (89HF16P04AG3 y 89HF32P08AG3) en agosto de 2012. La primera unidad NVMe, la unidad empresarial XS1715 de Samsung, se anunció en julio de 2013; Según Samsung, esta unidad admite una velocidad de lectura de 3 GB/s, seis veces más rápidas que sus ofertas empresariales anteriores. La familia de controladores LSI SandForce SF3700, lanzada en noviembre de 2013, también es compatible con NVMe. En el Consumer Electronics Show 2014 se presentó un producto "prosumidor" de Kingston HyperX que utilizaba este controlador y prometía un rendimiento similar. En junio de 2014, Intel anunció sus primeros productos NVM Express, la familia de SSD para centros de datos que interactúa con el host a través del bus PCI Express, que incluye la serie DC P3700, la serie DC P3600 y la serie DC P3500. A noviembre de 2014, las unidades NVMe están disponibles comercialmente.
En marzo de 2014, el grupo se incorporó para convertirse en NVM Express, Inc., que a noviembre de 2014 consta de más de 65 empresas de toda la industria. Las especificaciones de NVM Express son propiedad y están mantenidas por NVM Express, Inc., que también promueve el conocimiento de la industria de NVM Express como un estándar de toda la industria. NVM Express, Inc. está dirigido por una junta directiva de trece miembros seleccionados del Grupo de Promotores, que incluye a Cisco, Dell, EMC, HGST, Intel, Micron, Microsoft, NetApp, Oracle, PMC, Samsung, SanDisk y Seagate.
En septiembre de 2016, la Asociación CompactFlash anunció que lanzaría una nueva especificación de tarjeta de memoria, CFexpress, que usa NVMe.

## Factores de forma

Hay muchos factores de forma de la unidad de estado sólido NVMe, como AIC, U.2, U.3, M.2, etc.

### AIC (Add in card)

Casi todas las primeras unidades de estado sólido NVMe son HHHL o FHHL AIC, con una interfaz PCIe 2.0 o 3.0. Una unidad de estado sólido HHHL AIC NVMe es fácil de adaptar para insertar en el zócalo PCIe de un servidor.

### U.2 (SFF-8639)

U.2 anteriormente conocido como SFF-8639, es una interfaz de computadora para conectar unidades de estado sólido a una computadora. Utiliza hasta cuatro carriles PCI Express. Un servidor Dell PowerEdge R730xd puede combinar hasta 4 unidades de estado sólido NVMe U.2. Otros proveedores de servidores como HPE, IBM, Inspur y Supermicro tienen el mismo tipo de soporte de producto para unidades de estado sólido U.2 NVMe.

### U.3 (SFF-8639)

U.3 se basa en la especificación U.2 y utiliza el mismo conector SFF-8639. Es un estándar 'Tri-modo', que combina el soporte SAS, SATA y NVMe en un solo controlador. U.3 también puede admitir el intercambio en caliente entre las diferentes unidades donde el soporte de firmware está disponible. Las unidades U.3 siguen siendo compatibles con versiones anteriores de U.2, pero las unidades U.2 no son compatibles con hosts U.3.

### M.2

M.2, anteriormente conocido como Factor de forma de próxima generación ( NGFF ), utiliza un bus de computadora con unidad de estado sólido M.2 NVMe. Las interfaces proporcionadas a través del conector M.2 son PCI Express 3.0 o PCI Express 4.0 (hasta cuatro carriles ).

## NVMe-oF

NVM Express over Fabrics (NVMe-oF) es el concepto de utilizar un protocolo de transporte a través de una red para conectar dispositivos remotos, a diferencia de NVMe, donde los dispositivos están conectados directamente al bus PCIe (o a través de un conmutador PCIe a un bus PCIe) en septiembre de 2014, se propuso un estándar para usar NVMe sobre Fibre Channel (FC) y esta combinación a menudo se denomina FC-NVMe (o, a veces, NVMe/FC). NVMe-oF es un protocolo de comunicación que permite que un ordenador acceda a dispositivos de almacenamiento de nivel de bloque conectados a otro ordenador a través del acceso directo a memoria remota a través de varios protocolos de transporte:
* FC, FC-NVMe
* TCP, NVMe / TCP
* Ethernet, RoCE (sobre Ethernet convergente ) e iWARP (sobre Ethernet tradicional)
* InfiniBand, NVMe sobre InfiniBand
* Otros protocolos de transporte de próxima generación.
El estándar para NVMe sobre Fabrics fue publicado por NVM Express, Inc. en 2016.
Los siguientes controladores implementan el protocolo NVMe-oF:
* El iniciador Linux NVMe-oF y los controladores de destino
* El iniciador NVMe-oF de Storage Performance Development Kit (SPDK) y los controladores de destino
* Un controlador iniciador NVMe-oF para Microsoft Windows
Comenzando con Linux Kernel 5.0, se agregó soporte nativo para NVMe / TCP.

## Comparación con AHCI

La interfaz de controlador de host avanzado (AHCI) tiene el beneficio de una amplia compatibilidad de software, pero tiene la desventaja de no ofrecer un rendimiento óptimo cuando se usa con SSD conectados a través del bus PCI Express. Como interfaz lógica, AHCI se desarrolló cuando el propósito de un adaptador de bus host (HBA) en un sistema era conectar el subsistema de CPU/memoria con un subsistema de almacenamiento mucho más lento basado en medios magnéticos giratorios. Como resultado, AHCI introduce ciertas ineficiencias cuando se usa con dispositivos SSD, que se comportan mucho más como DRAM que como medios giratorios.
La interfaz del dispositivo NVMe se ha diseñado desde cero, aprovechando la baja latencia y el paralelismo de los SSD PCI Express y complementando el paralelismo de las CPU, plataformas y aplicaciones contemporáneas. En un alto nivel, las ventajas básicas de NVMe sobre AHCI se relacionan con su capacidad para explotar el paralelismo en el hardware y software del host, que se manifiesta por las diferencias en las profundidades de la cola de comandos, la eficiencia del procesamiento de interrupciones, la cantidad de accesos de registro que no se pueden almacenar en caché, etc. en varias mejoras de rendimiento. $^{:17–18}$
La siguiente tabla resume las diferencias de alto nivel entre las interfaces de dispositivo lógico NVMe y AHCI.
Comparación de alto nivel de AHCI y NVMe :
| | AHCI | NVMe |
| Profundidad máxima de cola | Una cola de comando; 32 comandos por cola | 65535 colas; 65536 comandos por cola |
| Accesos de registro no almacenables en caché (2000 ciclos cada uno) | Seis por comando no en cola; nueve por comando en cola | Dos por comando |
| MSI-X e interrupciones de dirección | Una sola interrupción; sin dirección | 2048 interrupciones MSI-X |
| Paralelismo y múltiples hilos | Requiere bloqueo de sincronización emitir un comando | Sin bloqueo |
| Eficiencia para comandos de 4 KB | Los parámetros del comando requieren dos recuperaciones DRAM de host serializadas | Obtiene los parámetros del comando en una búsqueda de 64 bytes |

## Soporte del sistema operativo
### Chrome OS

    El 24 de febrero de 2015, se agregó soporte para el arranque desde dispositivos NVM Express al sistema operativo Chrome.

### DragonFly BSD

    La primera versión de DragonFly BSD con soporte NVMe es la versión 4.6.

### FreeBSD

    Intel patrocinó un controlador NVM Express para las cabeceras de FreeBSD y las sucursales estables / 9. Los controladores nvd (4) y nvme (4) están incluidos en la configuración del núcleo GENERIC de forma predeterminada desde FreeBSD versión 10.2 en 2015.

### Genode

    El soporte para NVMe de grado de consumo se agregó al marco Genode como parte de la versión 18.05.

### Haiku

    Haiku obtuvo soporte para NVMe el 18 de abril de 2019.

### illumos

    illumos recibió soporte para NVMe el 15 de octubre de 2014.

### iOS

    Con el lanzamiento del iPhone 6S y 6S Plus, Apple presentó la primera implementación móvil de NVMe sobre PCIe en teléfonos inteligentes. Apple siguió estos lanzamientos con el lanzamiento del iPad Pro y el iPhone SE que también usan NVMe sobre PCIe.

### Linux

    Intel publicó un controlador NVM Express para Linux el 3 de marzo de 2011, que se fusionó con la línea principal del núcleo Linux el 18 de enero de 2012 y se lanzó como parte de la versión 3.3 del núcleo Linux el 19 de marzo de 2012.

### NetBSD

    NetBSD agregó soporte para NVMe en NetBSD 8.0. La implementación se deriva de OpenBSD 6.0.

### OpenBSD

    El trabajo de desarrollo requerido para admitir NVMe en OpenBSD se inició en abril de 2014 por un desarrollador sénior anteriormente responsable del soporte USB 2.0 y AHCI. El soporte para NVMe se ha habilitado en OpenBSD Versión 6.0.

### macOS

    En la actualización 10.10.3 para OS X Yosemite, Apple presentó soporte para NVM Express. La Retina MacBook y la MacBook Pro 2016 usan NVMe sobre PCIe como la interfaz lógica del dispositivo.

### Solaris

    Solaris recibió soporte para NVMe en Oracle Solaris 11.2.

### VMware

    Intel ha proporcionado un controlador NVMe para VMware, que se incluye en vSphere 6.0 y versiones posteriores, que admite varios dispositivos NVMe. A partir de la actualización 1 de vSphere 6, el subsistema de almacenamiento definido por software VSAN de VMware también es compatible con dispositivos NVMe.

### Windows

    Microsoft agregó soporte nativo para NVMe a Windows 8.1 y Windows Server 2012 R2. Los controladores nativos para Windows 7 y Windows Server 2008 R2 se han agregado en las actualizaciones.
    OpenFabrics Alliance mantiene un controlador de Windows NVMe de código abierto para Windows 7/8/8.1 y Windows Server 2008R2/2012/2012R2, desarrollado a partir del código de referencia presentado por varias compañías promotoras en el grupo de trabajo NVMe, específicamente IDT, Intel y LSI. La versión actual es 1.5 de diciembre de 2016.

## Soporte de software
### QEMU

    NVMe es compatible con QEMU desde la versión 1.6 lanzada el 15 de agosto de 2013.

### UEFI

    Un controlador NVMe de código abierto para UEFI está disponible en SourceForge.

## Herramientas administrativas
### nvmecontrol

La herramienta nvmecontrol se usa para controlar un disco NVMe desde la línea de comandos en FreeBSD. Fue agregado en FreeBSD 9.2.

### nvme-cli

Herramientas de espacio de usuario NVM-Express para Linux.