nvme でハァハァしようよ #sapporocpp

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

Upload: hiyohiyo

Post on 16-Apr-2017

37.685 views

Category:

Software


3 download

TRANSCRIPT

Page 1: NVMe でハァハァしようよ #sapporocpp

[1]

NVMe で (*´Д`) しようハァハァよ

hiyohiyoTwitter: @openlibsys

http://crystalmark.info/

Sapporo.cpp / 札幌 C++ 勉強会 #10@クリプトン・フューチャー・メディア

Page 2: NVMe でハァハァしようよ #sapporocpp

[2]

発表内容自己紹介NVMe とは?ベンチマークNVMe の秘密まとめ

Page 3: NVMe でハァハァしようよ #sapporocpp

[3]自己紹介

Page 4: NVMe でハァハァしようよ #sapporocpp

[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 でハァハァしようよ #sapporocpp

[5]

CrystalMark 2004ランキング対応ベンチマーク

Page 6: NVMe でハァハァしようよ #sapporocpp

[6]

CrystalCPUIDCPU 情報ツール

Page 7: NVMe でハァハァしようよ #sapporocpp

[7]

CrystalDiskMark 5 Shizuku Edition新世代ディスクベンチマーク

ベンチマーク結果なんておまけです www

通常版

Page 8: NVMe でハァハァしようよ #sapporocpp

[8]

CrystalDiskInfo 6 Shizuku Edition

HDD や SSD の健康状態を音声で教えてくれる !!

新世代ディスク情報ツール

通常版

Page 9: NVMe でハァハァしようよ #sapporocpp

[9]

Page 10: NVMe でハァハァしようよ #sapporocpp

[10]

【宣伝】第二世代萌え駆動開発

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

ソフトウェア開発で一番大切なことを紹介しています !!

Page 11: NVMe でハァハァしようよ #sapporocpp

[11]NVMe とは?

Page 12: NVMe でハァハァしようよ #sapporocpp

[12]

NVMe とは

NVM Express (NVMe) はホストソフトウェアと不揮発性メモリ (Non-volatile memory) のインターフェースです。

NVMe は PCI Express で接続されるエンタープライズ向け SSD およびクライアント向け SSD に最適化されています。

SSD 向け次世代インターフェース

Page 13: NVMe でハァハァしようよ #sapporocpp

[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 でハァハァしようよ #sapporocpp

[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 でハァハァしようよ #sapporocpp

[15]

Intel SSD 750 1.2TB

Page 16: NVMe でハァハァしようよ #sapporocpp

[16]

SAMSUNG SSD 950 PRO 512GB

NVMe 調査のためだけに購入

Page 17: NVMe でハァハァしようよ #sapporocpp

[17]

SAMSUNG SSD 950 PRO vs Intel SSD 750

SAMSUNG SSD

950 PRO

Intel SSD750

※Microsoft 標準ドライバ

Page 18: NVMe でハァハァしようよ #sapporocpp

[18]

Intel SSD 750 ドライバ比較

Intel NVMe Driver

Microsoft標準ドライバ

Page 19: NVMe でハァハァしようよ #sapporocpp

[19]NVMe の秘密 1

Page 20: NVMe でハァハァしようよ #sapporocpp

[20]

突然ですがクイズです!

???

NVMe SSD はストレージであると同時に○○○ デバイスです。

Page 21: NVMe でハァハァしようよ #sapporocpp

[21]

ヒント 1

Intel 製品の Vendor ID は

8086h

Page 22: NVMe でハァハァしようよ #sapporocpp

[22]

ヒント 2

○○○ Express

Page 23: NVMe でハァハァしようよ #sapporocpp

[23]

実は・・・

PCI Express デバイスでもあるのです !!

Page 24: NVMe でハァハァしようよ #sapporocpp

[24]

と、なると・・・

PCI コンフィギュレーション空間には何か有用な情報があるはず !!

Page 25: NVMe でハァハァしようよ #sapporocpp

[25]

PCI Express デバイスとしてチェック

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

Intel※ リトルエンディアン

拡張機能へのポインタ

Page 26: NVMe でハァハァしようよ #sapporocpp

[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 でハァハァしようよ #sapporocpp

[27]

素朴な疑問

PCI にどうすればアクセス出来るの?

Page 28: NVMe でハァハァしようよ #sapporocpp

[28]

WinRing0 ( 終了プロジェクト ) の紹介

諸事情により公開終了しています。

マニュアル完備

Page 29: NVMe でハァハァしようよ #sapporocpp

[29]

WinRing0.dll (WinRing0x64.dll)

WinRing0.vxd

WinRing0.sys WinRing0x64.sys

ユーザーモードRing3

カーネルモード

Ring0

WinRing0 の構成

Page 30: NVMe でハァハァしようよ #sapporocpp

[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 でハァハァしようよ #sapporocpp

[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"; }}

PCI コンフィギュレーション空間のダンプ

Page 32: NVMe でハァハァしようよ #sapporocpp

[32]NVMe の秘密 2

Page 33: NVMe でハァハァしようよ #sapporocpp

[33]

NVMe のコマンド体系

標準コマンド必須 3 種類

Admin コマンド

必須 10 種類

Page 34: NVMe でハァハァしようよ #sapporocpp

[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 でハァハァしようよ #sapporocpp

[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 でハァハァしようよ #sapporocpp

[36]

S.M.A.R.T. 情報の取得 (USB の場合 )

Page 37: NVMe でハァハァしようよ #sapporocpp

[37]

どうしたら・・・

NVMe SSD の S.M.A.R.T. 情報が

Windows 上から読めない !!!!!!!!!!

NVMe \ (^o^)/オワタ

Page 38: NVMe でハァハァしようよ #sapporocpp

[38]

神降臨

日本語の (*´Д`) ハァハァツイートに韓国の神から反応が !!

グローバルな活動が呼んだ奇跡か !?

Page 39: NVMe でハァハァしようよ #sapporocpp

[39]

神降臨

http://naraeon.net/

https://github.com/ebangin127/nvmetools

Page 40: NVMe でハァハァしようよ #sapporocpp

[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 でハァハァしようよ #sapporocpp

[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 でハァハァしようよ #sapporocpp

[42]

暫定版公開中 !!

Page 43: NVMe でハァハァしようよ #sapporocpp

[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 でハァハァしようよ #sapporocpp

[44]

NVMe SSD も見えるようになりました !!

地獄の個別対応が……

Page 45: NVMe でハァハァしようよ #sapporocpp

[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 でハァハァしようよ #sapporocpp

[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 でハァハァしようよ #sapporocpp

[47]

神プロジェクトは Delphi 製だった……ステップ実行のため体験版ゲット !!

余談

Page 48: NVMe でハァハァしようよ #sapporocpp

[48]まとめ

Page 49: NVMe でハァハァしようよ #sapporocpp

[49]

まとめ

NVMe SSD 今すぐ買いに走りましょ

う !!

Page 50: NVMe でハァハァしようよ #sapporocpp

[50]

まとめ

• オープンソースで公開するととても良いことが

起きることもある。

• テスト用機材は多少高くても買う。

⇒ 実機なしの開発は地獄。

• 今回の発表がきっかけで NVMe 対応出来ました。

⇒ この機会がなければかなり先になっていた !?• ハードウェア関連ソフトの開発は楽しいです。

⇒ (*´Д`) ハァハァ

Page 51: NVMe でハァハァしようよ #sapporocpp

[51]参考文献

Page 52: NVMe でハァハァしようよ #sapporocpp

[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 でハァハァしようよ #sapporocpp

[53]

ご清聴ありがとうございました