</nav><p><strong>適用於:</strong></p>
讯享网
Windows 10
Windows Server 2016
瞭解如何從 Windows 應用程式使用高速 NVMe 裝置。 裝置存取是透過 StorNVMe.sys 啟用,這是 Windows Server 2012 R2 和 Windows 8.1 中首次推出的內建驅動程式。 Windows 7 裝置也可以透過 KB 熱修復來使用。 在 Windows 10 中,引進了數項新功能,包括廠商特定 NVMe 命令的傳遞機制,以及現有 IOCTL 的更新。
本主題提供一般使用 API 的概觀,可讓您用來存取 Windows 10 中的 NVMe 磁片磁碟機。 它也會描述:
如何使用傳遞傳送廠商特定的 NVMe 命令
如何將 識別、取得功能或取得記錄頁命令 傳送至 NVMe 磁片磁碟機
如何 從 NVMe 磁片磁碟機取得溫度資訊
如何執行行為變更命令,例如 設定溫度閾值
您可以使用下列一般用途 API 來存取 Windows 10 中的 NVMe 磁片磁碟機。 這些 API 可在 winioctl.h 中 尋找使用者模式應用程式,以及 核心模式驅動程式的 ntddstor.h 。 如需標頭檔的詳細資訊,請參閱 標頭檔 。
在 NVMe 規格中未定義的命令,是主機 OS 處理的最困難–主機無法深入瞭解命令在目標裝置、公開的基礎結構(命名空間/區塊大小)及其行為上可能具有的效果。
為了更妥善地透過 Windows 儲存體堆疊傳遞這類裝置特定命令,新的傳遞機制可讓廠商特定的命令透過管道傳送。 此傳遞管道也有助於開發管理和測試控管。 不過,此傳遞機制需要使用命令效果記錄檔。 此外,StoreNVMe.sys 需要命令記錄檔中所述的所有命令,而不只是傳遞命令。
命令效果記錄檔(如命令支援和效果中所述,NVMe 規格 1.2 的 5.10.1.5 節中所述)允許廠商特定命令與規格定義的命令之效果的描述。 這有助於命令支援驗證和命令列為優化,因此應該針對裝置支援的整個命令集實作。 下列條件描述如何根據命令效果記錄專案傳送命令的結果。
針對命令效果記錄檔中所述的任何特定命令...
期間 :
命令支援 (CSUPP) 設定為 '1',表示控制器支援命令 (位 01)
如果已設定下列任一項:
控制器功能變更 (CCC) 設定為 '1',表示命令可能會變更控制器功能 (位 04)
命名空間清查變更 (NIC) 設定為 '1',表示命令可能會變更數位,或多個命名空間的功能 (位 03)
命名空間功能變更 (NCC) 設定為 '1',表示命令可能會變更單一命名空間的功能 (Bit 02)
命令提交和執行 (CSE) 設定為 001b 或 010b,表示當相同或任何命名空間沒有其他未處理的命令時,命令可能會提交,而且在此命令完成之前,不應將另一個命令提交至相同或任何命名空間(位 18:16)
然後 ,命令將會以配接器唯一未處理的命令傳送。
讯享网
否則為 :
命令提交和執行 (CSE) 設定為 001b,表示當相同命名空間沒有其他未處理的命令時,可能會提交命令,而且在此命令完成之前,不應該將另一個命令提交至相同的命名空間(位 18:16)
然後 ,命令將會以唯一未完成的命令傳送給邏輯單元編號物件 (LUN)。
否則 ,命令會與其他未完成的命令一起傳送,而不會受到抑制。 例如,如果廠商特定的命令傳送至裝置以擷取未定義規格的統計資料,則應該不會有風險變更裝置的行為或執行 I/O 命令的功能。 這類要求可以與 I/O 平行處理,而且不需要暫停繼續。
您可以使用 Windows 10 中引進的 IOCTL_STORAGE_PROTOCOL_COMMAND 來執行 傳遞。 此 IOCTL 設計成具有與現有 SCSI 和 ATA 傳遞 IOCTL 類似的行為,以將內嵌命令傳送至目標裝置。 透過此 IOCTL,傳遞可以傳送至存放裝置,包括 NVMe 磁片磁碟機。
例如,在 NVMe 中,IOCTL 會允許傳送下列命令代碼。
廠商特定管理員命令 (C0h – FFh)
廠商特定的 NVMe 命令 (80h – FFh)
如同所有其他 IOCTL,請使用 DeviceIoControl 將傳遞 IOCTL 向下傳送。 IOCTL 會使用 ntddstor.h 中找到 的 STORAGE_PROTOCOL_COMMAND輸入緩衝區結構來填入。 使用廠商特定的命令填入 [命令 ] 欄位。
讯享网
想要傳送的廠商特定命令應該填入上方醒目提示的欄位中。 再次請注意,必須針對傳遞命令實作命令效果記錄檔。 特別是,這些命令必須回報為命令效果記錄檔中支援的命令(如需詳細資訊,請參閱上一節)。 另請注意,PRP 欄位是驅動程式特定的欄位,因此傳送命令的應用程式可以將它們保留為 0。
最後,此傳遞 IOCTL 是用來傳送廠商特定命令。 若要傳送其他系統管理員或非廠商特定的 NVMe 命令,例如識別,則不應該使用此傳遞 IOCTL。 例如, IOCTL_STORAGE_QUERY_PROPERTY 應該用於識別或取得記錄頁。 如需詳細資訊,請參閱下一節 通訊協定特定的查詢。
韌體下載和啟用命令不應使用傳遞傳送。 IOCTL_STORAGE_PROTOCOL_COMMAND只應該用於廠商特定的命令。
請改用下列一般記憶體 IOCTL(在 Windows 10 中引進)以避免應用程式直接使用SCSI_miniport版本的韌體 IOCTL。 儲存體 驅動程式會將IOCTL轉譯為SCSI命令或IOCTL SCSI_miniport版本轉譯為迷你埠。
建議在 Windows 10 和 Windows Server 2016 中開發韌體升級工具:
IOCTL_STORAGE_FIRMWARE_GET_INFO
IOCTL_STORAGE_FIRMWARE_DOWNLOAD
IOCTL_STORAGE_FIRMWARE_ACTIVATE
為了取得記憶體資訊和更新韌體,Windows 也支援 PowerShell Cmdlet 快速執行這項操作:
類似於 SCSI 和 ATA 傳遞 IOCTLs,當命令/要求傳送至迷你埠或裝置時,IOCTL 會在成功或未成功時傳回。 在 STORAGE_PROTOCOL_COMMAND 結構中,IOCTL 會透過 ReturnStatus 字段傳回狀態。
在此範例中,會透過傳遞至 NVMe 磁碟驅動器,將任意廠商特定命令 (0xFF) 傳送。 下列程式代碼會配置緩衝區、初始化查詢,然後透過DeviceIoControl將命令向下傳送至裝置。
在此範例中,我們預期 命令是否成功到裝置。
Windows 8.1 引進 IOCTL_STORAGE_QUERY_PROPERTY 來擷取數據。 在 Windows 10 中,IOCTL 已增強,以支援常用的 NVMe 功能,例如 取得記錄頁 、 取得功能 及 識別 。 這可讓您擷取 NVMe 特定資訊以進行監視和清查。
此處會顯示 IOCTL 的輸入緩衝區, STORAGE_PROPERTY_QUERY (來自 Windows 10)。
讯享网
使用IOCTL_STORAGE_QUERY_PROPERTY 擷取STORAGE_PROTOCOL_DATA_DESCRIPTOR中的 NVMe 通訊協定特定資訊時,請設定STORAGE_PROPERTY_QUERY 結構,如下所示:
配置可同時包含STORAGE_PROPERTY_QUERY 和STORAGE_PROTOCOL_SPECIFIC_DATA 結構的緩衝區。
將 PropertyID 字段設定為 儲存體 AdapterProtocolSpecificProperty 或 儲存體 控制器或裝置/命名空間要求的 儲存體 DeviceProtocolSpecificProperty 。
將 QueryType 字段設定為 PropertyStandardQuery 。
以所需的值填入 STORAGE_PROTOCOL_SPECIFIC_DATA 結構。 STORAGE_PROTOCOL_SPECIFIC_DATA的 開頭是 STORAGE_PROPERTY_QUERY 的 AdditionalParameters 字段。
此處會顯示STORAGE_PROTOCOL_SPECIFIC_DATA 結構(來自 Windows 10)。
若要指定 NVMe 通訊協定特定資訊的類型,請設定 STORAGE_PROTOCOL_SPECIFIC_DATA 結構,如下所示:
將 ProtocolType 字段設定為 ProtocolTypeNVMe 。
將 DataType 欄位設定為STORAGE_PROTOCOL_NVME_DATA_TYPE所 定義的列舉值:
使用 NVMeDataTypeIdentify 取得識別控制器數據或識別命名空間數據。
使用 NVMeDataTypeLogPage 來取得記錄頁面(包括 SMART/health 數據)。
使用 NVMeDataTypeFeature 取得 NVMe 磁碟驅動器的功能。
當 ProtocolTypeNVMe 做為 ProtocolType 時,可以與 NVMe 磁碟驅動器上的其他 I/O 平行擷取通訊協定特定資訊的查詢。
下列範例示範 NVMe 通訊協定特定的查詢。
在此範例中 ,識別 要求會傳送至 NVMe 磁碟驅動器。 下列程式代碼會初始化查詢數據結構,然後透過DeviceIoControl將命令向下傳送至裝置。
讯享网
請注意,呼叫端必須配置包含STORAGE_PROPERTY_QUERY的單一緩衝區,以及STORAGE_PROTOCOL_SPECIFIC_DATA的大小。 在此範例中,它會針對屬性查詢的輸入和輸出使用相同的緩衝區。 這就是為什麼配置的緩衝區大小為 「FIELD_OFFSET(STORAGE_PROPERTY_QUERY, AdditionalParameters) + sizeof(STORAGE_PROTOCOL_SPECIFIC_DATA) + NVME_MAX_LOG_SIZE” 雖然可以針對輸入和輸出配置不同的緩衝區,但我們建議使用單一緩衝區來查詢 NVMe 相關信息。
identifyControllerData-NN> 是命名空間數目 (NN)。 Windows 會將命名空間偵測為實體磁碟驅動器。
在此範例中,根據上一個要求, 取得記錄頁 要求會傳送至 NVMe 磁碟驅動器。 下列程式代碼會準備查詢數據結構,然後透過DeviceIoControl將命令向下傳送至裝置。
呼叫端可以使用STORAGE_PROPERTY_ID 儲存體 AdapterProtocolSpecificProperty ,且其STORAGE_PROTOCOL_SPECIFIC_DATA 或STORAGE_PROTOCOL_SPECIFIC_DATA_EXT 結構設定為要求 512 位元組的廠商特定數據區塊。
在此範例中,根據上一個要求, 取得功能 要求會傳送至 NVMe 磁碟驅動器。 下列程式代碼會準備查詢數據結構,然後透過DeviceIoControl將命令向下傳送至裝置。
讯享网
從 Windows 10 19H1 開始,IOCTL_STORAGE_SET_PROPERTY已增強以支援 NVMe 設定功能。
IOCTL_STORAGE_SET_PROPERTY的輸入緩衝區如下所示:
使用IOCTL_STORAGE_SET_PROPERTY設定 NVMe 功能時,請設定STORAGE_PROPERTY_SET結構,如下所示:
配置可同時包含STORAGE_PROPERTY_SET和STORAGE_PROTOCOL_SPECIFIC_DATA_EXT結構的緩衝區;
將 PropertyID 字段分別設定為 儲存體 AdapterProtocolSpecificProperty 或 儲存體 DeviceProtocolSpecificProperty 控制器或裝置/命名空間要求。
以所需的值填入STORAGE_PROTOCOL_SPECIFIC_DATA_EXT結構。 STORAGE_PROTOCOL_SPECIFIC_DATA_EXT的開頭是 STORAGE_PROPERTY_SET 的 AdditionalParameters 字段。
此處會顯示STORAGE_PROTOCOL_SPECIFIC_DATA_EXT結構。
讯享网
若要指定要設定的 NVMe 功能類型,請設定STORAGE_PROTOCOL_SPECIFIC_DATA_EXT結構,如下所示:
將 ProtocolType 字段設定為 ProtocolTypeNvme;
將 DataType 字段設定為STORAGE_PROTOCOL_NVME_DATA_TYPE所定義的列舉值 NVMeDataTypeFeature;
下列範例示範 NVMe 功能集。
在此範例中,「設定功能」要求會傳送至 NVMe 磁碟驅動器。 下列程式代碼會準備設定數據結構,然後透過DeviceIoControl將命令向下傳送至裝置。
在 Windows 10 中, IOCTL_STORAGE_QUERY_PROPERTY 也可以用來查詢 NVMe 裝置的溫度數據。
若要從STORAGE_TEMPERATURE_DATA_DESCRIPTOR中的 NVMe 磁碟驅動器擷取溫度資訊,請設定STORAGE_PROPERTY_QUERY 結構,如下所示:
配置可包含 STORAGE_PROPERTY_QUERY 結構的緩衝區。
將 PropertyID 字段分別設定為控制器或裝置/命名空間要求的 儲存體 AdapterTemperatureProperty 或 儲存體 DeviceTemperatureProperty 。
將 QueryType 字段設定為 PropertyStandardQuery 。
此處 會顯示STORAGE_TEMPERATURE_INFO 結構(從 Windows 10)。
讯享网
操作裝置屬性或可能影響裝置行為的命令,較難讓操作系統處理。 如果在處理 I/O 時,裝置屬性在運行時間變更,如果無法正確處理,可能會發生同步處理或數據完整性問題。
NVMe Set-Features 命令是變更命令行為的良好範例。 它允許變更仲裁機制和溫度閾值的設定。 為了確保當行為影響集命令關閉時,內部數據不會有風險,Windows 會將所有 I/O 暫停至 NVMe 裝置、清空佇列和排清緩衝區。 成功執行 set 命令之後,I/O 會繼續執行(可能的話)。 如果無法繼續 I/O,可能需要裝置重設。
Windows 10 引進 IOCTL_STORAGE_SET_TEMPERATURE_THRESHOLD ,這是用於取得和設定溫度閾值的 IOCTL。 您也可以使用它來取得裝置的目前溫度。 這個 IOCTL 的輸入/輸出緩衝區是上一 個程式代碼區段中的STORAGE_TEMPERATURE_INFO 結構。
在此範例中,會設定NVMe磁碟驅動器的超臨界值溫度。 下列程式代碼會準備命令,然後透過 DeviceIoControl 將其向下傳送至裝置。
如果沒有命令效果記錄檔,驅動程式就不知道命令的影響。 這就是需要命令效果記錄檔的原因。 它可協助操作系統判斷命令是否具有很高的影響,以及是否可以與其他命令平行傳送至磁碟驅動器。
命令效果記錄還不夠細微,無法包含廠商特定的 Set-Features 命令。 基於這個理由,尚無法傳送廠商特定的 Set-Features 命令。 不過,您可以使用先前討論的傳遞機制來傳送廠商特定的命令。 如需詳細資訊,請參閱 傳遞機制。
下列檔案與 NVMe 開發相關。 這些檔案隨附於 Microsoft Windows 軟體開發工具包 (SDK) 中。
頭檔 描述
ntddstor.h 定義常數和類型,以從核心模式存取記憶體類別驅動程式。
nvme.h 針對其他 NVMe 相關數據結構。
winioctl.h 針對整體 Win32 IOCTL 定義,包括使用者模式應用程式的記憶體 API。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/183424.html