그 밑의 Transport, Link, Physcal (SATA 기준으로) Layer는 PCIe 의 spec.을 따릅니다.
그리고 보통 S/W 가 작업하는 F/W level 은Protocol Layer 부분부터 가져오게 됩니다.
아래 그림에서 NVMe Protocol 이 정의 하는 내용은 Software layer 이다.
그 밑단의 일련의 작업들은 실제로 PHY chip 이라 불리우는 H/W가 작업을 해줍니다.
실제 S/W engineer 가 신경써야 하는 것은 Software layer 이다.
그럼 H/W 만 믿으면 되지 않느냐? 라고 하겠지만 실제 Data의 순서 및 PCI device로의 인식등 여러가지 문제들을 생각하고 구현해야 SSD를 만들수 있어요.
그래서 NVMe spec.의 2장은 System Bus (PCI Express) Registers 라고 이름 붙여져 있습니다.
PC 에서 Power ON 이 되면 Mainboard 의 F/W 인 BIOS 에서 PCI device를 인식합니다.
인식한 뒤에 Link layer 에서 Link 부분의 조율(한국어로는 조율이라는 표현이 제일 맞을것 같네요.)을 합니다.
(Link와 Physical 부분은 제가 전문가는 아니라서 정확히는 모르고 PCI 와 SATA 가 Speed set 부분에 있어 순서가 다른데 정확한 정보 확인 뒤에 업데이트 하도록 하겠습니다.)
Link 부분이 정확히 끝난뒤에 실제 PCI device로 부터 PCI header 를 읽어 갑니다.
이때 부터 PCI device 인지 알게 되는 거죠.
PCI slot을 보통 그래픽 카드나 랜카드, 사운드 카드를 사용하시는데 많이 쓰셨을껀데, Device ID 중에 mass storage가 있습니다.
PCIe Header 까지 설명하면 너무 길어지니 적당히 이야기 할게요.
Header 안에는 device 의 vendor(회사명 입니다. PCI sig 에 등록된 생산회사명), Device ID(PCI 에 붙은 장치의 종류 : 그래픽 카드라던가...), BAR, Expansion ROM Address 등등이 적혀 있고, 이부분을 다 읽어가고 나면 이제 NVMe device 로서 인식을 하고 NVMe 명령어를 던지게 됩니다.
기본적으로 NVMe 명령어도 TLP 단계로 내리면 PCIe로 감싸지기 때문에 위에서 바라볼때만 NVMe 인거지 그 밑단에서는 PCIe 와 다를게 없어요.
그래서 NVMe 를 심도 있게 보시려면 PCI 의 TLP 까지는 보셔야 제대로 보실수 있습니다.
또한 PCIe 를 사용하는 만큼 커넥터 역시 여러가지를 쓰는데요.
우리가 알고 있는 PCIe slot 이외에 M.2 또는 SFF 8639 가 있는데요.
이부분은 SATA, SAS, PCIe 가 모두 활용할 수 있는 부분입니다.
자세한 부분은 구글링 몇번이면 나올거에요. 아래자료에 보면 NVMe 에서 어떻게 설명하고 있는지 나옵니다.
CPU - RAM - PCI bus - 노스브리지 - HBA - AHCI 정도 용어와 실제 PC의 data 흐름을 알고 있어야 한다.
간단한 NVMe spec 목차 소개
1장 Introduction
어떤 단어들을 사용하는지에 대한 간략한 설명과 컨셉에 대해 이야기 합니다.
가상화(SR-IOV) 나 namespace 에 대한 내용은 그냥 읽고만 넘어가세요. 뒤에 더 자세히 나옵니다.
실제 NVMe 가 지향하는 방향에 어느쪽에 있는지에 대한 이해가 필요해요.
2장 System Bus (PCI Express) Registers
Protocol layer 만 있기 때문에 꼭 link 단 부터 이용되는 PCIe 공부는 필수입니다.
Host(PC)가 NVMe subsystem(간단히 SSD) 를 인식하기 위한 PCI header 와 그 부분을 NVMe 에서 어떻게 쓸지에 대해 이야기 합니다.
3장 Controller Registers
NVMe subsystem(간단히 SSD)의 controller 에서 지원하는 기능들을 Host(PC)에 알려주기 위한 일종의 가이드 입니다.
4장 System Memory structure
NVMe 는 직접 Host(PC) DRAM 을 access 해요. 그리고 Memory base 입니다. 그래서 command 구조가 메모리 구조 식으로 되어 있어요. 물론 Physical 로 나갈 떄는 Gen 1,2 는 8b/10b, Gen3 는 128b/130b 인코딩을 써서 시그널 구조로 갑니다.