참고: http://ssu1945.egloos.com/4007260

참고 사이트 원문을 참고하여 재구성 하였고, NVMe Spce 이야기 시리즈는 ATA 이야기를 모티브로 기획되었습니다.

NVMe Spec. 구성 및 PCIe와 관계

1. NVMe Spec. 구성

기초적인 PC 관련 지식이 있어야 합니다. NVMe Subsystem(간단히 SSD)의 목적 자체가 Data 저장장치이니 CPU - RAM - PCI bus - 노스브리지 - HBA - AHCI 정도 용어와 실제 PC의 Data 흐름을 알고 있으면 좋습니다.

1장은 간단한 소개들로 시작됩니다.

  • 어떤 단어들을 사용하는지에 대한 간략한 설명과 컨셉에 대해 이야기 합니다.
  • 가상화(SR-IOV)나 Namespace에 대한 내용은 그냥 읽고만 넘어가세요. 뒤에 더 자세히 나옵니다.

2장 System Bus (PCI Express) Registers라고 친절히 적혀 있네요.

  • Protocol Layer만 있기 때문에 Link단 부터 이용되는 PCIe에 대한 이해는 필수입니다.
  • Host(PC)가 NVMe Subsystem(간단히 SSD)를 인식하기 위한 PCI Header와 그 부분을 NVMe에서 어떻게 쓸지에 대해 이야기 합니다.

3장 Controller Registers. 말 그대로 입니다.

  • NVMe Subsystem의 Controller에서 지원하는 기능들을 Host(PC)에 알려주기 위한 일종의 가이드 입니다.

4장 Data Structures

  • NVMe는 직접 Host(PC) DRAM을 Access합니다. 그리고 Memory Base입니다. 그래서 Command 구조가 메모리 구조식으로 되어 있습니다. 물론 Physical로 나갈 떄는 Gen 1,2는 8b/10b, Gen3는 128b/130b 인코딩을 써서 시그널 구조로 갑니다.
  • NVMe에서 쓰이는 Command들의 구조를 여기서 정의 합니다.

5,6 장은 실제 사용하는 Command에 대한 내용입니다.

7장은 Command 의 처리와 여러가지 기능등에 대한 상세 설명입니다.

8장도 여러가지 기능에 대한 내용입니다. 9장은 스킵!.

2. NVMe와 PCIe의 관계

NVMe는 실제 Command 단위로 움직이는 Protocol Layer이고, 그 밑에 Transport, Link, Physcal (SATA 기준으로) Layer는 PCIe Spec.을 따릅니다. 그리고 보통 S/W 가 작업하는 F/W Level은 Protocol Layer 부분부터 가져오게 됩니다.

하기 그림에서 NVMe Protocol이 정의 하는 내용은 Software layer입니다. 그리고 그 밑단의 일련의 작업들은 실제로 PHY Chip이라 불리우는 H/W가 해줍니다. 그래서 NVMe Spec.의 2장은 System Bus (PCI Express) Registers라고 이름 붙여져 있습니다.

Physical Layer

PC에서 Power ON이 되면 Mainboard의 F/W인 BIOS에서 PCI Device를 인식합니다. 인식한 뒤에 Link Layer에서 Link 부분의 Negotation을 합니다. Link 초기화 후에 실제 PCI Device로 부터 PCI Header를 읽어 갑니다. 이 때부터 PCI Device인지 알게 됩니다. PCI Slot을 보통 그래픽 카드나 랜카드, 사운드 카드를 사용하시는데 많이 쓰셨을껀데, Device ID 중에 Mass Storage가 있습니다. Header 안에는 Device의 Vendor(회사명 입니다. PCI Sig 에 등록된 생산회사명), Device ID(PCI 에 붙은 장치의 종류 : 그래픽 카드라던가…), BAR, Expansion ROM Address 등등이 적혀 있고, 이 부분을 다 읽어가고 나면 이제 NVMe Device로서 인식을 하고 NVMe 명령어를 던지게 됩니다.

기본적으로 NVMe 명령어도 Transaction Layer로 내리면 PCIe로 감싸지기 때문에 위에서 바라볼때만 NVMe인거지 그 밑단에서는 PCIe와 다를게 없습니다. 그래서 NVMe를 심도 있게 보시려면 PCIe TLP(Transaction Layer Packets) 까지는 보셔야 제대로 보실수 있습니다.

또한, PCIe를 사용하는 만큼 커넥터 역시 여러가지를 쓰는데, PCIe Slot 이외에 M.2 또는 SFF8639가 있습니다. 참조 자료에 보면 NVMe 에서 어떻게 설명하고 있는지 나옵니다. 결국 PCIe를 사용하는 입장이기에 PCIe를 어느정도 알지 못하면 NVMe 자체를 잘 사용할수 없다가 결론입니다. (NVMe Spec. 2장을 공부하시다가 궁금하신건 PCIe Spec. 3.0을 참고하시기 바랍니다.)