개요
NVME(Non-Volatile Memory Express)는 기존의 AHCI프로토콜의 한계를 극복하기 위해서 등장한 데이터 전송 프로토콜이다. 쉽게 설명하자면 AHCI가 SATA장치의 처리를 위한 기본 프로토콜이었다면 NVME는 훨씬 빠른 PCIe에 장착된 스토리지 장치를 위해서 기존 AHCI프로토콜의 한계를 극복하기 위해서 인텔이 새로 만든 프로토콜이다. NVMe의 명령 처리 방식은 기존의 AHCI의 명령보다 최대 900%이상 빠르며, 더 작은 Latency를 가지고 있다.
NVMe는 입력 값이 64K인 각각의 대기열에 대해 최대 64K로 여러 I/O 대기열을 지원할 수 있다. 또한 AHCI(Advanced Host Controller Interface)와 같은 레거시 드라이버를 사용하는 구형 스토리지 모델과 비교해 더 많은 데이터를 더 빠르게 전송하는 입력/출력 작업이 가능하며, 이러한 장점 덕분에 NVMe는 특별히 SSD를 위해 설계되었다.
NVMe 컨트롤러는 PCI디바이스중에서 class code 1, subclass code 0으로 식별할 수 있다. 또한 NVMe는 기존의 AHCI처럼 중심의 AHCI 컨트롤러와 연결되는 것보다, 직접 메모리에 DMA를 이용하여 연결되어 있다. controller 는 command queue를 메모리의 circular queue에 작성하고 tail pointer register를 update하여 명령을 디바이스에 전송한다. 디바이스는 받은 명령을 처리하여, completion queue에 완료된 명령을 작성하고, 인터럽트를 보내 host에 명령이 처리되었음을 통보한다. 또한 command queue, completion queue 이외에도 추가적으로 원한다면 admin queue를 가질 수 있는데, 이 queue는 장치에 대한 정보를 가져오는 것과 같이 admin command를 작성하는데 사용된다.
프로토콜
우선 NVMe는 PCIe(PCI)의 스토리지 활용에 대한 프로토콜이기 때문에, PCIe에 대한 이해가 먼저 필요하다. PANIC!(NOT IMPLEMENTED!);
유용한 명령어
nvme-cli
라는 툴에서 nvme정보를 콘솔에서 쉽게 확인할 수 있도록 하는 툴을 제공한다. sudo apt-get install nvme-cli
로 설치
sudo nvme list # 현재 시스템의 nvme장치 리스트를 보여줌