Mais conteúdo relacionado Semelhante a NVMe でハァハァしようよ #sapporocpp Semelhante a NVMe でハァハァしようよ #sapporocpp (20) NVMe でハァハァしようよ #sapporocpp 12. [12]
NVMe とは
NVM Express (NVMe) はホストソフトウェアと不揮発性
メモリ(Non-volatile memory)のインターフェースです。
NVMe は PCI Express で接続されるエンタープライズ向け
SSD およびクライアント向け SSD に最適化されています。
SSD 向け次世代インターフェース
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)
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
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]
// 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 コンフィギュレーション空間のダンプ
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 標準コマンド
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: これ以外の値だと動かない
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 コマンドを送る
Notas do Editor 会場をよく見て話をしよう! 前を向いて話す。
早口にならないように。
前を向いて話す。
早口にならないように。 前を向いて話す。
早口にならないように。
前を向いて話す。
早口にならないように。