# NVM Express

NVM Express (NVMe) o Non-Volatile Memory Host Controller Interface Specification (NVMHCIS) è una specifica aperta di interfacciamento logico ai supporti di memoria non volatile di un computer, solitamente collegati tramite il bus PCI Express. La prima parte del nome, NVM sta per memoria non volatile, che è spesso una memoria flash NAND disponibile in diversi fattori di forma fisica, tra cui unità a stato solido (SSD), schede aggiuntive PCIe e schede M.2, il successore delle schede mSATA. NVM Express, come interfaccia per dispositivi logici, è stata progettata per sfruttare la bassa latenza e il parallelismo interno dei dispositivi di archiviazione a stato solido.
Dal punto di vista dell'architettura, la logica della specifica è archiviata ed eseguita fisicamente all'interno dal chip del controller NVMe che si trova fisicamente insieme al supporto di archiviazione, in genere un SSD. Le modifiche alla versione per NVMe, ad esempio da 1.3 a 1.4, sono incorporate nei supporti di archiviazione e non influiscono sui componenti compatibili con PCIe come schede madri e CPU.
Grazie al suo design, NVM Express consente all'hardware e al software host di sfruttare appieno i livelli di parallelismo possibili nei moderni SSD. Di conseguenza, NVM Express riduce l'overhead I/O e apporta vari miglioramenti delle prestazioni rispetto alle precedenti interfacce di dispositivi logici, tra cui lunghe code di comandi multiple e latenza ridotta. I precedenti protocolli di interfaccia come AHCI sono stati sviluppati per l'uso con dischi rigidi (HDD) molto più lenti in cui esiste un ritardo molto lungo (relativo alle operazioni della CPU) tra una richiesta e il trasferimento dei dati, in cui le velocità dei dati sono molto più lente delle velocità della RAM e dove la rotazione del disco e il tempo di ricerca danno origine a ulteriori esigenze di ottimizzazione.
I dispositivi NVM Express sono principalmente disponibili sotto forma di schede di espansione PCI Express di dimensioni standard e come dispositivi con fattore di forma da 2,5 pollici che forniscono un'interfaccia PCI Express a quattro corsie tramite il connettore U.2 (precedentemente noto come SFF- 8639). I dispositivi di archiviazione che utilizzano SATA Express e la specifica M.2 che supportano NVM Express come interfaccia del dispositivo logico sono un caso d'uso popolare per NVMe e sono diventati la forma dominante di archiviazione a stato solido per server, desktop e laptop.

## Specifiche

Le specifiche per NVMe rilasciate fino ad oggi includono:
* 1.0e (gennaio 2013)
* 1.1b (luglio 2014)
* 1.2 (novembre 2014)
** 1.2a (ottobre 2015)
** 1.2b (giugno 2016)
** 1.2.1 (giugno 2016)
* 1.3 (maggio 2017)
** 1.3a (ottobre 2017)
** 1.3b (maggio 2018)
** 1.3c (maggio 2018)
** 1.3d (marzo 2019)
* 1.4 (giugno 2019)
** 1.4a (marzo 2020)
** 1.4b (settembre 2020)
** 1.4c (giugno 2021)
* 2.0 (maggio 2021)
** 2.0a (luglio 2021)
** 2.0b (gennaio 2022)
** 2.0c (ottobre 2022)

## Formati fisici

Esistono molti form factor delle unità a stato solido NVMe, come AIC, U.2, U.3, M.2 ecc.

### AIC (scheda aggiuntiva)

Quasi tutte le prime unità a stato solido NVMe sono AIC HHHL (mezza altezza, metà lunghezza) o FHHL (altezza intera, metà lunghezza), con un'interfaccia PCIe 2.0 o 3.0. Una scheda per unità a stato solido HHHL NVMe è facile da inserire in uno slot PCIe di un server.

### U.2 (SFF-8639)

U.2, precedentemente noto come SFF-8639, è un'interfaccia per computer per il collegamento di unità a stato solido a un computer. Utilizza fino a quattro corsie PCI Express. I server disponibili possono combinare fino a 48 unità a stato solido U.2 NVMe.

### U.3 (SFF-8639 o SFF-TA-1001)

U.3 è costruito sulla specifica U.2 e utilizza lo stesso connettore SFF-8639. È uno standard "tri-mode", che combina il supporto SAS, SATA e NVMe in un unico controller. U.3 può anche supportare l'hot-swap tra le diverse unità in cui è disponibile il supporto del firmware. Le unità U.3 sono ancora retrocompatibili con U.2, ma le unità U.2 non sono compatibili con gli host U.3.

### M.2

M.2, precedentemente noto come Next Generation Form Factor ( NGFF), utilizza uno specifico bus per computer con unità a stato solido M.2 NVMe. Le interfacce fornite tramite il connettore M.2 sono PCI Express 3.0 o superiore (fino a quattro linee di bus).

### EDSFF

L'Enterprise and Data Center Standard Form Factor o EDSFF e precedentemente noto come Enterprise and Data Center SSD Form Factor è una famiglia di specifiche di dimensioni di SSD per l'uso nei data center sviluppata dal gruppo di lavoro tecnico Small Form Factor Technology Affiliate, che è essa stessa sotto la guida organizzativa della Storage Networking Industry Association.

## NVMe-oF

NVM Express over Fabrics (NVMe-oF) è il concetto di utilizzo di un protocollo di trasporto su una rete per connettere dispositivi NVMe remoti, contrariamente al normale uso di NVMe in cui i dispositivi NVMe fisici sono connessi al bus PCI Express. Ad agosto 2017, uno standard per l'utilizzo di NVMe su Fibre Channel (FC) è stato presentato dall'organizzazione di standardizzazione International Committee for Information Technology Standards (ICITS), e questa combinazione è spesso indicata come FC-NVMe o talvolta NVMe/FC.
A partire da maggio 2021, i protocolli di trasporto NVMe supportati sono:
* FC, FC-NVMe
* TCP, NVMe/TCP
* Ethernet, RoCE v1/v2 (RDMA over converged Ethernet)
* InfiniBand, NVMe over InfiniBand o NVMe/IB
Lo standard per NVMe su Fabrics è stato pubblicato da NVM Express, Inc. nel 2016.

## Supporto dei sistemi operativi
### Chrome OS

    Il 24 febbraio 2015 è stato aggiunto a Chrome OS il supporto per l'avvio da dispositivi NVM Express.

### DragonFly BSD

    La prima versione di DragonFly BSD con supporto NVMe è la versione 4.6.

### FreeBSD

    Intel ha sponsorizzato un driver NVM Express per i rami head e stable/9 di FreeBSD. I driver nvd(4) e nvme(4) sono inclusi nella configurazione del kernel GENERIC per impostazione predefinita a partire dalla versione 10.2 di FreeBSD nel 2015.

### Haiku

    Haiku ha ottenuto il supporto per NVMe il 18 aprile 2019.

### illumos

    illumos ha ricevuto supporto per NVMe il 15 ottobre 2014.

### iOS

    Con il rilascio di iPhone 6S e 6S Plus, Apple ha introdotto la prima implementazione mobile di NVMe su PCIe negli smartphone. Apple ha seguito queste versioni con il rilascio dell'iPad Pro di prima generazione e dell'iPhone SE di prima generazione che utilizzano anche NVMe su PCIe.

### Linux

    Intel ha pubblicato un driver NVM Express per Linux il 3 marzo 2011, che è stato unito al ramo principale del kernel Linux il 18 gennaio 2012 e rilasciato come parte della versione 3.3 del kernel Linux il 19 marzo 2012. Linux supporta NVMe Host Memory Buffer dalla versione 4.13.1 con una dimensione massima predefinita di 128 MB.

### MacOS

    Apple ha introdotto il supporto software per NVM Express in Yosemite 10.10.3. L'interfaccia hardware NVMe è stata introdotta nel MacBook e nel MacBook Pro del 2016.

### NetBSD

    NetBSD ha aggiunto il supporto per NVMe in NetBSD 8.0. L'implementazione è derivata da OpenBSD 6.0.

### OpenBSD

    Il lavoro di sviluppo necessario per supportare NVMe in OpenBSD è stato avviato nell'aprile 2014 da uno sviluppatore senior precedentemente responsabile del supporto USB 2.0 e AHCI. Il supporto per NVMe è stato abilitato in OpenBSD versione 6.0.

### Oracle Solaris

    Solaris ha ricevuto il supporto per NVMe in Oracle Solaris 11.2.

### Microsoft Windows

    Microsoft ha aggiunto il supporto nativo per NVMe a Windows 8.1 e Windows Server 2012 R2 Negli aggiornamenti sono stati aggiunti driver nativi per Windows 7 e Windows Server 2008 R2. Molti fornitori hanno rilasciato i propri driver Windows anche per i propri dispositivi.