Upload
-
View
5.426
Download
1
Embed Size (px)
Citation preview
[1]
NVMe 로 (*´Д`) 하아하아 하자
hiyohiyoTwitter: @openlibsys
http://crystalmark.info/
Sapporo.cpp / 삿포로 C++ 스터디 #10@크립톤 퓨처 미디어
[2]
발표내용자기소개NVMe 는?벤치마크NVMe 의 비밀정리
[3]자기소개
[4]
자기소개닉네임: hiyohiyo/ 히요히요나이: 37 세가족:아내 , 사랑하는 딸 , 사랑하는 아들취미:소프트웨어 개발 ( 약 17 년 )주소:홋카이도 삿포로시
대표작 : CrystalDiskInfo, CrystalDiskMark 외(통칭 Crystal 시리즈)컴퓨터가 더 좋아하는 소프트웨어를 일관되게 개발하고 있습니다
Microsoft MVP・ Visual C++ (Jan. 2014 – Sep. 2015) ・ Visual Studio and Development Technologies (Oct. 2015 -)
[5]
CrystalMark 2004순위를 지원하는 벤치마크
[6]
CrystalCPUIDCPU 정보 도구
[7]
CrystalDiskMark 5 Shizuku Edition신세대 디스크 벤치마크
벤치마크 결과 따윈 덤입니다 ㅋㅋㅋ
일반판
[8]
CrystalDiskInfo 6 Shizuku Edition
HDD 와 SSD 의 건강 상태를 음성으로 알려준다 !!
신세대 디스크 정보 도구
일반판
[9]
[10]
[ 광고 ] 제 2 세대 모에 주도 개발
http://www.slideshare.net/hiyohiyo/mddwin32
소프트웨어 개발에서 가장 소중한 것을 소개하고 있습니다 !!
제 2 세대 MDD( 모에 주도 개발 ) 에 따른 Win32 프로그래밍CLR/H 제 89 회 스터디
~Community Camp 데이 !~
[11]NVMe 는?
[12]
NVMe 는
NVM Express (NVMe) 는 호스트 소프트웨어와 비휘발성 메모리 (Non-volatile memory) 의 인터페이스입니다 .
NVMe 는 PCI Express 로 연결되는 엔터프라이즈용 SSD 및 클라이언트 전용 SSD 에 최적화되어 있습니다 .
SSD 용 차세대 인터페이스
[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)
[14]
AHCI vs NVMe벤치마크 프로그램의 관점에서 가장 중요한 부분
AHCI NVMe
Queue 1 65536Commands/Queue 32 65536
1x1 32x1 32x8
SAMSUNG SSD 950 PRO 512GB 의 랜덤 읽기 벤치마크 결과 (MB/s)
[15]
Intel SSD 750 1.2TB
[16]
SAMSUNG SSD 950 PRO 512GB
NVMe 조사만을 위해서 구입
[17]
SAMSUNG SSD 950 PRO vs Intel SSD 750
SAMSUNG SSD
950 PRO
Intel SSD750
※Microsoft 표준 드라이버
[18]
Intel SSD 750 드라이버 비교
Intel NVMe Driver
Microsoft표준 드라이버
[19]NVMe 의 비밀 1
[20]
갑작스럽지만 퀴즈입니다!
???
NVMe SSD 는 스토리지이자 ○ ○ ○ 장치입니다 .
[21]
파트 1
Intel 제품의 Vendor ID 는
8086h
[22]
파트 2
○○○ Express
[23]
실은・・・
PCI Express 장치이기도 합니다 !!
루트 컨트롤러컨트롤러
컨트롤러표준
[24]
그리하여・・・
PCI Configuration Space 에는 무언가 중요한 정보가 있을 것
[25]
PCI Express 디바이스로서 점검
출처 : http://www.nvmexpress.org/wp-content/uploads/NVM-Express-1_2a.pdf
Intel※Little Endian
확장 기능에 대한 포인터
[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
[27]
소박한 의문
PCI 에 어떻게 하면 접근할 수 있을까?
[28]
WinRing0 ( 종료된 프로젝트 ) 소개
공개는 사정에 의해 종료되었습니다 .
설명서 완비
범용 하드웨어 접근 라이브러리
수정 BSD 라이선스를 사용하면
I/O 포트를 읽고 쓸 수 있다 .PCI Configuration Space 를 읽고 쓸 수 있다 .RDMSR/WRMSR 특권 명령을 사용할 수 있다 .RDTSC 와 CPUID 명령을 사용할 수 있다 .즉 , .NET 어플리케이션에서 하드웨어에접근하는 일이 가능하다 !!
[29]
WinRing0.dll (WinRing0x64.dll)
WinRing0.vxd
WinRing0.sys WinRing0x64.sys
유저 모드Ring3
커널 모드Ring0
WinRing0 의 구성
[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 사용 방법
[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
[32]NVMe 의 비밀 2
[33]
NVMe 명령어 셋
표준 명령어필수 3 종
Admin 명령어필수 10 종
[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 표준 명령어
[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 명령을 보냄
[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
소위
[37]
어떻게 해야・・・
NVMe SSD 의 S.M.A.R.T. 정보를
Windows 에서 읽을 수 없어 !!!!!!!!!!
NVMe \ (^o^) /망했어요
[38]
신 강림
일본어 (*´Д`) 하아하아 트윗에 한국의 신으로부터 반응이 !!!
글로벌 활동이 부른 기적 ?
데이터 시트 외 여러가지 정보를 공식에서 적극적으로 받게 되었는데 , 쌓인 숙제 ( 미대응 SSD) 에 짓눌린 것 같은 요즘 .숙제를 대충 치우고 빨리 NVMe 분석 (* 'Д`) 하아하아 하고 싶다 .
[39]
신 강림
http://naraeon.net/
https://github.com/ebangin127/nvmetools
[40]
S.M.A.R.T. 정보 받아오기 (SAMSUNG)
Microsoft NVMe Driver
SAMSUNG SSD 950 PRO ( 한정 )
Security Command (SCSI)
Get Log Page
ReadFile() Win32API※
READ ※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: 이외의 값으로는 동작하지 않는다
[42]
잠정판 공개 중 !!
[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 명령어를 보냄
[44]
NVMe SSD 도 보이게 되었습니다 !!
지옥의 개별 대응이……
[45]
S.M.A.R.T. 형식이 완전히 다르다 !!SAMSUNG SSD 830 512GB (SATA) SAMSUNG SSD 950 PRO 512GB (NVMe)
S.M.A.R.T. 형식 비교
[46]
S.M.A.R.T. 형식이 완전히 다르다 !!SAMSUNG SSD 830 512GB (SATA) SAMSUNG SSD 950 PRO 512GB (NVMe)
S.M.A.R.T. 형식 비교
[47]
신 프로젝트는 Delphi 였다……스텝 실행 때문에 체험판 다운로드 !!
여담
[48]정리
[49]
정리
NVMe SSD 당장 사러 달려갑시다 !!
[50]
정리
• 오픈 소스로 공개하면 너무 좋은 일이 일어나기도
합니다 .• 테스트용 기자재는 다소 비싸도 삽니다 .
⇒ 실제 제품 없는 개발은 지옥 .• 이번 발표를 계기로 NVMe 지원합니다 .
⇒ 이 기회가 없었으면 상당히 나중에 했을 듯 !?• 하드웨어 관련 소프트웨어의 개발은 즐겁습니다 .
⇒ (*´Д`) 하아하아
[51]참고 문헌
[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
참고 문헌
[53]
들어주셔서 감사합니다