NVMe · 規格與原理

NVMe SQ Associations:從儲存歸屬到 I/O 佇列分流

00.01.主機知道每筆 I/O 要讀寫哪個 namespace,但控制器也需要知道:這個提交佇列預計服務哪一組儲存空間?SQ Associations 讓主機在建立佇列時提供這項提示。本文把儲存歸屬、佇列配置與命令分流接起來,說明提示何時有幫助,以及為什麼「命令完成」還不足以證明分流正確。

SQ Associations
提交佇列關聯;建立 SQ 時,提示控制器這個佇列預計服務哪個 NVM Set。
namespace
主機以 NSID 指定的一份邏輯儲存空間。
I/O
Input/Output,對 namespace 執行資料輸入與輸出的操作類別。
SQ
Submission Queue,提交佇列;主機放置待執行命令的記憶體佇列。

這篇的主軸

01

看懂三種關係

01-01namespace 屬於哪個 NVM Set,SQ 關聯哪個 Set,完成結果送往哪個 CQ:這三種關係各回答不同問題,不能因為編號接近就混在一起。

NVM Set
在邏輯上與其他集合分開的一組非揮發性儲存,可包含多個 namespace。
NVM
Non-Volatile Memory,斷電後仍能保存資料的記憶體。
CQ
Completion Queue,完成佇列;控制器放置命令完成結果的記憶體佇列。
02

確認提示的前提

02-01先查控制器能力,再分清 Predictable Latency Mode 是否啟用、Set 目前處於哪種工作視窗。支援位元本身沒有提供固定的應用程式延遲上限。

Predictable Latency Mode
可預測延遲模式;以 NVM Set 為單位,在符合操作條件的工作視窗提供確定性讀寫延遲。
03

把儲存清單接到建立命令

03-01讀出 Set 的實際識別值及 namespace 歸屬,再放進 Create I/O SQ。清單索引、byte 位置與識別值各有用途,64 筆佇列也有自己的數量編碼。

04

用每筆 I/O 檢查分流

04-01從命令 NSID 找到 Set,再選已關聯該 Set 的 SQ。比較建立參數錯誤與後續送錯佇列,理解規格對兩者規定的不同後果。

NSID
Namespace Identifier;I/O 命令用來指定 namespace 的識別值。

00.02.預備知識是 OS、Computer Organization 與基本 SSD 概念。本文的 Set 7/9、SQ3/4/5、CQ2 與 namespace 編號均為說明性範例;能力與可用編號以裝置實際回覆為準。

00.03.從「這筆 I/O 應送到哪個佇列」出發,先建立全貌,再逐步追蹤查詢、欄位與結果。

把主軸連起來

00.04.同一組例子貫穿本文:namespace A、B 在 Set 7,C 在 Set 9。主機讓 SQ3、SQ4 服務 Set 7,SQ5 服務 Set 9,而完成結果可以共用 CQ2。讀完應能說明每個編號從哪裡取得、填在哪裡,以及後續怎樣選對 SQ。

00.05.SQ Associations 是配合 Predictable Latency Mode 的選用提示。提示是否受支援、提示是否正確、模式當下能提供什麼服務品質,需要分別確認。

01 把佇列用途告訴控制器

01.01.SQ Associations 讓主機在建立 I/O Submission Queue 時,提供該 SQ 對應的 NVM Set,作為控制器在 Predictable Latency Mode 下改善效能的提示。這是選用能力;Predictable Latency Mode 不依賴主機一定使用 SQ Associations。

來源:Base 2.4 §8.1.28

來源:NVME-BASE-2.4, Rev. 2.4, §8.1.28, 文件頁 732-733, PDF 頁 758-759

先辨認三種物件

01.02.namespace 是命令要存取的邏輯儲存空間;NVM Set 是可配置出 namespace、也可保留未配置空間的儲存集合;SQ 是主機放置待執行命令的佇列。它們分別回答「存取誰、屬於哪組儲存、從哪裡提交」。不能把 SQ 的記憶體空間當作 namespace 的資料容量。

關聯描述的是 SQ 的預定用途

01.03.主機把某個 SQ 關聯到 Set 7,意思是打算把 Set 7 內 namespace 的 I/O 送到這個 SQ。這項關聯不會建立 namespace,也不會把原本屬於 Set 9 的 namespace 搬到 Set 7。I/O 命令本身仍以 NSID 指定真正的資料對象。

儲存歸屬、工作提示、完成路徑各有一條關係由上往下追蹤。上層是 namespace 的儲存歸屬;中層表示主機為各 SQ 選擇相符的 Set;下層只表示完成結果匯入同一 CQ。這些連線不表示把 namespace 容量搬進主機佇列。來源:Base §3.2.2、§3.3、§5.3.2、§8.1.28。NVM Set 7A: NSID11 · B: NSID12NVM Set 9C: NSID21SQ3 + SQ4NVMSETID = 7SQ5NVMSETID = 9CQ2完成結果共用;Set 歸屬維持不變
由上往下追蹤。上層是 namespace 的儲存歸屬;中層表示主機為各 SQ 選擇相符的 Set;下層只表示完成結果匯入同一 CQ。這些連線不表示把 namespace 容量搬進主機佇列。來源:Base §3.2.2、§3.3、§5.3.2、§8.1.28。
NVMSETID
NVM Set Identifier;Set 的 16-bit 識別值,和 SQ 編號、NSID 都不同。

為什麼要讓控制器知道

01.04.Predictable Latency Mode 以 NVM Set 為單位提供服務品質屬性。若主機把不同 Set 的工作混在同一個 SQ,控制器比較難單靠佇列判斷工作所屬;提供關聯並遵守分流規則,讓佇列資訊能配合 Set 層級的處理。規格沒有替這項提示指定固定的加速倍數。

提示、模式與延遲保證分別看

01.05.支援 SQ Associations、已建立 SQ 關聯、已啟用 Predictable Latency Mode,是三個不同狀態。建立 SQ 關聯不會順便把模式打開;模式也可以在不使用此選用提示的情況下運作。主機若希望取得關聯的效益,還必須持續按正確 Set 分流。

閱讀相關規格圖表 → 把佇列用途告訴控制器

02 支援能力、模式狀態與工作視窗

02.01.支援 SQ Associations 的控制器必須在 CTRATT 同時宣告 SQA、NVM Sets 與 Predictable Latency Mode 支援。這些支援位元不表示每個 Set 目前都已啟用模式,也不表示目前處於可提供確定性延遲的視窗。

CTRATT
Controller Attributes;Identify Controller 中由多個能力 bit 組成的屬性欄位。
SQA
SQ Associations;CTRATT 中表示是否支援提交佇列關聯的 bit。
來源:Base 2.4 §8.1.28

來源:NVME-BASE-2.4, Rev. 2.4, §8.1.28, 文件頁 732-733, PDF 頁 758-759

02.02.Predictable Latency Mode 有 DTWIN/NDWIN;DTWIN 的確定性依賴操作限制與當時狀態,SQ 提示不會取消這些條件。

DTWIN
Deterministic Window;Set 可以提供確定性讀寫延遲的工作視窗。
NDWIN
Non-Deterministic Window;Set 準備下一個 DTWIN,無法提供確定性讀寫延遲的工作視窗。
來源:Base 2.4 §8.1.21

來源:NVME-BASE-2.4, Rev. 2.4, §8.1.21, 文件頁 682-683, PDF 頁 708-709

先讀控制器的能力宣告

02.03.Identify Controller 的 CTRATT 位於 bytes 99:96。SQA bit 8 為 1 表示支援 SQ Associations;同時必須有 NSETS bit 2 與 PLM bit 5。這三個 bit 是不同能力,不可只看到支援 NVM Sets,就自行推論控制器也支援 SQ Associations。

NSETS
NVM Sets;CTRATT 中表示是否支援 NVM 集合的 bit。
PLM
Predictable Latency Mode;CTRATT 中表示是否支援可預測延遲模式的 bit。

支援不等於目前已啟用

02.04.模式是以 NVM Set 為單位配置的。假設 Set 7 已啟用 Predictable Latency Mode,Set 9 沒有啟用,兩者仍可存在於宣告 PLM 支援的同一個控制器內。本篇設定 SQ 關聯的命令不會取代模式配置;範例的效益討論以相關 Set 已啟用該模式為前提。

同一個控制器,三種問題要分別回答
觀察到的資訊足以說明什麼還不能據此推出什麼
CTRATT 三個 bit 為 1控制器支援 SQA、NVM Sets、PLMSet 7 現在已啟用模式
Set 7 已啟用模式該 Set 使用模式的工作視窗規則此刻必定在 DTWIN
Set 7 目前在 DTWIN現在能在符合條件時提供確定性延遲主機可無限增加工作量,或保證全部 PCIe 延遲
SQ3 已關聯 Set 7控制器收到此 SQ 的預定用途主機之後一定送對每筆 I/O
由支援走到實際效果,中間仍有設定、視窗及主機分流條件。來源:Base §8.1.28、§8.1.21、Figure 338。
PCIe
PCI Express,NVMe memory-based controller 使用的 transport 與裝置互連。

模式內還有兩種工作視窗

02.05.例如 Set 7 在 DTWIN 接收讀寫,之後進入 NDWIN 準備下一個視窗;這時延遲性質已改變,SQ3 關聯 Set 7 的設定卻可以保持不變。規格的服務品質描述適用於 subsystem 內部,不涵蓋 PCIe 傳輸路徑的全部延遲。因此不能僅靠 SQA=1 保證應用程式端的每次 I/O 延遲。

保持正確路由仍不足以無限延長 DTWIN

02.06.DTWIN 還受到讀取量、最佳寫入大小的寫入量、視窗時間及廠商定義屬性限制;若超過相關典型或最大值,或發生需控制器立即處理的 Deterministic Excursion,Set 可能轉入 NDWIN。SQ 關聯幫助工作分組,但沒有取消這些模式規則。

Deterministic Excursion
subsystem 中罕見但需要控制器立即處理的事件,可能讓 Set 離開 DTWIN。
閱讀相關規格圖表 → 支援能力、模式狀態與工作視窗

03 先建立 namespace 到 Set 的對照

03.01.主機需要兩份資訊:NVM Set List 說明控制器可存取哪些 Set,Identify Namespace 則說明指定 namespace 屬於哪個 Set。清單位置、NVM Set Identifier 與 NSID 是不同數值,不能用同一個編號代替。

來源:Base 2.4 §5.2.14.2.4

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.14.2.4, 文件頁 388-389, PDF 頁 414-415

03.02.CNS=08h 對 目前可存取的 NSID 回 namespace 結構;NVMSETID 位於 bytes 11:10。inactive NSID 回全零資料,不能當有效歸屬。

CNS
Controller or Namespace Structure;Identify 用來選擇回覆哪種資料的欄位。
來源:Base 2.4 §5.2.14.2.8

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.14.2.8, 文件頁 390,393, PDF 頁 416,419

用 CNS 選正確的問題

03.03.Identify 的 CNS=01h 取得控制器能力,CNS=04h 取得 NVM Set List,CNS=08h 取得指定 namespace 的 I/O Command Set Independent 資料。CNS 放在 CDW10 bits 7:0;CNS=04h 用 CDW11 的 CNSSID 低 16 bits 提供清單起始 Set 編號,CNS=08h 則以命令 NSID 選 namespace。

CNSSID
CNS Specific Identifier;用途由 CNS 選項決定的識別欄位。
CDW
CDW(Command Dword);命令中的 32-bit 欄位單位,例如 CDW10 的 10 是欄位 index,不是 byte offset。

清單的數量與位置要各自計算

03.04.NVM Set List 前 128 bytes 是 header,NUMENT 在 byte 0,直接表示 0~31 筆。每筆 entry 為 128 bytes,所以索引 i 的起點為 128+i×128。NUMENT=0 就是空清單,不把後面的補零區解成 Set 0;最多 31 筆加 header 正好是 4096 bytes。

NUMENT
Number of Entries;這份清單中實際回傳的項目數。
header
資料結構的前置區;NVM Set List 的前 128 bytes 保存項目數與保留空間。
entry
清單中的一筆資料;此處每筆 NVM Set Attributes Entry 為 128 bytes。
清單位置不是 Set 識別值
清單內的索引整份清單的 byte 範圍entry 內的 NSETID建立 SQ 時使用
0128~2557CDW12=00000007h
1256~3839CDW12=00000009h
說明性範例 NUMENT=2。先用位置找到資料,再從資料取識別值;不要把左邊的 0/1 或 128/256 填成 Set ID。來源:Base Figures 344/345/578。
NSETID
NVM Set Identifier;NVM Set Attributes Entry 內對 Set 識別欄位使用的縮寫。

起始識別值使用大於或等於

03.05.CNS=04h 回傳的 Set 識別值從指定起點開始,採大於或等於,並按識別值排序。若上一批最後一個 NSETID 是 37,而還要繼續查,可以用 38 當下一次起點,避免又取回 37。這個起點是識別值,不是第幾頁,也不是記憶體 byte offset。若到 FFFFh 就不能再加 1 回繞成 0。

byte offset
相對資料結構起點、以 byte 計算的距離;不等於項目索引或識別值。
offset
offset;從指定起點算出的位移。它回答「離起點多遠」,不等於 index。

從 namespace 的回覆找歸屬

03.06.對有效且目前可透過該控制器存取的 NSID 使用 CNS=08h,回覆 bytes 11:10 的 NVMSETID 指出其 Set。若查 inactive NSID,回的是全零結構,不能把它當成「有效 namespace 屬於 Set 0」。不支援 NVM Sets 或 namespace 沒有已格式化儲存空間時,此欄也為 0,因此要連同查詢條件判斷。

能力或配置改變後,對照表也要跟著更新

03.07.命令的 NSID 決定真正的資料對象,主機保存的對照表只是目前認識。若 namespace 被刪除或配置已變,不能繼續拿舊的 NSID→Set→SQ 關係送命令。建立 SQ 前先確認目標 Set 在可用清單中,之後也要讓路由與目前有效的 namespace 配置一致。

閱讀相關規格圖表 → 先建立 namespace 到 Set 的對照

04 建立 SQ 時,同時指定 Set 與完成佇列

04.01.Create I/O Submission Queue 的 CDW12.NVMSETID 建立 SQ 與 Set 的關聯;CDW11.CQID 則指定完成結果送往哪個 CQ。兩個欄位用途不同。NVMSETID=0 或不支援 SQA 時不建立特定 Set 關聯;SQA 支援時指定清單外的非零 Set,命令必須以 Invalid Field in Command 中止。

CQID
Completion Queue Identifier;這個 SQ 的完成項目要送往哪個 CQ。
來源:Base 2.4 §5.3.2

來源:NVME-BASE-2.4, Rev. 2.4, §5.3.2, 文件頁 529-531, PDF 頁 555-557

04.02.PCIe 的多個 SQ 可以使用同一個 CQ;共用完成佇列不會取代各 SQ 的 Set 關聯。

來源:Base 2.4 §3.3

來源:NVME-BASE-2.4, Rev. 2.4, §3.3, 文件頁 88, PDF 頁 114

先準備完成結果的去處

04.03.CQ 保存完成項目,SQ 保存待執行命令。Create I/O SQ 的 CQID 必須指定已建立的有效 I/O CQ;不能填 Admin CQ 的 0。多個 SQ 可以把結果送往同一個 CQ,因此 CQ2 的編號與 Set 7 沒有必須相同的關係。

Admin
Administrative,建立、設定、查詢或管理 controller 與 queue 的控制路徑。

CDW10 同時裝深度與 SQ 編號

04.04.bits 31:16 的 QSIZE 採數量減 1,64 筆填 63,也就是 003Fh;bits 15:0 的 QID 填 SQ3 的 3。合成 (63<<16)|3=003F0003h。QSIZE=0 不是空 SQ 的合法建立要求;QID=0 是 Admin Queue,也不能用來建立一般 I/O SQ。

QSIZE
Queue Size;Create I/O SQ 中以項目數減 1 編碼的深度。
QID
Queue Identifier;本命令準備建立的 SQ 編號。
把 64-entry SQ3 的建立參數拆開檢查
命令位置本例如何組成送出的值
CDW10高 16 bits:64−1=63;低 16 bits:QID3003F0003h
CDW11高 16 bits:CQID2;PC=1;QPRIO=000020001h
CDW12低 16 bits:Set 7;高 16 bits 保留00000007h
PRP14 KiB 對齊、已配置的連續主機記憶體0000000000100000h
前提:CQ2 已建立,Set 7 可用且支援 SQA,控制器已初始化且支援此佇列深度;採 round robin,所以 QPRIO 被忽略。來源:Base §5.3.2、Figures 575~578。
round robin
輪詢仲裁;輪流從佇列選取待處理命令,本例不使用加權優先級。
QPRIO
Queue Priority;僅在指定的加權輪詢仲裁機制下使用的 SQ 優先級。
PRP1
PRP Entry 1;本命令依 PC 選擇存放 SQ 基底位址或 PRP List 位址。
PC
Physically Contiguous;1 表示 SQ 的記憶體實體連續,0 表示用頁面清單描述。

CDW11 管完成路徑、優先級與記憶體配置

04.05.CQID 放高 16 bits,本例是 2。低位 PC=1 表示實體連續 SQ 記憶體;QPRIO bits 2:1 只在 weighted round robin with urgent priority class 仲裁時使用,本例採 round robin,因此控制器忽略 QPRIO。剩餘 bits 15:3 保留。這些欄位都不會代替 CDW12 的 Set 選擇。

CDW12 才是這篇的 Set 提示

04.06.低 16 bits 放 NVMSETID=7,高 16 bits 保留。0 在此有明確定義:不與特定 Set 關聯;它不是廣播到全部 Set。這和某些必須指定有效 Set 的其他命令對 0 的規則不同,必須依 Create I/O SQ 的定義解讀。

PRP1 指向佇列記憶體

04.07.PC=1 時,PRP1 放實體連續 SQ 的基底位址,並依已配置的記憶體頁大小對齊。以 4 KiB 頁、每項 64 bytes、64 筆為例,SQ 恰好占一頁,可用 00100000h 等已配置且對齊的主機位址。這個位址保存命令項目,不是 Set 7 的儲存媒體位址。

等建立成功,再使用這個 SQ

04.08.SQ 的 QID、CQID、深度與 Set 識別值都需要各自有效。建立命令成功後,主機才可按該 SQ 的配置提交 I/O。若支援 SQA 卻把不存在的 Set 99 填入 CDW12,這是建立參數錯誤;與之後把其他 Set 的 I/O 送錯佇列是不同問題。

閱讀相關規格圖表 → 建立 SQ 時,同時指定 Set 與完成佇列

05 讓每筆 I/O 的 Set 與 SQ 關聯一致

05.01.要取得 SQ Associations 的效益,主機必須把每個 I/O SQ 關聯到某個 NVM Set,並只把命令送入與該命令 NSID 所屬 Set 相符的 SQ。不遵守操作規則可能影響 Predictable Latency;這不是一個由本節定義的強制拒絕其他 Set 命令的存取保護機制。

來源:Base 2.4 §8.1.28

來源:NVME-BASE-2.4, Rev. 2.4, §8.1.28, 文件頁 733, PDF 頁 759

以資料對象為起點

05.02.先看 I/O 命令的 NSID,再查這個 namespace 的 NVMSETID,最後從主機建立的關聯中選同一個 Set 的 SQ。不要反過來先找一個空 SQ,就假定它可以承載任何 namespace;這會讓主機提供給控制器的提示與實際工作不一致。

一個 Set 可以使用多個 SQ

05.03.一個 Create I/O SQ 命令只能填一個 NVMSETID,但主機可以建立多個 SQ,逐一填入同一個 Set 編號。例子裡 SQ3、SQ4 都服務 Set 7。這表示關聯不是一個 Set 只能有一個 SQ,也不表示每個 namespace 必須獨占一個 SQ。

以命令的 NSID 選 SQ,而不是以 CQID 選儲存空間本例只追蹤 NSID21。SQ3 即使較空,也不符合 Set 9 的提示;兩個 SQ 共用 CQ2 不會改變這個判斷。來源:Base §8.1.28、Figures 346/578。I/O · NSID21Identify namespace → NVMSETID = 9先確認資料對象的儲存歸屬SQ5 → Set 9相符:使用 SQ5SQ3 → Set 7不符:不要選 SQ3
本例只追蹤 NSID21。SQ3 即使較空,也不符合 Set 9 的提示;兩個 SQ 共用 CQ2 不會改變這個判斷。來源:Base §8.1.28、Figures 346/578。

不同的關聯錯誤有不同後果

05.04.建立時指定不存在的 Set,Figure 578 明定命令中止;建立成功後卻把 Set 9 的命令送入關聯 Set 7 的 SQ,違反的是主機操作規則。§8.1.28 說這可能影響可預測延遲,沒有在此規定每次都回某個錯誤碼,因此不能靠「沒報錯」證明路由正確。

CQ 共用不等於 Set 混用

05.05.SQ3 與 SQ5 可以都使用 CQ2;CQ 裡的完成項目仍用命令與佇列識別資訊對應原命令。SQ→CQ 是結果回報路徑,SQ→Set 是工作分組提示。要判斷主機是否遵守 SQA 規則,應比較 Set 歸屬,不是比較 CQID。

關聯是在建立時提出的

05.06.§8.1.28 的啟用方式是在建立 SQ 時給出關聯,不提供直接改寫既有 SQ 關聯的操作。若要換一套佇列配置,主機可先妥善完成既有工作,再依新的配置建立並使用對應 SQ;不能只修改自己記憶體裡的路由表,就宣稱控制器收到新的 Set 提示。

06 讀懂本篇的規格圖表

06.01.以下依概念整理規格中的圖表。每組先說明讀取順序與要判斷的問題,接著列出各圖的欄位或行為說明。可以由正文的連結跳到對應組別,也可以用這一節檢查自己能否把欄位連回完整操作。

圖表組 01 · 把佇列用途告訴控制器 · 1 張圖表

06.02.先看 Figure 67 的儲存歸屬,再對照命令中的 NVMSETID;本節本身沒有另列編號圖表。

回到本節的解釋與範例

儲存外框與命令對象的關係

06.03.Figure 67 是儲存配置示意,沒有表示 SQ 或 CQ,也沒有要求每個 Set 的 namespace 數量相等。

一起判讀的欄位或標示如何共同決定操作或結果帶入情境後怎麼讀
NVM Set A/B/C外框代表彼此邏輯分開的儲存集合;字母是示意名稱。實際關聯使用 16-bit Set 識別值,例如 7。
NS A1~A3、B1~B2、C1每個具有已格式化儲存空間的 namespace 完整位於一個 Set。A1 與 A2 可使用同一個關聯到 A 的 SQ;不需要一個 namespace 獨占一個 SQ。
UnallocatedSet 內尚未配置給 namespace 的容量。它沒有可供一般 I/O 指定的 namespace 對象;不是另一個待選的 Set 或空 SQ。
來源:Base 2.4 §3.2.2

來源:NVME-BASE-2.4, Rev. 2.4, §3.2.2, Figure 67, 文件頁 81, PDF 頁 107

Base Figure 67 · NVM Sets and Associated Namespaces

一句話重點

Base67-1先讀 namespace 的包含關係,才知道 SQ 應該服務哪一個 Set。

來源:Base 2.4 §3.2.2

來源:NVME-BASE-2.4, Rev. 2.4, §3.2.2, Figure 67, 文件頁 81, PDF 頁 107

用例子讀懂

Base67-2原圖中 NS A1、A2、A3 都在 NVM Set A 的外框內;若一個 SQ 關聯到 A,它預期承載這三個 namespace 的 I/O。圖上的 Set B 不會因為某筆命令經同一個 CQ 完成,就變成 A 的一部分。

圖表組 02 · 支援能力、模式狀態與工作視窗 · 2 張圖表

06.04.Figure 338 讀三個支援位元;Figure 751 讀兩種工作視窗,不把視窗的交替誤認為功能支援 bit 在切換。

回到本節的解釋與範例

先確認能做,再談是否已做

06.05.只取 Figure 338 的 CTRATT bytes 99:96 中 SQA、PLM、NSETS。其餘 bit 不是本篇內容,也不能一律當成保留。

一起判讀的欄位或標示如何共同決定操作或結果帶入情境後怎麼讀
SQA bit 81 支援 SQ Associations;0 不支援。0124h & 0100h 非零,表示此能力受支援。
PLM bit 51 支援 Predictable Latency Mode;支援 SQA 時必須同時為 1。此 bit 不能證明 Set 7 當下已啟用模式。
NSETS bit 21 支援 NVM Sets;支援 SQA 時必須同時為 1。只看到 NSETS=1,不足以推論 SQA=1。
三者合併檢查遮罩 0124h=(1<<8)|(1<<5)|(1<<2),檢查與遮罩相 AND 的結果。CTRATT=0324h 仍通過三 bit 檢查;額外 bit 9 不改變這個結論。
來源:Base 2.4 §5.2.14.2.1

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.14.2.1, Figure 338, 文件頁 344-346, PDF 頁 370-372

Base Figure 338 · Identify – Identify Controller Data Structure, I/O Command Set Independent

一句話重點

Base338-1CTRATT 的三個 bit 回答支援能力,沒有回報 SQ 關聯清單或目前工作視窗。

來源:Base 2.4 §5.2.14.2.1

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.14.2.1, Figure 338, 文件頁 344-346, PDF 頁 370-372

用例子讀懂

Base338-20124h 的相關位元是 bit 8、5、2;0224h 雖然也有 bit 5、2,卻沒有 bit 8,不能當作 SQA 支援。對整個 CTRATT 應使用遮罩,避免其他能力位元干擾判斷。

沿時間讀兩種視窗與切換條件

06.06.本篇只補 Figure 751 所需的模式背景;SQA 的選用提示不能代替模式啟用與視窗條件。

一起判讀的欄位或標示如何共同決定操作或結果帶入情境後怎麼讀
綠色 DTWINSet 能提供確定性讀寫延遲;仍需符合該視窗的工作量與時間限制。兩個關聯同 Set 的 SQ 要共同計入該 Set 的負載。
紅色 NDWIN準備後續 DTWIN 所需的工作使 Set 無法提供確定性讀寫延遲。例如進行媒體背景操作;不是主機必須把資料移到另一個 Set。
橫向交替與 Legend時間由左往右,圖例把顏色對應到狀態;未給固定週期或長度。DTWIN 畫得較長,不代表它固定是 NDWIN 的某個倍數。
DTWIN → NDWIN主機可要求切換;操作屬性超過典型或最大值,或發生 Deterministic Excursion 時,Set 可自行轉入 NDWIN。有關聯而且送對 SQ,仍不能忽略視窗的讀取量、寫入量與時間條件。
來源:Base 2.4 §8.1.21

來源:NVME-BASE-2.4, Rev. 2.4, §8.1.21, Figure 751, 文件頁 682-683, PDF 頁 708-709

Base Figure 751 · Deterministic and Non-Deterministic Windows

一句話重點

Base751-1DTWIN 與 NDWIN 表示同一 Set 沿時間經過的不同工作視窗,不是兩個 Set。

來源:Base 2.4 §8.1.21

來源:NVME-BASE-2.4, Rev. 2.4, §8.1.21, Figure 751, 文件頁 682-683, PDF 頁 708-709

用例子讀懂

Base751-2Set 7 原本在綠色 DTWIN,之後為準備下一個視窗進入紅色 NDWIN。SQ3 仍可保持關聯 Set 7;視窗改變不代表 SQ3 自動改去 Set 9。原圖沒有時間刻度,不能從方塊寬度算毫秒。

圖表組 03 · 先建立 namespace 到 Set 的對照 · 7 張圖表

06.07.Figures 333/334/336 選查詢;343~345 解釋清單;346 只取 NSID 查詢條件及 NVMSETID 歸屬欄位。

回到本節的解釋與範例

同一個 Identify 命令的三種查詢

06.08.只取 CNS 01h/04h/08h,以及命令中解釋這三種查詢所需的欄位。

一起判讀的欄位或標示如何共同決定操作或結果帶入情境後怎麼讀
Figure 333:CNS bits 7:001h 回控制器資料;04h 回 Set 清單;08h 回指定 namespace 的跨命令集共用資料。三者沒有相同的回覆布局,不能把 04h 的回覆當 08h 解。
Figure 333:CNTID bits 31:16這三種 CNS 都不使用 CNTID;主機必須清 0,控制器必須忽略。bits 15:8 保留。要查 NSID21,填共同 NSID 欄;不是 CNTID=21。
Figure 334:CSI bits 31:24三種 CNS 均不使用 CSI;主機宜清 0,控制器宜忽略。若非零,控制器可回 Invalid Field in Command。相容的組合在此填 0;不能因「不使用」就隨意留下其他值。
Figure 334:CNSSID bits 15:0CNS=04h 用作清單起始 Set ID;01h/08h 未定義,屬保留。bits 23:16 保留。04h 配 7 是找 ID≥7;08h 的目標由 NSID 決定。
Figure 336:O/M 與 Y/NO/M 為選用/必備支援;Y/N 為該輸入欄是否使用。01h、08h 為 M,04h 為 O。04h 的 O 不等於主機可以忽略回覆內容;支援 SQA 的情境需要 Set 資訊。
NSID 欄與回覆01h/04h 不用 NSID;08h 使用 NSID,對 active NSID 回傳對應資料。本例依序查 11、12、21,得到 7、7、9;不是只做一次查詢就取得整張 namespace 對照。
CNTID
Controller Identifier;只在需要指定控制器的 Identify 選項使用。
CSI
Command Set Identifier;Identify 某些選項使用的 I/O Command Set 識別值。
來源:Base 2.4 §5.2.14

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.14, Figure 333, 文件頁 337, PDF 頁 363

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.14, Figure 334, 文件頁 337, PDF 頁 363

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.14, Figure 336, 文件頁 338-339, PDF 頁 364-365

Base Figure 333 · Identify – Command Dword 10

一句話重點

Base333-1CDW10 的 CNS 選擇要問哪個問題,CNTID 不是 namespace 的編號。

來源:Base 2.4 §5.2.14

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.14, Figure 333, 文件頁 337, PDF 頁 363

用例子讀懂

Base333-2查 Set List 用 CDW10=00000004h,查 namespace 歸屬用 00000008h。後者的 NSID=21 放在共同命令的 NSID 欄,不能填到 CDW10 高 16 bits 的 CNTID。

Base Figure 334 · Identify – Command Dword 11

一句話重點

Base334-1CDW11 低 16 bits 的意思由 CNS 決定,不是每次 Identify 都在選 Set。

來源:Base 2.4 §5.2.14

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.14, Figure 334, 文件頁 337, PDF 頁 363

用例子讀懂

Base334-2CNS=04h、CDW11=00000007h 表示從 Set ID 7 開始列舉;換成 CNS=08h 查 NSID21 的歸屬時,不再把 7 填成篩選條件,CNSSID 在該選項未定義。

Base Figure 336 · Identify – CNS Values

一句話重點

Base336-1先用 CNS 列選回覆結構,再用 Y/N 判斷 NSID、CNTID、CSI 是否參與這次查詢。

來源:Base 2.4 §5.2.14

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.14, Figure 336, 文件頁 338-339, PDF 頁 364-365

用例子讀懂

Base336-201h 問控制器能力,04h 問 Set 清單,08h 問指定 namespace。只有這三列中的 08h 對 NSID 標 Y;不可因為 Identify 命令帶有 NSID 欄,就認為所有選項都使用它。

先找 entry,再讀其中的實際 Set ID

06.09.Figure 343 選清單起點,344 定位一筆資料,345 才讀該 Set 的欄位。清單依 ID 排序,只包含處理查詢的控制器可存取的 Set。

一起判讀的欄位或標示如何共同決定操作或結果帶入情境後怎麼讀
Figure 343:CDW11 bits 15:0NVMSETID 是起始識別值,下限為含等號的 ≥。最大值 FFFFh;繼續列舉時不可回繞。上一筆為 37,下一次可從 38 開始;可能直接取得 100,ID 不必連續。
Figure 344:byte 0/bytes 127:1NUMENT=0~31;其餘 header 保留。31 筆加 header 為 128+31×128=4096 bytes。
Figure 344:Entry ii 是從 0 起算的 index;起點 128+i×128,末位為起點+127。i=1 對應 byte offset 256,不能把 256 當作 Set ID。
Figure 345:NSETID bytes 1:0/ENDGID bytes 3:2前者識別本 Set;後者指出其耐用度群組。這裡的 byte 位置都相對 entry 起點。Entry 1 的 NSETID 在整份清單 bytes 257:256;ENDGID 在 259:258。
R4KRT bytes 11:8每單位 100 ns;僅指 DTWIN 中、每個 Set 只有 1 筆 outstanding 命令時的 4 KiB 隨機讀取典型時間。120×100 ns=12 μs,是典型值。兩個 SQ 同屬一 Set、各有 1 筆未完成,合計是 2,已非此測量條件。
OWS bytes 15:12最佳寫入大小以 bytes 表示;0 表示未指定。不同 namespace 格式不能共用 OWS 時,此欄宜為 0。OWS=65536 表示 64 KiB,並非 65536 個 logical blocks,也不是允許的 SQ 項目數。
TNVMSC bytes 31:16/UNVMSC bytes 47:32均是 16-byte 容量值、單位為 bytes:一個是總容量,一個是未配置容量。總容量 1,000,000、未配置 250,000,說明有部分空間尚未分給 namespace;與 64-entry SQ 的記憶體無關。
entry 的保留區bytes 7:4 與 127:48 不提供本篇可使用的屬性;保留區不納入容量或時間換算。解析下一筆時直接移動 128 bytes,不能把最後一個已知欄位結尾當下一筆起點。
outstanding
已提交但尚未完成的命令;要按規定的 Set 範圍合計。
ENDGID
Endurance Group Identifier;Set 或 namespace 所屬耐用度群組的識別值。
TNVMSC
Total NVM Set Capacity;Set 的總儲存容量,以 bytes 表示。
UNVMSC
Unallocated NVM Set Capacity;Set 中尚未配置給 namespace 的容量,以 bytes 表示。
R4KRT
Random 4 KiB Read Typical;在指定視窗與在途命令數條件下,4 KiB 隨機讀取的典型完成時間。
index
索引;項目在清單中的順序位置,這裡從 0 起算。
OWS
Optimal Write Size;以 bytes 表示的最佳寫入大小。
來源:Base 2.4 §5.2.14.2.4

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.14.2.4, Figure 343, 文件頁 388, PDF 頁 414

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.14.2.4, Figure 344, 文件頁 389, PDF 頁 415

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.14.2.4, Figure 345, 文件頁 389, PDF 頁 415

Base Figure 343 · Command Dword 11 - CNS Specific Identifier

一句話重點

Base343-1清單的起點是 Set 識別值下限,而且包含等於該值的 entry。

來源:Base 2.4 §5.2.14.2.4

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.14.2.4, Figure 343, 文件頁 388, PDF 頁 414

用例子讀懂

Base343-2可存取的 Set 為 7、9、37,要求起點 9 會從 9 開始,不會跳過它。若上一批最後值為 37,下一批可從 38 查;不是把「已讀 31 筆」直接當下一個 Set ID。

Base Figure 344 · NVM Set List

一句話重點

Base344-1NUMENT 是直接筆數,entry 位置則由固定 header 與 128-byte 步距計算。

來源:Base 2.4 §5.2.14.2.4

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.14.2.4, Figure 344, 文件頁 389, PDF 頁 415

用例子讀懂

Base344-2NUMENT=2 時只讀 Entry 0、1。Entry 1 起點=128+1×128=256,結束=383;剩餘補零不能再被當成有效 Set。NUMENT=0 就沒有 entry,不是 1 筆。

Base Figure 345 · NVM Set Attributes Entry

一句話重點

Base345-1同一筆 entry 同時有識別值、效能參考與儲存容量,必須分開使用。

來源:Base 2.4 §5.2.14.2.4

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.14.2.4, Figure 345, 文件頁 389, PDF 頁 415

用例子讀懂

Base345-2假設 NSETID=9、R4KRT=120、TNVMSC=1,048,576,000。9 可用於建立 SQ 關聯;120 代表特定測量條件下典型 12 μs;容量則是 bytes,不能拿來設定 SQ 深度。

回覆條件與相鄰兩種歸屬

06.10.僅解釋 Figure 346 的 NVMSETID/ENDGID、查詢 NSID 與 Reported 欄,其他 namespace 屬性不影響此處的 Set 路由。

一起判讀的欄位或標示如何共同決定操作或結果帶入情境後怎麼讀
CNS=08h/active NSID查詢指定且目前可透過該控制器存取的 namespace,才回對應資料。inactive NSID 回全零結構。全零回覆不能直接當成「這是一個正常的 Set 0 namespace」。
NVMSETID bytes 11:10NSID≠FFFFFFFFh 時表示 namespace 所屬 Set;不支援 NVM Sets 或沒有已格式化儲存空間時清 0。本例為 09 00 → 0009h;選 SQ5,而不是因 NSID21 就找 SQ21。
ENDGID bytes 13:12同樣在特定 NSID 下指出其 Endurance Group;不支援該能力或無已格式化儲存空間時清 0。同一個 Group 可能包含多個 Set,Group 相同不能代替 Set 相同。
Reported:No這兩個欄位在成功的 NSID=FFFFFFFFh 能力查詢中不回報歸屬,回覆為 0。不支援 Namespace Management 時,該查詢可被以 Invalid Namespace or Format 中止。要路由 NSID21 的 I/O,重新查 21;不能用 FFFFFFFFh 的共同能力代替。
Endurance Group
Endurance Group,用於隔離與回報耐久度相關狀態的 NVM 資源群組。
來源:Base 2.4 §5.2.14.2.8

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.14.2.8, Figure 346, 文件頁 390,393, PDF 頁 416,419

Base Figure 346 · I/O Command Set Independent Identify Namespace Data Structure

一句話重點

Base346-1查特定 NSID 的 NVMSETID,才能把 I/O 對象接到正確的 Set。

來源:Base 2.4 §5.2.14.2.8

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.14.2.8, Figure 346, 文件頁 390,393, PDF 頁 416,419

用例子讀懂

Base346-2CNS=08h、NSID21 的回覆在 bytes 11:10 為 09 00,解為 Set 9。若把 NSID 改成 FFFFFFFFh,這是能力查詢;若查詢成功,這個不回報的欄位為 0,不能拿來判斷 NSID21 的歸屬。

圖表組 04 · 建立 SQ 時,同時指定 Set 與完成佇列 · 5 張圖表

06.11.Figures 575~579 按記憶體、深度、完成路徑、Set 與建立錯誤分工閱讀;本篇範例採一般主機記憶體。

回到本節的解釋與範例

把建立命令的參數拆成四個問題

06.12.這裡以一般主機記憶體為前提,Figures 575~579 分別回答「佇列放哪、多少項、結果送哪、服務哪個 Set」。相關條件在此共用一次。

一起判讀的欄位或標示如何共同決定操作或結果帶入情境後怎麼讀
Figure 575:PRP1 bits 63:0/PCPC=1 指向實體連續 SQ 的基底;PC=0 指向 PRP List。兩者按 CC.MPS 對齊且 offset 必須為 0,非連續佇列的每個 PRP 也須為 0。任一非零 offset 時,控制器宜回 PRP Offset Invalid。4 KiB 頁的基底範例是 00100000h。
PRP List 的生命週期若採 PC=0,主機必須維持清單位置及值,直到對應 Delete I/O SQ 成功或控制器重設。建立成功不代表清單立即可改寫;控制器之後仍可能用它存取 SQ。
Figure 576:QSIZE bits 31:16深度採項目數減 1;0 或大於支援值時,控制器宜回 Invalid Queue Size。64 筆填 003Fh;還需先完成 CC.IOSQES 初始化,並符合 CAP.MQES。
Figure 576:QID bits 15:0為新 SQ 指定編號,不得超過 Number of Queues 回報範圍;0、超出範圍或已使用時宜回 Invalid Queue Identifier。SQ3 尚未建立且配置允許編號 3,才使用 QID=3。
Figure 577:CQID bits 31:160 或超出支援範圍時必須回 Invalid Queue Identifier;範圍內但尚未建立時必須回 Completion Queue Invalid。I/O 完成送 CQ2;Create I/O SQ 這條 Admin 命令本身的完成結果仍送 Admin CQ。
QPRIO bits 2:1/PC bit 0加權輪詢且含 Urgent class 時,00/01/10/11 分別為 Urgent/High/Medium/Low;其他仲裁必須忽略 QPRIO。PC=0 且 CAP.CQR=1 時宜回 Invalid Field。round robin、CQ2、PC1 合成 00020001h,不表示設定了 Urgent 仲裁。bits 15:3 保留。
Figure 578:NVMSETID bits 15:00 或 SQA 不受支援:沒有特定關聯。支援 SQA 且非零值不在 Set List:必須以 Invalid Field in Command 中止。選 Set 7 填 00000007h;高 16 bits 保留。NSID 在建立命令中不負責選這個 Set。
Figure 579:命令專用 0h/1h/2h依序表示完成佇列未建立、佇列編號無效、佇列深度或項目大小初始化條件不符。此表 0h 是命令專用狀態碼,不等於通用狀態類別的成功碼;需連同類別解讀。
CC.IOSQES
I/O Submission Queue Entry Size;設定每個 I/O SQ 項目的大小。
CAP.MQES
Maximum Queue Entries Supported;控制器每個佇列可支援項目數的上限,欄位採數量減 1。
PRP List
Physical Region Page List;依序列出組成佇列的實體記憶體頁位址。
CAP.CQR
Contiguous Queues Required;1 表示佇列必須採實體連續記憶體。
CC.MPS
Memory Page Size;控制器目前設定的記憶體頁大小,用來判斷 PRP 對齊。
CAP
Controller Capabilities,offset 00h 的 controller property,回報 queue、page size、timeout 與其他能力。
MPS
Memory Page Size,controller 使用的 memory page 大小設定;影響 queue address 與 PRP 對齊。
PRP
Physical Region Page,以 memory page 為單位描述 host-addressable data buffer 的 pointer 格式。
CC
Controller Configuration,host 用來選擇設定並啟用或停用 controller 的 property。
來源:Base 2.4 §5.3.2

來源:NVME-BASE-2.4, Rev. 2.4, §5.3.2, Figure 575, 文件頁 529, PDF 頁 555

來源:NVME-BASE-2.4, Rev. 2.4, §5.3.2, Figure 576, 文件頁 529, PDF 頁 555

來源:NVME-BASE-2.4, Rev. 2.4, §5.3.2, Figure 577, 文件頁 529-530, PDF 頁 555-556

來源:NVME-BASE-2.4, Rev. 2.4, §5.3.2, Figure 578, 文件頁 530, PDF 頁 556

來源:NVME-BASE-2.4, Rev. 2.4, §5.3.2, Figure 579, 文件頁 530-531, PDF 頁 556-557

Base Figure 575 · Create I/O Submission Queue – PRP Entry 1

一句話重點

Base575-1PRP1 的內容由 PC 決定,描述的是 SQ 記憶體,不是 namespace 資料位置。

來源:Base 2.4 §5.3.2

來源:NVME-BASE-2.4, Rev. 2.4, §5.3.2, Figure 575, 文件頁 529, PDF 頁 555

用例子讀懂

Base575-2PC=1、4 KiB 記憶體頁時,00100000h 是對齊的 SQ 基底範例;00100080h 帶有 128-byte offset,違反這個對齊要求。PC=0 時則要把 PRP1 解成頁面清單的位址。

Base Figure 576 · Create I/O Submission Queue – Command Dword 10

一句話重點

Base576-1QSIZE 選數量、QID 選名稱,64 筆 SQ3 要編成 003F0003h。

來源:Base 2.4 §5.3.2

來源:NVME-BASE-2.4, Rev. 2.4, §5.3.2, Figure 576, 文件頁 529, PDF 頁 555

用例子讀懂

Base576-2高 16 bits 003Fh=63,還原筆數為 63+1=64;低 16 bits 0003h 選 SQ3。若高半部直接填 64,要求的會是 65 筆,而不是把 SQ3 改名成 SQ64。

Base Figure 577 · Create I/O Submission Queue – Command Dword 11

一句話重點

Base577-1CQID 決定後續 I/O 的完成去處;PC 與 QPRIO 分別影響記憶體描述與仲裁。

來源:Base 2.4 §5.3.2

來源:NVME-BASE-2.4, Rev. 2.4, §5.3.2, Figure 577, 文件頁 529-530, PDF 頁 555-556

用例子讀懂

Base577-200020001h 表示 CQ2、PC=1、QPRIO=00b。若採一般 round robin,QPRIO 被忽略,不能只看 00b 就宣稱這個 SQ 享有 Urgent 優先級。

Base Figure 578 · Create I/O Submission Queue – Command Dword 12

一句話重點

Base578-1NVMSETID 在建立 SQ 時提供 Set 關聯,0 在這個命令明確表示沒有特定關聯。

來源:Base 2.4 §5.3.2

來源:NVME-BASE-2.4, Rev. 2.4, §5.3.2, Figure 578, 文件頁 530, PDF 頁 556

用例子讀懂

Base578-2支援 SQA 且清單含 7 時,CDW12=00000007h 要求關聯 Set 7;改成 0 則沒有特定關聯。清單沒有 99 卻填 99,必須回 Invalid Field in Command。

Base Figure 579 · Create I/O Submission Queue – Command Specific Status Values

一句話重點

Base579-1建立命令的錯誤值要搭配錯誤類別與觸發欄位,不能當作後續 I/O 的分流檢查表。

來源:Base 2.4 §5.3.2

來源:NVME-BASE-2.4, Rev. 2.4, §5.3.2, Figure 579, 文件頁 530-531, PDF 頁 556-557

用例子讀懂

Base579-2CQ2 在合法編號範圍內卻未建立,對應 Completion Queue Invalid(此表 0h);SQID3 已被使用,對應 Invalid Queue Identifier(1h)。不存在的 Set 使用 Figure 578 的 Invalid Field 規則,並不是這張表的 0h。

學完後想一想

1. CTRATT 的三個相關 bit 都是 1,能否直接保證下一筆 Read 的完成時間?

07.01.不能。它們只表示支援能力。還要確認目標 Set 的模式已啟用、目前的工作視窗與操作限制;而服務品質描述也不包括 PCIe 連線的全部延遲。

來源

來源:NVME-BASE-2.4, Rev. 2.4, §8.1.28, 文件頁 732-733, PDF 頁 758-759

來源:NVME-BASE-2.4, Rev. 2.4, §8.1.21, 文件頁 682-683, PDF 頁 708-709

2. 清單 Entry 1 的 NSETID=9,建立 SQ 時填 1、256,還是 9?

07.02.填 9。1 是索引;256 是該筆相對整份清單起點的 byte 位置;9 才是要填入 CDW12 的 Set 識別值。

來源

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.14.2.4, 文件頁 388-389, PDF 頁 414-415

來源:NVME-BASE-2.4, Rev. 2.4, §5.3.2, 文件頁 529-531, PDF 頁 555-557

3. NSID21 屬於 Set 9,SQ3 與 SQ5 都使用 CQ2,是否可以任選一個 SQ?

07.03.依本例應選關聯 Set 9 的 SQ5。共用 CQ 只代表完成結果送到相同地方,不能改變 SQ3 關聯 Set 7 的事實。

來源

來源:NVME-BASE-2.4, Rev. 2.4, §8.1.28, 文件頁 733, PDF 頁 759

來源:NVME-BASE-2.4, Rev. 2.4, §3.3, 文件頁 88, PDF 頁 114

4. 把 NVMSETID 設為 0,是建立通往所有 Set 的共同提示嗎?

07.04.不是。Create I/O SQ 把 0 定義為沒有特定 Set 關聯;它不能滿足本篇「先建立關聯,再按 Set 分流」的提示使用方式。

來源

來源:NVME-BASE-2.4, Rev. 2.4, §5.3.2, 文件頁 529-531, PDF 頁 555-557

來源:NVME-BASE-2.4, Rev. 2.4, §8.1.28, 文件頁 733, PDF 頁 759

5. Set 9 的命令送到關聯 Set 7 的 SQ,而且成功完成,是否表示主機使用正確?

07.05.不表示。送錯 SQ 違反分流規則,可能影響可預測延遲;§8.1.28 沒有要求每次都用錯誤碼拒絕。這與建立 SQ 時填入清單外非零 Set、必須回 Invalid Field in Command 的規則不同。

來源

來源:NVME-BASE-2.4, Rev. 2.4, §8.1.28, 文件頁 733, PDF 頁 759

來源:NVME-BASE-2.4, Rev. 2.4, §5.3.2, 文件頁 529-531, PDF 頁 555-557