Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

39,176 views

Published on

20151226 に開催された Sapporo.cpp / 札幌C++勉強会 #10
http://sapporocpp.connpass.com/event/22616/
にて、NVMe の魅力について熱く紹介させていただきました。

Published in: Software
  • Be the first to comment

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

  1. 1. [1] hiyohiyo Twitter: @openlibsys http://crystalmark.info/ Sapporo.cpp / 札幌C++勉強会 #10 @クリプトン・フューチャー・メディア
  2. 2. [2] 発表内容 自己紹介 NVMe とは? ベンチマーク NVMe の秘密 まとめ
  3. 3. [3] 自己紹介
  4. 4. [4] 自己紹介 名前:hiyohiyo/ひよひよ 年齢:37歳 家族:妻, 愛娘, 愛息子 趣味:ソフトウェア開発 (約17年) 住所:北海道札幌市 代表作: CrystalDiskInfo, CrystalDiskMark 他(通称 Crystal シリーズ) パソコンがもっと好きになるソフトウェアを一貫して開発しています Microsoft MVP ・Visual C++ (Jan. 2014 – Sep. 2015) ・Visual Studio and Development Technologies (Oct. 2015 -)
  5. 5. [5] CrystalMark 2004 ランキング対応ベンチマーク
  6. 6. [6] CrystalCPUID CPU情報ツール
  7. 7. [7] CrystalDiskMark 5 Shizuku Edition 新世代ディスクベンチマーク ベンチマーク結果なんておまけですwww 通常版
  8. 8. [8] CrystalDiskInfo 6 Shizuku Edition HDDやSSDの健康状態を音声で教えてくれる!! 新世代ディスク情報ツール 通常版
  9. 9. [9]
  10. 10. [10] 【宣伝】第二世代萌え駆動開発 http://www.slideshare.net/hiyohiyo/mddwin32 ソフトウェア開発で一番大切 なことを紹介しています!!
  11. 11. [11] NVMe とは?
  12. 12. [12] NVMe とは NVM Express (NVMe) はホストソフトウェアと不揮発性 メモリ(Non-volatile memory)のインターフェースです。 NVMe は PCI Express で接続されるエンタープライズ向け SSD およびクライアント向け SSD に最適化されています。 SSD 向け次世代インターフェース
  13. 13. [13]0 500 1000 1500 2000 2500 3000 3500 4000 NVMe @PCIe 3.0x4 SATA/600 SATA/300 SATA/150 UDMA/100 UDMA/66 UDMA/33 転送レート (MB/s)
  14. 14. [14] AHCI vs NVMe ベンチマーカー視点での最重要ポイント AHCI NVMe Queue 1 65536 Commands/Queue 32 65536 1x1 32x1 32x8 SAMSUNG SSD 950 PRO 512GB の ランダムリードベンチマーク結果 (MB/s)
  15. 15. [15] Intel SSD 750 1.2TB
  16. 16. [16] SAMSUNG SSD 950 PRO 512GB NVMe 調査のためだけに購入
  17. 17. [17] SAMSUNG SSD 950 PRO vs Intel SSD 750 SAMSUNG SSD 950 PRO Intel SSD 750 ※Microsoft 標準ドライバ
  18. 18. [18] Intel SSD 750 ドライバ比較 Intel NVMe Driver Microsoft 標準ドライバ
  19. 19. [19] NVMe の秘密 1
  20. 20. [20] 突然ですがクイズです! ??? NVMe SSD はストレージであると 同時に○○○ デバイスです。
  21. 21. [21] ヒント 1 Intel 製品の Vendor ID は 8086h
  22. 22. [22] ヒント 2 ○○○ Express
  23. 23. [23] 実は・・・ PCI Express デバイスでもあるのです!!
  24. 24. [24] と、なると・・・ PCI コンフィギュレーション空間 には何か有用な情報があるはず!!
  25. 25. [25] PCI Express デバイスとしてチェック 出典: http://www.nvmexpress.org/wp-content/uploads/NVM-Express-1_2a.pdf Intel ※リトルエンディアン 拡張機能へのポインタ
  26. 26. [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. 27. [27] 素朴な疑問 PCI にどうすれば アクセス出来るの?
  28. 28. [28] WinRing0 (終了プロジェクト) の紹介 諸事情により公開終了しています。 マニュアル完備
  29. 29. [29] ユーザーモード Ring3 カーネルモード Ring0 WinRing0 の構成
  30. 30. [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. 31. [31] // Host Bridge address = ols.FindPciDeviceByClass(0x06, 0x00, 0x00, 0); if (address != 0xFFFFFFFF) { str += "[PCI Confguration Space Dump] HostBridgern"; str += " 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0Frn"; str += "---------------------------------------------------rn"; 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 += "rn"; } } PCI コンフィギュレーション空間のダンプ
  32. 32. [32] NVMe の秘密 2
  33. 33. [33] NVMe のコマンド体系 標準コマンド 必須3種類 Admin コマンド 必須10種類
  34. 34. [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. 35. [35] S.M.A.R.T. 情報の取得 (ATAの場合) Microsoft 製 ATA Driver ATA HDD/SSD S.M.A.R.T. にアクセス するためのコマンドReadFile() ※Win32API READ **** ※ATA コマンド SMART READ DATA ATA PASS THROUGH という仕組み を使って直接 ATA コマンドを送る
  36. 36. [36] S.M.A.R.T. 情報の取得 (USBの場合)
  37. 37. [37] どうしたら・・・ NVMe SSD の S.M.A.R.T. 情報が Windows 上から読めない!!!!!!!!!! NVMe \(^o^)/オワタ
  38. 38. [38] 神降臨 日本語の (*´Д`)ハァハァ ツイートに 韓国の神から反応が!! グローバルな活動が呼んだ奇跡か!?
  39. 39. [39] 神降臨 http://naraeon.net/ https://github.com/ebangin127/nvmetools
  40. 40. [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. 41. [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 IN sptwb.Spt.Cdb[1] = 0xFE; // SAMSUNG PROTOCOL sptwb.Spt.Cdb[3] = 6; // Get Log Page sptwb.Spt.Cdb[9] = 0x40; // Transfer Length sptwb.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. 42. [42] 暫定版公開中!!
  43. 43. [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. 44. [44] NVMe SSDも 見えるように なりました!! 地獄の個別対応が……
  45. 45. [45] S.M.A.R.T. の形式が全然違う!! SAMSUNG SSD 830 512GB (SATA) SAMSUNG SSD 950 PRO 512GB (NVMe) S.M.A.R.T. 形式の比較
  46. 46. [46] S.M.A.R.T. の形式が全然違う!! SAMSUNG SSD 830 512GB (SATA) SAMSUNG SSD 950 PRO 512GB (NVMe) S.M.A.R.T. 形式の比較
  47. 47. [47] 神プロジェクトは Delphi 製だった…… ステップ実行のため体験版ゲット!! 余談
  48. 48. [48] まとめ
  49. 49. [49] まとめ NVMe SSD 今すぐ買いに走りましょう!!
  50. 50. [50] まとめ • オープンソースで公開するととても良いことが 起きることもある。 • テスト用機材は多少高くても買う。 ⇒ 実機なしの開発は地獄。 • 今回の発表がきっかけでNVMe対応出来ました。 ⇒ この機会がなければかなり先になっていた!? • ハードウェア関連ソフトの開発は楽しいです。 ⇒ (*´Д`)ハァハァ
  51. 51. [51] 参考文献
  52. 52. [52] • nvmexpress.org http://www.nvmexpress.org/ • NVM Express 1.2a Specification http://www.nvmexpress.org/wp-content/uploads/NVM-Express-1_2a.pdf • Naraeon NVMe Tools https://github.com/ebangin127/nvmetools 参考文献
  53. 53. [53] ご清聴ありがとうございました

×