https://docs.simplessd.org/index.html

http://camelab.org/pmwiki.php/Main/Tools

https://github.com/MatiasBjorling/flashsim

출처: http://ssu1945.egloos.com/4007260

 

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가 작업을 해줍니다.

실제 S/W engineer 가 신경써야 하는 것은 Software layer 이다.

 

그럼 H/W 만 믿으면 되지 않느냐? 라고 하겠지만 실제 Data의 순서 및 PCI device로의 인식등 여러가지 문제들을 생각하고 구현해야 SSD를 만들수 있어요.

 

 

( https://www.mindshare.com/files/ebooks/PCI%20Express%20System%20Architecture.pdf)

 

그래서 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 에서 어떻게 설명하고 있는지 나옵니다.

(참조 : http://nvmexpress.org/wp-content/uploads/2013-FMS-NVMe-Track.pdf )

 

결국 PCIe 를 사용하는 입장이기에 PCIe를 어느정도 알지 못하면 NVMe 자체를 잘 사용할수 없다가 결론입니다.

 

PS : NVMe spec. 2장을 공부하시다가 궁금하신건 PCIe spec. 3.0 을 보세요. 전에 언급했던 대로 Mindshare 자료 좋습니다. 참고하세요. 

출처: http://ssu1945.egloos.com/4007036

 

먼저 기초적인 PC 관련 지식이 있어야 한다.

 

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 인코딩을 써서 시그널 구조로 갑니다.
  • NVMe 에서 쓰이는 command 들의 골자를 여기서 정의 합니다.

5,6 장은 실제 사용하는 command에 대한 내용

 

7장은 command 의 처리와 여러가지 기능등에 대한 상세 설명 

 

8장도 여러가지 기능에 대해 써 놓음.

[알고리즘]

박트리: baactree.tistory.com/52

류트: https://ryute.tistory.com/m/33

바킹덕: https://blog.encrypted.gg/category/%EA%B0%95%EC%A2%8C/%EC%8B%A4%EC%A0%84%20%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98

라이: kks227.blog.me

T아카데미 기초 :

https://www.youtube.com/watch?v=vQv7PTKM2LI&list=PL9mhQYIlKEhdvKFh-wVpDuihNQv6C1gSy

T아카데미 중급 : 

https://youtu.be/Cc-YlbLOaqY?list=PL9mhQYIlKEhcqOXxPOhs6pNpq681RDK4J

권오흠 교수님: 

https://www.youtube.com/channel/UC-cOmaeWLm7Ii7erMQNatvA/playlists

삼성SWEA : 

https://swexpertacademy.com/

 

[코딩&CS 인터뷰 대비]

https://github.com/daeseokyoun/google-interview-university

 

[리눅스 커널]

https://github.com/jakeisname

https://wiki.kldp.org/wiki.php/%B8%AE%B4%AA%BD%BA%C4%BF%B3%CE

http://jake.dothome.co.kr/

http://rousalome.egloos.com/

 

[프로그래밍 언어 - C언어]

http://soen.kr/

https://sunyzero.tistory.com/225

1. Advanced Embedded C

2. Advanced Data Structure

3. Advanced Algorithm

4. Linux System Programming

5. Linux kernel & Device Driver

6. ARM Device Programming

7. Cortex-M System Programming

8. Cortex-A System Programming

9. Trace32

10. UML & TDD

11. C++ & OOP

12. Embedded System Project (FAT 파일 시스템 설계)

 

Contact

E-mail : 

Linkedin : 

 

Major Field

System Architecture for NAND Flash memory based Storage System

 

Paper

- RFM-based hot/cold data classification for reducing Write Amplification Factor

- Automotive storage의 성능 최적화 및 신뢰성 확보 연구

- 하이퍼바이저가 NAND 플래시 메모리에 미치는 영향 분석

 

Work Experience

~ 2019.02

MS, electronics and computer engineering, Hanyang University (Korea)

Research Area : Flash memory, System Architecture, Linux Kernel and Device Driver

2019.03 ~

System Software Engineer, Samsung Electronics (Korea)

Area: System Software, especially Linux-based NVMe Deivce Driver

+ Recent posts