# NVM Express

NVM Express (NVMe) ou Non-Volatile Memory Host Controller Interface Specification (NVMHCIS) é uma especificação de interface de dispositivo lógico aberta para acessar mídia de armazenamento não volátil de um computador geralmente conectada via barramento PCI Express (PCIe). O acrônimo NVM significa memória não volátil, que geralmente é memória flash NAND que vem em vários fatores de forma física, incluindo unidades de estado sólido (SSDs), placas complementares PCI Express (PCIe) e placas M.2, a cartões sucessores do mSATA. O NVM Express, como interface de dispositivo lógico, foi projetado para captalizar a baixa latência e o paralelismo interno dos dispositivos de armazenamento de estado sólido.
Arquitetonicamente, a lógica do NVMe é fisicamente armazenada e executada pelo chip controlador NVMe que está fisicamente co-localizado com a mídia de armazenamento, geralmente um SSD. As alterações de versão NVMe, por exemplo, 1.3 para 1.4, são incorporadas à mídia de armazenamento e não afetam os componentes compatíveis com PCIe, como placas-mãe e CPUs.
Por seu design, o NVM Express permite que o hardware e o software do host explorem totalmente os níveis de paralelismo possíveis em SSDs modernos. Como resultado, o NVM Express reduz a sobrecarga de E/S e traz várias melhorias de dezempenho em relação às interfaces de dispositivos lógicos anteriores, incluindo várias filas de comando longas e latência reduzida. Os protocolos de interface anteriores, como o AHCI, foram desenvolvidos para uso com unidades de disco rígido (HDD) muito mais lentas, onde existe um atraso muito longo (relativo às operações da CPU) entre uma solicitação e a transferência de dados, onde as velocidaes de dados são muito mais lentas que as velocidades de RAM e onde rotação do disco e tempo de busca dar origem e outros requisitos de otimização. Os SSDs NVM Express são mais quentes do que os SSDs SATA de 2,5" e podem atingir de forma rápida e fácil temperaturas superiores a 80°C.
Os dispositivos NVM Express estão disponíveis principalmente na forma de placas de expansão PCI Express de tamanho padrão e como dispositivos de fator de forma de 2,5 polegadas que fornecem uma interface PCI Express de quatro vias através do conector U.2 (anteriormente conhecido como SFF-8639). Dispositivos de armazenamento usando SATA Express e a especificação M.2 que suportam NVM Express como interface de dispositivo lógico são um caso de uso popular para NVMe e se tornaram a forma dominante de armazenamento de estado sólido para servidores, desktops e laptops iguais.

## Especificações

As especificações para NVMe lançadas até o momento incluem:
* 1.0e (janeiro de 2013)
* 1.1b (julho de 2014)
* 1.2 (novembro de 2014)
** 1.2a (outubro de 2015)
** 1.2b (junho de 2016)
** 1.2.1 (junho de 2016)
* 1.3 (maio de 2017)
** 1.3a (outubro de 2017)
** 1.3b (maio de 2018)
** 1.3c (maio de 2018)
** 1.3d (março de 2019)
* 1.4 (junho de 2019)
** 1.4a (março de 2020)
** 1.4b (setembro de 2020)
* 2.0 (maio de 2021)
** 2.0a (julho de 2021)
** 2.0b (janeiro de 2022)

## Background

Historicamente, a maioria dos SSDs usava barramentos como SATA, SAS e Fibre channel para fazer interface com o resto de um sistema de computador. Desde que os SSDs se tornaram disponíeis em mercados de massa, o SATA tornou-se a forma mais comum de conectar SSDs em computadores pessoais; no entanto, o SATA foi projetado principalmente para faer interface com discos rígidos mecânicos (HDDS) e tornou-se cada vez mais inadeado para SSDs, que melhoraram a velocidade ao longo do tempo. Por exemplo, em cada cerca de cinco anos deadoção do mercado de massa (2005-2010), muitos SSDs já estavam retidos pelas taxas de dados comparativamente lentas disponíveis para discos rígidos - ao contrário dos discos rígidos, alguns SSDs são limitados pela taxa de transferência máxima de SATA.
SSDs de última geração foram feitos usando o barramento PCI Express antes do NVMe, mas usando interfaces de especificações não padrão. Ao padronizar a interface dos SSDs, os sistemas operacionais precisam apenas de um driver de dispositivo comum para funcionar com todos os SSDs aderentes à especificação. Isso também significa que cada fabricante de SSD não precisa projetar drivers de interface específicos. Isso é semelhante ao modod como os dispositivos de armazenamento em massa USB são criados para seguir a especificação de classe de dispositivo de armazenamento em massa USB e funcionam com todos os computadores, sem a necessidade de drivers por dispositivo.
Dispositivos NVM Express também são usados como o bloco de construção do buffer de armazenamento em muitos supercomputadores líderes, como Fugaku Supercomputer, Summit Supercomputer e Sierra Supercomputer, etc.

## História

Os primeiros detalhes de um novo padrão para acessar memória não volátil surgiram no Intel Developer Forum 2007, quando o NVMHCI foi mostrado como o protocolo do lado do host de um projeto arquitetônico proposto que tinha o Open NAND Flash Interface Working Group (ONFI) na memória (flash) lado dos chips. Um grupo de trabalho NVMHCI liderado pela Intel foi formado naquele ano. A especificação NVMHCI 1.0 foi concluída em abril de 2008 e lançada no site da Intel.
O trabalho técnico no NVMe começou no segundo semestre de 2009. As especificações do NVMe foram desenvolvidas pelo NVM Express Workgroup, que consiste em mais de 90 empresas; Amber Huffman, da Intel, foi a presidente do grupo de trabalho. A versão 1.0 da especificação foi lançada em 1 de maio de 2011, enquanto a versão 1.1 da especificação foi lançada em 11 de outubro de 2012. Os principais recursos adicionais na versão 1.1 são E/S de vários caminhos (com compartilhamento de namespace) e E/S de coleta de dispersão de comprimento arbitrário. Espera-se que as revisões futuras melhorem significativamente o gerenciamento de namespace. Por causa de seu foco em recursos, o NVMe 1.1 foi inicialmente chamado de "Enterprise NVMHCI". Uma atualização para a especificação básica do NVMe, chamada versão 1.0e, foi lançada em janeiro de 2013. Em junho de 2011, o Promoter Group liderado por sete empresas foi formado.
Os primeiros chipsets NVMe comercialmente disponíveis foram lançados pela Integrated Device Technology (89HF16P04AG3 e 89HF32P08AG3) em agosto de 2012. A primeiro unidade NVMe, a unidade empresarial XS1715 da Samsung, foi anunciada em julho de 2013; de acordo com a Samsung, esta unidade suportava velocidades de leitura de 3 GB/s, seis vezes mais rápidas do que suas ofertas corporativas anteriores. A família de controladores LSI SandForce SF3700, lançada em novembro de 2013, também suporta NVMe. Um produto "prosumer" Kingston HyperX usando este controlador foi apresentado na Consumer Electronics Show 2014 e prometeu desempenho semelhante. Em junho de 2014, a Intel anunciou seus primeiros produtos NVM Express, a família de data center Intel SSD que faz inteface com o host por meio do barramento PCI Express, que inclui as séries DC P3700, DC P3600 e DC P3500 Series. A partir de novembro de 2014, as unidades NVMe estão disponíveis comercialmente.
Em março de 2014, o grupo foi incorporado para se tornar NVM Express, Inc., que em novembro de 2014 consiste em mais de 65 empresas de todo o setor. As especificações do NVM Express são de propriedade e mantidas pela NVM Express, Inc., que também promove a conscientização da indústria sobre o NVM Express como um padrão para todo o setor. A NVM Express, Inc. é dirigida por um conselho de administração de treze membros selecionados do Promoter Group, que inclui Cisco, Dell, EMC, HGST, Intel, Micron, Microsoft, NetApp, Oracle, PMC, Samsung, SanDisk e Seagate.
Em setembro de 2016, a CompactFlash Association anunciou que lançaria uma nova especificação de cartão de memória, CFexpress, que usa NVMe.$^[$
NVMe Host Memory Buffer (HMB) adicionado na versão 1.2 da especificação NVMe. O HMB permite que os SSDs utilizem a DRAM do host, o que pode melhorar o desempenho de E/S para SSDs sem DRAM.

## Fatores de forma

Existem muitos fatores de forma da unidade de estado sólido NVMe, como AIC, U.2, U.3, M.2 etc.

### AIC (cartão adicional)

Quase todas as primeiras unidades de estado sólido NVMe são HHHL (meia altura, meio comprimento) ou FHHL (altura total, meio comprimento) AIC, com uma interface PCIe 2.0 ou 3.0. Uma placa de unidade de estado sólido HHHL NVMe é fácil de inserir em um slot PCIe de um servidor.

### U.2 (SFF-8639)

U.2, anteriormente conhecido como SFF-8639, é uma interface de computador para conectar unidades de estado sólido a um computador. Ele usa até quatro pistas PCI Express. Os servidores disponíveis podem combinar até 4 unidades de estados sólido U.2 NVMe.

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

U.3 é construído na especificação U.2 e usa o mesmo conector SFF-8639. É um padrão 'tri-mode', combinando suporte SAS, SATA e NVMe em um único controlador. U.3 também pode oferecer suporte a hot-swap entre as diferentes unidades onde o suporte de firmware está disponível. Unidades U.3 ainda são compatíveis com U.2, mas unidades U.2 não são compatíveis com hosts U.3.

### M.2

M.2, anteriormente conhecido como Next Generation Form Factor (NGFF), usa um barramento de computador de unidade de estado sólido M.2 NVMe. As interfaces fornecidas através do conector M.2 são PCI Express 3.0 ou PCI Express 4.0 (até quatro vias).

## NVMe-oF

NVM Express over Fabrics (NVMe-oF) é o conceito de usar um protocolo de transporte em uma rede para conectar dispositivos NVMe remotos, ao contrário do NVMe comum, onde os dispositivos NVMe físicos sãoconectados a um barramento PCIe diretamente ou por um switch PCIe a um barramento PCIe. Em agosoto de 2017, um padrão para o uso de NVMe sobre Fibre Channel (FC) foi apresentado pela organização de padrões International Committee for Information Technology Standards (ICITS), e essa combinação é frequentemente chamada de FC-NVMe ou às vezes NVMe/FC.
A partir de maio de 2021, os protocolos de transporte NVMe suportados são:
* FC, FC-NVMe
* TCP, NVMe/TCP
* Ethernet, RoCE v1/v2 (RDMA sobre converged Ethernet)
* InfiniBand, NVMe sobre InfiniBand ou NVMe/IB
O padrão NVMe sobre Fabrics foi publicado pela NVM Express, Inc. em 2016.
O software a seguir implemente o protocolo NVMe-oF:
* Iniciador e destino do Linux NVMe-oF. O transporte RoCE foi suportado inicialmente, e com o kernel Linux 5.x, o suporte nativo para TCP foi adicionado.
* Storage Performance Development Kit (SPDK) iniciador NVMe-oF e drivers de destino. Ambos os transportes RoCE e TCP são suportados.
* Iniciador e destino Starwind NVMe-oF para Microsoft Windows, suportando transportes RoCE e TCP.

## Comparação com AHCI

O Advanced Host Controller Interface (AHCI) tem o benefício de ampla compatibilidade de software, mas tem a desvantagem de não oferecer desempenho ideal quando usado com SSDs conectados via barramento PCI Express. Como uma interface de dispositivo lógico, o AHCI foi desenvolvido quando o objetivo de um adaptador de barramento de host (HBA) em um sistema era conectar o subsistema de CPU/memória a um subsistema de armazenamento muito mais lento baseado em mídia magnética rotativa. Como resultado, o AHCI apresenta certas ineficiências quando usado com dispositivos SSD, que se comportam muito mais como RAM do que como mídia giratória.
A interface do dispositivo NVMe foi projetada desde o início, aproveitando a latência e o paralelismo mais baixos dos SSDs PCI Express e complementando o paralelismo de CPUs, plataformas e aplicativos contemporâneos. Em alto nível, as vantagens básicas do NVMe sobre o AHCI estão relacionadas à sua capacidade de explorar o paralelismo no hardware e software do host, manifestado pelas diferenças nas profuncidades da fila de comandos, eficiência do processamento de interrupção, número de acessos a registrador não cacheáveis, etc., resultando em várias melhorias de desempenho.$^{:17–18}$
A tabela abaixo resume as diferenças de alto nível entre as interfaces de dispositivo lógico NVMe e AHCI.
Comparação de alto nível de AHCI e NVMe :
| | AHCI | NVMe |
| Profundidade máxima da fila | Uma fila de comandos; Até 32 comandos por fila | Até 65535 filas; Até 65536 comandos por fila |
| Acessos de registro não cacheáveis (2000 ciclos cada) | Seis por comando não enfileirado; nove por comando na fila | Dois por comando |
| Interromper | Uma única interrupção | Até 2048 interrupções MSI-X |
| Paralelismo e múltiplos threads | Requer bloqueio de sincronização para emitir um comando | Sem bloqueio |
| Eficiência para comandos de 4 KB | Os parâmetros de comando exigem duas buscas de DRAM de host serializadas | Obtém parâmetros de comando em uma busca de 64 bytes |
| Transmissão de dados | Half-duplex | Full-duplex |

## Suporte ao sistema operacional
### Chrome OS

    Em 24 de fevereiro de 2015, o suporte para inicialização de dispositivos NVM Express foi adicionado ao Chrome OS.

### DragonFly BSD

    A primeira versão do DragonFly BSD com suporte a NVMe é a versão 4.6.

### FreeBSD

    A Intel patrocinou um driver NVM Expressa para filiais head e stable/9 do FreeBSD. Os drivers nvd(4) e nvme(4) estão incluídos na configuração GENERIC do kernel por padrão desde a versão 10.2 do FreeBSD em 2015.

### Genode

    O suporte para NVMe de nível de consumidor foi adicionado à estrutura Genode como parte da versão 18.05.

### Haiku

    Haiku ganhou suporte para NVMe em 18 de abril de 2019.

### Illumos

    Illumos recebeu suporte para NVMe em 15 de outubro de 2014.

### iOS

    Com o lançamento do iPhone 6S e 6S Plus, a Apple introduziu a primeira implantação móvel de NVMe sobre PCIe em smartphones. A Apple seguiu esses lançamentos com o lançamento do iPad Pro de primeira geração e do iPhone SE de primeira geração que também usam NVMe sobre PCIe.

### Linux

    A Intel publicou um driver NVM Express para Linux em 3 de março de 2011, que foi incorporado à linha principal do kernel Linux em 18 de janeiro de 2012 e lançado como parte da versão 3.3 do kernel Linux em 19 de março de 2012. Linux suporta NVMe Host Memory Buffer da versão 4.13.1 com tamanho máximo padrão de 128 MB.

### macOS

    A Apple introduziu o suporte de software para NVM Express no Yosemite 10.10.3. A interface de hardware NVMe foi introduzida no MacBook e MacBook Pro de 2016.

### NetBSD

    O NetBSD adicionou suporte para NVMe no NetBSD 8.0. A implementação é derivada do OpenBSD 6.0.

### OpenBSD

    O trabalho de desenvolvimento necessário para dar suporte ao NVMe no OpenBSD foi iniciado em abril de 2014 por um desenvolvedor sênior anteriormente responsável pelo suporte a USB 2.0 e AHCI. O suporte para NVMe foi habilitado na versão OpenBSD 6.0.

### OS/2

    Arca Noae fornece um driver NVMe para o ArcaOS, a partir de aabril de 2021. O driver requer interrupções avançadas conforme fornecido pelo ACPI PSD rodando no modo de interrupção avançado (modo 2), exigindo, portanto, o kernel SMP também.

### Solaris

    Solaris recebeu suporte para NVMe no Oracle Solaris 11.2.

### VMware

    A Intel forneceu um driver NVMe para VMware, que está incluído no vSphere 6.0 e versões posteriores, suportando vários dispositivos NVMe. A partir da atualização 1 do vSphere 6, o subsistema de armazenamento definido por software VSAN da VMware também oferece suporte a dispositivos NVMe.

### Windows

    A Microsoft adicionou suporte nativo para NVMe ao Windows 8.1 e Windows Server 2012 R2. Drivers nativos para Windows 7 e Windows Server 2008 R2 foram adicionados nas atualizações. Além disso, o suporte para Windows XP e Vista também foi adicionado não oficialmente. Muitos fornecedores lançaram seus próprios drivers do Windows para seus dispositivos. Também há arquivos de instalação personalizados manualmente disponíveis para instalar o driver de um fornecedor específico em qualquer placa NVMe, como usar um driver Samsung NVMe com um dispositivo NVMe não Samsung, que pode ser necessário para recursos adicionais, desempenho e estabilidade. O suporte para NVMe HMB foi adicionado na atualização de aniversário do Windows 10 (versão 1607) em 2016.
    A OpenFrabrics Alliance mantém um driver NVMe Windows de código aberto para Windows 7/8/8.1 e Windows Server 2008R2/2012/2012R2, desenvolvido a partir do código de linha de base enviado por várias empresas promotoras do grupo de trabalho NVMe, especificamente IDT, Intel e LSI. A versão atual é 1.5 de dezembro de 2016.

## Suporte de software
### QEMU

    O NVMe é suportado pelo QEMU deade a versão 1.6 lançada em 15 de agosto de 2013. Os dispositivos NVMe apresentados aos convidados do QEMU podem ser reais ou emulados.

### UEFI

    Um driver NVMe decódigo aberto para UEFI está disponível no SourceForge.

## Ferramenta de gerenciamento
### nvmecontrol

A ferramenta nvmecontrol é usada para controlar um disco NVMe a partir da linha de comando do FreeBSD. Foi adicionado no FreeBSD 9.2.

### nvme-cli

Ferramentas de espaço do usuário NVM-Express para Linux.