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.

C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。

4,082 views

Published on

Boost.勉強会 #21 札幌 http://connpass.com/event/36509/ にて CrystalDiskInfo から NVMe デバイスの S.M.A.R.T. 情報を読み出す方法を熱く解説させていただきました。

実行ファイル&ソースコード:http://crystalmark.info/

Published in: Software
  • Be the first to comment

C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。

  1. 1. 1 C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。 Boost.勉強会 #21 札幌 #boostjp 宮崎 典行 Twitter: @openlibsys http://crystalmark.info/ 49PAGES
  2. 2. 2 自己紹介 NVMe について CrystalDiskMark CrystalDiskInfo まとめ
  3. 3. 3自己紹介 名前:宮崎 典行, hiyohiyo/ひよひよ 年齢:37歳 家族:妻, 愛娘, 愛息子 趣味:ソフトウェア開発 (約17年) 住所:北海道札幌市 代表作: CrystalDiskInfo, CrystalDiskMark 他(通称 Crystal シリーズ) パソコンがもっと好きになるソフトウェアを一貫して開発しています Microsoft MVP ・Visual C++ (Jan. 2014 – Sep. 2015) ・Visual Studio and Development Technologies (Oct. 2015 -)
  4. 4. 4 一枚の画像で表現すると…
  5. 5. 5自作ソフトウェア紹介 CrystalDiskInfo CrystalDiskMark CrystalMark 2004 CrystalCPUID
  6. 6. 6Windows Store デビュー!! Desktop App Converter サイコー
  7. 7. 7AmorphousDiskMark CrystalDiskMark の macOS 版!? katsura シェアウェア http://katsurashareware.com/index-j.html AmorphousDiskMark by @polydron
  8. 8. 8
  9. 9. 92016/12/26 札幌C++勉強会にて http://www.slideshare.net/hiyohiyo/20151228-nvme-sapporocpp 1年間の成果を報告します!!
  10. 10. 10 NVM Express
  11. 11. 11NVMe とは NVM Express (NVMe) SSD 向け次世代インターフェース 最大の特徴 速い!!
  12. 12. 12 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)
  13. 13. 13AHCI vs NVMe ベンチマーカー視点での最重要ポイント AHCI NVMe Queue 1 64K Commands/Queue 32 64K Q32T1 Q32T4 Q32T8 TOSHIBA PX04PMC080 800GB ランダム4KiBリード結果 (MB/s) テストサイズ: 1GiB
  14. 14. 14 CrystalDiskMark
  15. 15. 15CrystalDiskMark (2007年リリース) 出典:窓の杜 http://www.forest.impress.co.jp/article/2007/04/03/crystaldiskmark.html □プログラム名 CrystalDiskMark (くりすたるでぃすくまーく) □人気 ★ ★ ★ ★ ☆ 年間150万DL以上 (Shizuku Edition 含む) □開発動機 ストレージに特化すれば良いもの作れる? □アピールポイント • 縮小スクリーンショットでも全てがわかる • とにかくシンプル • 多言語対応 (40言語以上) □リスペクト • FDBENCH (EP82改/かず 氏) □ひとこと • 国内外でHDD/SSDの新製品評価に活用 □お詫び • Ver. 1.0~2.1までベンチマーク部に致命的 な不具合がありご迷惑をおかけしました。 ⇒ 最優先で修正に取り組み2.2で完治
  16. 16. 16CrystalDiskMark 3 CrystalDiskMark 3 従来手法(1MiBブロックの同期リード/ライト)では NVMe SSDのピーク速度が測定できない ⇩ 時代遅れなプロダクト
  17. 17. 17CrystalDiskMark 4/5 の開発 某I社 やぁ。ひよひよ。 開発中のNVMe SSDのベンチマーク結果が 振るわないんだけどなんとかならないかな? なんとかしたいのは山々だけど、NVMe SSD持って いないし、どうすれば良いのかわからないんだ。 某I社 OK! OK! サンプル送るから色々試してみてくれ。 出来るだけ早く対応よろしく!
  18. 18. 18 DiskSpd https://github.com/Microsoft/diskspd CrystalDiskMark 3 と 5 の構成 UI Core CrystalDiskMark 3 CrystalDiskMark 5 DiskMark.exe ベンチマーク部内製 DiskMark32.exe Microsoft製DiskSpd採用 ベンチマーク機能改善
  19. 19. 19CrystalDiskMark 3 と 5 の比較 CrystalDiskMark 3 CrystalDiskMark 5 マルチキュー&スレッド対応 ピーク速度測定に対応 TOSHIBA PX04PMC080 800GB シーケンシャルリード 3.4GB/s シーケンシャルリード 1.2GB/s
  20. 20. 20言わずにはいられない真実・・・ べっ、ベンチマークは スポーツだし⁉ エンタープライズなら きっとある!! でっ、でも・・・ こんな多数の並列処理って 本当にあるんでしょうか?
  21. 21. 21ベンチマーク結果 0 500 1000 1500 2000 2500 3000 3500 4000 Sequential Read Sequential Write Random 4KiB Read Random 4KiB Write TOSHIBA PX04PMC080 800GB (MB/s) Q1T1 Q4T1 Q16T1 Q32T1 Q32T4 Q32T8 1Queue/1Threadでは ピーク速度測定不可 Threadを増やす必要あり System: Shuttle SH170R6 CPU: Intel Core i7 6700T (2.8GHz) Memory: DDR4 2133MHz 16GB OS: Windows 10 Enterprise Ver.1607 (64bit)
  22. 22. 22 CrystalDiskInfo
  23. 23. 23CrystalDiskInfo (2008年リリース) 出典:窓の杜 http://www.forest.impress.co.jp/article/2008/05/23/crystaldiskinfo.html □プログラム名 CrystalDiskInfo (くりすたるでぃすくいんふぉ) □人気 ★ ★ ★ ★ ★ 年間300万DL以上 (Shizuku Edition 含む) □開発のきっかけ CrystalCPUID の開発が頓挫し打ちひしがれ ていた頃に出会った「月のお姫さまがホームス テイ」という設定のゲームに出てくる「司祭の お嬢さん」があまりにツボだったため。 □アピールポイント • 一部のUSB/RAID接続に対応 • スクリーンショットで概要を把握 • 多言語対応 (30言語以上) □リスペクト • なし □ひとこと • ディスク系ツールならメンテナンス不要と 考えていたのですが、SSDベンダーが多数 出現し個別対応が必要に……
  24. 24. 24NVMe 対応への道のり CrystalDiskInfo 7 PATA/SATA RAID USB (IEEE1394) NVMe
  25. 25. 25NVMe のコマンド体系 標準コマンド 必須3種類 Admin コマンド 必須10種類
  26. 26. 26Intel SSD 750 1.2TB
  27. 27. 27SAMSUNG SSD 950 PRO 512GB NVMe 調査のために購入
  28. 28. 28SAMSUNG SM951 128GB NVMe 調査のためだけに購入
  29. 29. 29TOSHIBA PX04PMC080 800GB TOSHIBA様から借用
  30. 30. 30S.M.A.R.T. | ATA Microsoft 製 ATA Driver ReadFile() ※Win32 API ATA PASS THROUGH 経由で 直接 ATA コマンドを送る ATA HDD/SSD SMART READ DATA ※ATA コマンド READ **** ※ATA コマンド データ読み出し S.M.A.R.T.
  31. 31. 31S.M.A.R.T. | NVMe (Win8.1) Microsoft 製 NVMe Driver (Win7/8/8.1/2012) ReadFile() ※Win32 API NVMe SSD Get Log Page ※NVMe コマンド Read ※NVMe 標準コマンド データ読み出し S.M.A.R.T. Admin コマンド を通さない!!
  32. 32. 32 どうしたら・・・ NVMe SSD の S.M.A.R.T. 情報が Windows 上から読めない!!!!!!!!!! NVMe \(^o^)/オワタ
  33. 33. 33神降臨 日本語の (*´Д`)ハァハァ ツイートに 韓国の神から反応が!! グローバルな活動が呼んだ奇跡か!?
  34. 34. 34神降臨 http://naraeon.net/ https://github.com/ebangin127/nvmetools
  35. 35. 35 神プロジェクトは Delphi 製だったorz ステップ実行のため体験版ゲット(>_<) 【余談】神は Delphi 使いだったorz
  36. 36. 36S.M.A.R.T. | SAMSUNG SSD 950 PRO Microsoft 製 NVMe Driver (Win 7/8/8.1/10/2012) ReadFile() ※Win32 API SAMSUNG SSD 950 PRO データ読み出し S.M.A.R.T. Security Command (SCSI) Get Log Page ※NVMe コマンド 秘密の裏口 からアクセス Read ※NVMe 標準コマンド SCSI PASS THROUGH 経由で 特殊な SCSI コマンドを送る
  37. 37. 37 ::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; // SMART Health Information 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 一部抜粋 //SMART Health Information
  38. 38. 38隠しコマンド大好き!! 秘密の裏口 大好きです!! 隠しコマンドが あるなんてビックリです‼
  39. 39. 39S.M.A.R.T. | Samsung SM951 Samsung 製 NVMe Driver ReadFile() ※Win32 API Samsung SM951 データ読み出し S.M.A.R.T. Get Log Page ※NVMe コマンド Read ※NVMe 標準コマンド NVMe PASS THROUGH (SM951専用) 経由で NVMe コマンドを送る
  40. 40. 40S.M.A.R.T. | Intel Intel 製 NVMe Driver ReadFile() ※Win32 API Intel SSD 750 データ読み出し S.M.A.R.T. Get Log Page ※NVMe コマンド Read ※NVMe 標準コマンド NVMe PASS THROUGH (Intel専用) 経由で NVMe コマンドを送る
  41. 41. 41S.M.A.R.T. | Storage Query (Win10) Microsoft 製 NVMe Driver ReadFile() ※Win32 API NVMe SSD データ読み出し S.M.A.R.T. Get Log Page ※NVMe コマンド Read ※NVMe 標準コマンド NVMe Storage Query 経由で NVMe コマンドを送る
  42. 42. 42 BOOL CAtaSmart::GetSmartAttributeNVMeStorageQuery (INT physicalDriveId, INT scsiPort, INT scsiTargetId, ATA_SMART_INFO* asi) { CString path; path.Format(L"¥¥¥¥.¥¥PhysicalDrive%d", physicalDriveId); HANDLE hIoCtrl = CreateFile(path, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); BOOL bRet = 0; StorageQuery::TStorageQueryWithBuffer nptwb; ZeroMemory(&nptwb, sizeof(nptwb)); nptwb.ProtocolSpecific.ProtocolType = StorageQuery::ProtocolTypeNvme; nptwb.ProtocolSpecific.DataType = StorageQuery::NVMeDataTypeLogPage; nptwb.ProtocolSpecific.ProtocolDataRequestValue = 2; // SMART Health Information nptwb.ProtocolSpecific.ProtocolDataRequestSubValue = 0xFFFFFFFF; nptwb.ProtocolSpecific.ProtocolDataOffset = sizeof(StorageQuery::TStorageProtocolSpecificData); nptwb.ProtocolSpecific.ProtocolDataLength = 4096; nptwb.Query.PropertyId = StorageQuery::StorageAdapterProtocolSpecificProperty; nptwb.Query.QueryType = StorageQuery::PropertyStandardQuery; DWORD dwReturned = 0; bRet = DeviceIoControl(hIoCtrl, IOCTL_STORAGE_QUERY_PROPERTY, &nptwb, sizeof(nptwb), &nptwb, sizeof(nptwb), &dwReturned, NULL); CloseHandle(hIoCtrl); memcpy_s(&(asi->SmartReadData), 512, nptwb.Buffer, 512); return bRet; } Win10新機能 | NVMe Storage Query 一部抜粋
  43. 43. 43ついに NVMe に対応!!
  44. 44. 44NVMe 対応状況 NVMe Driver SSD Microsoft Intel Samsung Win 10 Win 8.1 Intel SSD 750 〇 × 〇 - SAMSUNG SSD 950 PRO 〇 〇 - 〇 SAMSUNG SM951 〇 × - 〇 TOSHIBA PX04PMC080 〇 × - - TOSHIBA XG3 〇 × - - ZOTAC SONIX 〇 × - - 裏口: SAMSUNG SSD 950 PROのみ
  45. 45. 45 まとめ
  46. 46. 46まとめ CrystalDiskMark & CrystalDiskInfo NVMe対応
  47. 47. 47 参考文献
  48. 48. 48 • 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 参考文献
  49. 49. 49懇親会もよろしくお願いします!! キーワード: NVMe, ベンチマーク, Benchmark, AHCI, SSD, HDD, CPU, CPUID, ビデオカード, メガデモ, Final Reality, 3DMark, HDBENCH, WCPUID, Direct3D, OpenGL, MIDI, GS, XG, Photoshop, HiDPI, 8K, 5K, 4K, Displayport 1.3, Thunderbolt 3, HDMI 2.0, BIOS, EFI, SMBIOS, Firmware, 逆アセンブル, 逆コンパイル, カーネルモードドライバ, コードサイニング証明書, デジタル署名, x64, x86, i386, Win32, Win64, MFC, Visual C++, Visual C#, WinForms, WPF, DirectWrite, Windows 10, GDI, GDI+, リソースリーク, ハンドルリーク, メモリーリーク, クラッシュ, ブルースクリーン, S.M.A.R.T., PCI, PCIExpress, 10GbE, 10GBase-T, ダブルフォルト, 8月

×