53
[ NVMe 로 (*´Д`) 로로로로 로로 hiyohiyo Twitter: @openlibsys http://crystalmark.info/ Sapporo.cpp / 삿삿삿 C++ 삿삿삿 #10 삿삿삿 삿삿 삿삿삿

NVMe로 (*´Д`)하아하아 하자

  • Upload
    -

  • View
    5.426

  • Download
    1

Embed Size (px)

Citation preview

Page 1: NVMe로 (*´Д`)하아하아 하자

[1]

NVMe 로 (*´Д`) 하아하아 하자

hiyohiyoTwitter: @openlibsys

http://crystalmark.info/

Sapporo.cpp / 삿포로 C++ 스터디 #10@크립톤 퓨처 미디어

Page 2: NVMe로 (*´Д`)하아하아 하자

[2]

발표내용자기소개NVMe 는?벤치마크NVMe 의 비밀정리

Page 3: NVMe로 (*´Д`)하아하아 하자

[3]자기소개

Page 4: NVMe로 (*´Д`)하아하아 하자

[4]

자기소개닉네임: hiyohiyo/ 히요히요나이: 37 세가족:아내 , 사랑하는 딸 , 사랑하는 아들취미:소프트웨어 개발 ( 약 17 년 )주소:홋카이도 삿포로시

대표작 : CrystalDiskInfo, CrystalDiskMark 외(통칭 Crystal 시리즈)컴퓨터가 더 좋아하는 소프트웨어를 일관되게 개발하고 있습니다

Microsoft MVP・ Visual C++ (Jan. 2014 – Sep. 2015) ・ Visual Studio and Development Technologies (Oct. 2015 -)

Page 5: NVMe로 (*´Д`)하아하아 하자

[5]

CrystalMark 2004순위를 지원하는 벤치마크

Page 6: NVMe로 (*´Д`)하아하아 하자

[6]

CrystalCPUIDCPU 정보 도구

Page 7: NVMe로 (*´Д`)하아하아 하자

[7]

CrystalDiskMark 5 Shizuku Edition신세대 디스크 벤치마크

벤치마크 결과 따윈 덤입니다 ㅋㅋㅋ

일반판

Page 8: NVMe로 (*´Д`)하아하아 하자

[8]

CrystalDiskInfo 6 Shizuku Edition

HDD 와 SSD 의 건강 상태를 음성으로 알려준다 !!

신세대 디스크 정보 도구

일반판

Page 9: NVMe로 (*´Д`)하아하아 하자

[9]

Page 10: NVMe로 (*´Д`)하아하아 하자

[10]

[ 광고 ] 제 2 세대 모에 주도 개발

http://www.slideshare.net/hiyohiyo/mddwin32

소프트웨어 개발에서 가장 소중한 것을 소개하고 있습니다 !!

제 2 세대 MDD( 모에 주도 개발 ) 에 따른 Win32 프로그래밍CLR/H 제 89 회 스터디

~Community Camp 데이 !~

Page 11: NVMe로 (*´Д`)하아하아 하자

[11]NVMe 는?

Page 12: NVMe로 (*´Д`)하아하아 하자

[12]

NVMe 는

NVM Express (NVMe) 는 호스트 소프트웨어와 비휘발성 메모리 (Non-volatile memory) 의 인터페이스입니다 .

NVMe 는 PCI Express 로 연결되는 엔터프라이즈용 SSD 및 클라이언트 전용 SSD 에 최적화되어 있습니다 .

SSD 용 차세대 인터페이스

Page 13: NVMe로 (*´Д`)하아하아 하자

[13]

NVMe @PCIe 3.0x4

SATA/600

SATA/300

SATA/150

UDMA/100

UDMA/66

UDMA/33

0 500 1000 1500 2000 2500 3000 3500 4000

전송 속도 (MB/s)

Page 14: NVMe로 (*´Д`)하아하아 하자

[14]

AHCI vs NVMe벤치마크 프로그램의 관점에서 가장 중요한 부분

AHCI NVMe

Queue 1 65536Commands/Queue 32 65536

1x1 32x1 32x8

SAMSUNG SSD 950 PRO 512GB 의 랜덤 읽기 벤치마크 결과 (MB/s)

Page 15: NVMe로 (*´Д`)하아하아 하자

[15]

Intel SSD 750 1.2TB

Page 16: NVMe로 (*´Д`)하아하아 하자

[16]

SAMSUNG SSD 950 PRO 512GB

NVMe 조사만을 위해서 구입

Page 17: NVMe로 (*´Д`)하아하아 하자

[17]

SAMSUNG SSD 950 PRO vs Intel SSD 750

SAMSUNG SSD

950 PRO

Intel SSD750

※Microsoft 표준 드라이버

Page 18: NVMe로 (*´Д`)하아하아 하자

[18]

Intel SSD 750 드라이버 비교

Intel NVMe Driver

Microsoft표준 드라이버

Page 19: NVMe로 (*´Д`)하아하아 하자

[19]NVMe 의 비밀 1

Page 20: NVMe로 (*´Д`)하아하아 하자

[20]

갑작스럽지만 퀴즈입니다!

???

NVMe SSD 는 스토리지이자 ○ ○ ○ 장치입니다 .

Page 21: NVMe로 (*´Д`)하아하아 하자

[21]

파트 1

Intel 제품의 Vendor ID 는

8086h

Page 22: NVMe로 (*´Д`)하아하아 하자

[22]

파트 2

○○○ Express

Page 23: NVMe로 (*´Д`)하아하아 하자

[23]

실은・・・

PCI Express 장치이기도 합니다 !!

루트 컨트롤러컨트롤러

컨트롤러표준

Page 24: NVMe로 (*´Д`)하아하아 하자

[24]

그리하여・・・

PCI Configuration Space 에는 무언가 중요한 정보가 있을 것

Page 25: NVMe로 (*´Д`)하아하아 하자

[25]

PCI Express 디바이스로서 점검

출처 : http://www.nvmexpress.org/wp-content/uploads/NVM-Express-1_2a.pdf

Intel※Little Endian

확장 기능에 대한 포인터

Page 26: NVMe로 (*´Д`)하아하아 하자

[26]

PCI Express 디바이스로서 점검

출처 : http://www.nvmexpress.org/wp-content/uploads/NVM-Express-1_2a.pdf

Address Capability ID Next Address

40h 01h 50h

50h 11h 60h

60h 10h ----

CLS Link Speed

1h 250MB/s, 2.5GT/s (8B10)

2h 500MB/s, 5.0GT/s (8B10)

3h 1000MB/s, 8.0GT/s (128B130B)

NLW Link Width

1h x1

2h x2

4h x4

Page 27: NVMe로 (*´Д`)하아하아 하자

[27]

소박한 의문

PCI 에 어떻게 하면 접근할 수 있을까?

Page 28: NVMe로 (*´Д`)하아하아 하자

[28]

WinRing0 ( 종료된 프로젝트 ) 소개

공개는 사정에 의해 종료되었습니다 .

설명서 완비

범용 하드웨어 접근 라이브러리

수정 BSD 라이선스를 사용하면

I/O 포트를 읽고 쓸 수 있다 .PCI Configuration Space 를 읽고 쓸 수 있다 .RDMSR/WRMSR 특권 명령을 사용할 수 있다 .RDTSC 와 CPUID 명령을 사용할 수 있다 .즉 , .NET 어플리케이션에서 하드웨어에접근하는 일이 가능하다 !!

Page 29: NVMe로 (*´Д`)하아하아 하자

[29]

WinRing0.dll (WinRing0x64.dll)

WinRing0.vxd

WinRing0.sys WinRing0x64.sys

유저 모드Ring3

커널 모드Ring0

WinRing0 의 구성

Page 30: NVMe로 (*´Д`)하아하아 하자

[30]

1. OpenLibSys.cs 를 프로젝트에 추가합니다 . 2. using OpenLibSys; 를 소스코드에 추가합니다 . 3. Ols ols = new Ols(); 식으로 Ols 클래스 객체를 생성합니다 .4. 객체를 통해서 라이브러리 기능을 호출합니다 .

사용방법

using OpenLibSys;public partial class WinRing0Sample : Form{ private void Form1_Load(object sender, EventArgs e) { uint freq = 1193180000 / 440000; // 440Hz Ols ols = new Ols(); // Beep 소리를 냅니다。 ols.WriteIoPortByte(0x43, 0xB6); ols.WriteIoPortByte(0x42, (byte)(freq & 0xFF)); ols.WriteIoPortByte(0x42, (byte)(freq >> 9)); // 하략 }}

hogehoge.cs

WinRing0 사용 방법

Page 31: NVMe로 (*´Д`)하아하아 하자

[31]

// Host Bridgeaddress = ols.FindPciDeviceByClass(0x06, 0x00, 0x00, 0);if (address != 0xFFFFFFFF){ str += "[PCI Confguration Space Dump] HostBridge\r\n"; str += " 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F\r\n"; str += "---------------------------------------------------\r\n"; for (int i = 0; i < 256; i+= 16) { str += i.ToString("X2") + "|"; for (int j = 0; j < 16; j++) { str += “ ” + (ols.ReadPciConfigByte(address, (byte)(i + j))).ToString("X2"); } str += "\r\n"; }}

Dump PCI Configuration Space

Page 32: NVMe로 (*´Д`)하아하아 하자

[32]NVMe 의 비밀 2

Page 33: NVMe로 (*´Д`)하아하아 하자

[33]

NVMe 명령어 셋

표준 명령어필수 3 종

Admin 명령어필수 10 종

Page 34: NVMe로 (*´Д`)하아하아 하자

[34]

S.M.A.R.T. 정보 받아오기 (NVMe 의 경우 )

Microsoft NVMe Driver

NVMe SSDs

Get Log Page

Admin 명령어는 통하지 않음 !!

S.M.A.R.T. 에 접근하기 위한명령어

표준 명령어 Admin 명령어

ReadFile() Win32API※

Read ※NVMe 표준 명령어

Page 35: NVMe로 (*´Д`)하아하아 하자

[35]

S.M.A.R.T. 정보 받아오기 (ATA 의 경우 )

Microsoft ATA Driver

ATA HDD/SSD

S.M.A.R.T. 에 접근하기 위한명령어ReadFile()

Win32API※

READ **** ※ATA 명령어

SMART READ DATAATA PASS THROUGH 라는

구조체를 사용하여 직접 ATA 명령을 보냄

Page 36: NVMe로 (*´Д`)하아하아 하자

[36]

S.M.A.R.T. 정보 받아오기 (USB 의 경우 )S.M.A.R.T. 정보 받아오기 ( 외장형 ) 외장형 HDD 의 내용

USB/IEEE 1394 지원 S.M.A.R.T 정보 받아오기 ( 외장형 )

S.M.A.R.T. 정보 획득 명령어 SATA/PATA

명령어 명령어변환 칩

USB 패킷 혹은 IEEE 1394 패킷SCSI 명령어 (Read/Write 등 )

유감스럽게도 , USB-ATA 변환 칩을 사용하는 경우 완전한 ATA 명령어 사용은 불가능하다 .

그러나 , 일부 USB-ATA 변환 칩은 직접 ATA 명령어 전송을 위한 인터페이스가 준비되어 있다 .뒷문 이다 .

USB 패킷 혹은 IEEE 1394 패킷SCSI 명령어 (Read/Write 등 )

보통 ATA 명령어

USB 패킷 혹은 IEEE 1394 패킷SCSI 명령어 (Read/Write 등 )

보통 ATA 명령어

변환 칩SATA/PATA

소위

Page 37: NVMe로 (*´Д`)하아하아 하자

[37]

어떻게 해야・・・

NVMe SSD 의 S.M.A.R.T. 정보를

Windows 에서 읽을 수 없어 !!!!!!!!!!

NVMe \ (^o^) /망했어요

Page 38: NVMe로 (*´Д`)하아하아 하자

[38]

신 강림

일본어 (*´Д`) 하아하아 트윗에 한국의 신으로부터 반응이 !!!

글로벌 활동이 부른 기적 ?

데이터 시트 외 여러가지 정보를 공식에서 적극적으로 받게 되었는데 , 쌓인 숙제 ( 미대응 SSD) 에 짓눌린 것 같은 요즘 .숙제를 대충 치우고 빨리 NVMe 분석 (* 'Д`) 하아하아 하고 싶다 .

Page 39: NVMe로 (*´Д`)하아하아 하자

[39]

신 강림

http://naraeon.net/

https://github.com/ebangin127/nvmetools

Page 40: NVMe로 (*´Д`)하아하아 하자

[40]

S.M.A.R.T. 정보 받아오기 (SAMSUNG)

Microsoft NVMe Driver

SAMSUNG SSD 950 PRO ( 한정 )

Security Command (SCSI)

Get Log Page

ReadFile() Win32API※

READ ※NVMe 명령어비밀 뒷문으로

접근

Page 41: NVMe로 (*´Д`)하아하아 하자

[41]

::ZeroMemory(&sptwb, sizeof(SCSI_PASS_THROUGH_WITH_BUFFERS24));

sptwb.Spt.Length = sizeof(SCSI_PASS_THROUGH);sptwb.Spt.PathId = 0;sptwb.Spt.TargetId = 0;sptwb.Spt.Lun = 0;sptwb.Spt.SenseInfoLength = 24;sptwb.Spt.DataTransferLength = IDENTIFY_BUFFER_SIZE;sptwb.Spt.TimeOutValue = 2;sptwb.Spt.DataBufferOffset = offsetof(SCSI_PASS_THROUGH_WITH_BUFFERS24, DataBuf);sptwb.Spt.SenseInfoOffset = offsetof(SCSI_PASS_THROUGH_WITH_BUFFERS24, SenseBuf);

sptwb.Spt.CdbLength = 16;sptwb.Spt.Cdb[0] = 0xB5; // SECURITY PROTOCOL INsptwb.Spt.Cdb[1] = 0xFE; // SAMSUNG PROTOCOLsptwb.Spt.Cdb[3] = 6; // Get Log Pagesptwb.Spt.Cdb[9] = 0x40; // Transfer Lengthsptwb.Spt.DataIn = SCSI_IOCTL_DATA_OUT;sptwb.DataBuf[0] = 2;sptwb.DataBuf[4] = 0xFF;sptwb.DataBuf[5] = 0xFF;sptwb.DataBuf[6] = 0xFF;sptwb.DataBuf[7] = 0xFF;

length = offsetof(SCSI_PASS_THROUGH_WITH_BUFFERS24, DataBuf) + sptwb.Spt.DataTransferLength;

bRet = ::DeviceIoControl(hIoCtrl, IOCTL_SCSI_PASS_THROUGH, &sptwb, length, &sptwb, length, &dwReturned, NULL);

SAMSUNG SSD 950 PRO 에 접근일부 발췌

Magic Number: 이외의 값으로는 동작하지 않는다

Page 42: NVMe로 (*´Д`)하아하아 하자

[42]

잠정판 공개 중 !!

Page 43: NVMe로 (*´Д`)하아하아 하자

[43]

S.M.A.R.T. 정보 받아오기 (Intel)

Intel NVMe Driver

Intel SSD 750( 한정 )

ReadFile() Win32API※

READ ※NVMe 명령어

Get Log Page

S.M.A.R.T. 에 접근하기 위한명령어

Admin 명령어

NVMe PASS THROUGH (Intel 전용 )

을 통해서 직접 NVMe 명령어를 보냄

Page 44: NVMe로 (*´Д`)하아하아 하자

[44]

NVMe SSD 도 보이게 되었습니다 !!

지옥의 개별 대응이……

Page 45: NVMe로 (*´Д`)하아하아 하자

[45]

S.M.A.R.T. 형식이 완전히 다르다 !!SAMSUNG SSD 830 512GB (SATA) SAMSUNG SSD 950 PRO 512GB (NVMe)

S.M.A.R.T. 형식 비교

Page 46: NVMe로 (*´Д`)하아하아 하자

[46]

S.M.A.R.T. 형식이 완전히 다르다 !!SAMSUNG SSD 830 512GB (SATA) SAMSUNG SSD 950 PRO 512GB (NVMe)

S.M.A.R.T. 형식 비교

Page 47: NVMe로 (*´Д`)하아하아 하자

[47]

신 프로젝트는 Delphi 였다……스텝 실행 때문에 체험판 다운로드 !!

여담

Page 48: NVMe로 (*´Д`)하아하아 하자

[48]정리

Page 49: NVMe로 (*´Д`)하아하아 하자

[49]

정리

NVMe SSD 당장 사러 달려갑시다 !!

Page 50: NVMe로 (*´Д`)하아하아 하자

[50]

정리

• 오픈 소스로 공개하면 너무 좋은 일이 일어나기도

합니다 .• 테스트용 기자재는 다소 비싸도 삽니다 .

⇒ 실제 제품 없는 개발은 지옥 .• 이번 발표를 계기로 NVMe 지원합니다 .

⇒ 이 기회가 없었으면 상당히 나중에 했을 듯 !?• 하드웨어 관련 소프트웨어의 개발은 즐겁습니다 .

⇒ (*´Д`) 하아하아

Page 51: NVMe로 (*´Д`)하아하아 하자

[51]참고 문헌

Page 52: NVMe로 (*´Д`)하아하아 하자

[52]

• nvmexpress.orghttp://www.nvmexpress.org/

• NVM Express 1.2a Specificationhttp://www.nvmexpress.org/wp-content/uploads/NVM-Express-1_2a.pdf

• Naraeon NVMe Toolshttps://github.com/ebangin127/nvmetools

참고 문헌

Page 53: NVMe로 (*´Д`)하아하아 하자

[53]

들어주셔서 감사합니다