看懂三種關係
01-01namespace 屬於哪個 NVM Set,SQ 關聯哪個 Set,完成結果送往哪個 CQ:這三種關係各回答不同問題,不能因為編號接近就混在一起。
- NVM Set
- 在邏輯上與其他集合分開的一組非揮發性儲存,可包含多個 namespace。
- NVM
- Non-Volatile Memory,斷電後仍能保存資料的記憶體。
- CQ
- Completion Queue,完成佇列;控制器放置命令完成結果的記憶體佇列。
NVMe · 規格與原理
00.01.主機知道每筆 I/O 要讀寫哪個 namespace,但控制器也需要知道:這個提交佇列預計服務哪一組儲存空間?SQ Associations 讓主機在建立佇列時提供這項提示。本文把儲存歸屬、佇列配置與命令分流接起來,說明提示何時有幫助,以及為什麼「命令完成」還不足以證明分流正確。
01-01namespace 屬於哪個 NVM Set,SQ 關聯哪個 Set,完成結果送往哪個 CQ:這三種關係各回答不同問題,不能因為編號接近就混在一起。
02-01先查控制器能力,再分清 Predictable Latency Mode 是否啟用、Set 目前處於哪種工作視窗。支援位元本身沒有提供固定的應用程式延遲上限。
03-01讀出 Set 的實際識別值及 namespace 歸屬,再放進 Create I/O SQ。清單索引、byte 位置與識別值各有用途,64 筆佇列也有自己的數量編碼。
04-01從命令 NSID 找到 Set,再選已關聯該 Set 的 SQ。比較建立參數錯誤與後續送錯佇列,理解規格對兩者規定的不同後果。
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.SQ Associations 讓主機在建立 I/O Submission Queue 時,提供該 SQ 對應的 NVM Set,作為控制器在 Predictable Latency Mode 下改善效能的提示。這是選用能力;Predictable Latency Mode 不依賴主機一定使用 SQ Associations。
來源:NVME-BASE-2.4, Rev. 2.4, §8.1.28, 文件頁 732-733, PDF 頁 758-759
01.02.namespace 是命令要存取的邏輯儲存空間;NVM Set 是可配置出 namespace、也可保留未配置空間的儲存集合;SQ 是主機放置待執行命令的佇列。它們分別回答「存取誰、屬於哪組儲存、從哪裡提交」。不能把 SQ 的記憶體空間當作 namespace 的資料容量。
01.03.主機把某個 SQ 關聯到 Set 7,意思是打算把 Set 7 內 namespace 的 I/O 送到這個 SQ。這項關聯不會建立 namespace,也不會把原本屬於 Set 9 的 namespace 搬到 Set 7。I/O 命令本身仍以 NSID 指定真正的資料對象。
01.04.Predictable Latency Mode 以 NVM Set 為單位提供服務品質屬性。若主機把不同 Set 的工作混在同一個 SQ,控制器比較難單靠佇列判斷工作所屬;提供關聯並遵守分流規則,讓佇列資訊能配合 Set 層級的處理。規格沒有替這項提示指定固定的加速倍數。
01.05.支援 SQ Associations、已建立 SQ 關聯、已啟用 Predictable Latency Mode,是三個不同狀態。建立 SQ 關聯不會順便把模式打開;模式也可以在不使用此選用提示的情況下運作。主機若希望取得關聯的效益,還必須持續按正確 Set 分流。
02.01.支援 SQ Associations 的控制器必須在 CTRATT 同時宣告 SQA、NVM Sets 與 Predictable Latency Mode 支援。這些支援位元不表示每個 Set 目前都已啟用模式,也不表示目前處於可提供確定性延遲的視窗。
來源:NVME-BASE-2.4, Rev. 2.4, §8.1.28, 文件頁 732-733, PDF 頁 758-759
02.02.Predictable Latency Mode 有 DTWIN/NDWIN;DTWIN 的確定性依賴操作限制與當時狀態,SQ 提示不會取消這些條件。
來源: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。
02.04.模式是以 NVM Set 為單位配置的。假設 Set 7 已啟用 Predictable Latency Mode,Set 9 沒有啟用,兩者仍可存在於宣告 PLM 支援的同一個控制器內。本篇設定 SQ 關聯的命令不會取代模式配置;範例的效益討論以相關 Set 已啟用該模式為前提。
| 觀察到的資訊 | 足以說明什麼 | 還不能據此推出什麼 |
|---|---|---|
| CTRATT 三個 bit 為 1 | 控制器支援 SQA、NVM Sets、PLM | Set 7 現在已啟用模式 |
| Set 7 已啟用模式 | 該 Set 使用模式的工作視窗規則 | 此刻必定在 DTWIN |
| Set 7 目前在 DTWIN | 現在能在符合條件時提供確定性延遲 | 主機可無限增加工作量,或保證全部 PCIe 延遲 |
| SQ3 已關聯 Set 7 | 控制器收到此 SQ 的預定用途 | 主機之後一定送對每筆 I/O |
02.05.例如 Set 7 在 DTWIN 接收讀寫,之後進入 NDWIN 準備下一個視窗;這時延遲性質已改變,SQ3 關聯 Set 7 的設定卻可以保持不變。規格的服務品質描述適用於 subsystem 內部,不涵蓋 PCIe 傳輸路徑的全部延遲。因此不能僅靠 SQA=1 保證應用程式端的每次 I/O 延遲。
02.06.DTWIN 還受到讀取量、最佳寫入大小的寫入量、視窗時間及廠商定義屬性限制;若超過相關典型或最大值,或發生需控制器立即處理的 Deterministic Excursion,Set 可能轉入 NDWIN。SQ 關聯幫助工作分組,但沒有取消這些模式規則。
03.01.主機需要兩份資訊:NVM Set List 說明控制器可存取哪些 Set,Identify Namespace 則說明指定 namespace 屬於哪個 Set。清單位置、NVM Set Identifier 與 NSID 是不同數值,不能用同一個編號代替。
來源: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 回全零資料,不能當有效歸屬。
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.14.2.8, 文件頁 390,393, PDF 頁 416,419
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。
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。
| 清單內的索引 | 整份清單的 byte 範圍 | entry 內的 NSETID | 建立 SQ 時使用 |
|---|---|---|---|
| 0 | 128~255 | 7 | CDW12=00000007h |
| 1 | 256~383 | 9 | CDW12=00000009h |
03.05.CNS=04h 回傳的 Set 識別值從指定起點開始,採大於或等於,並按識別值排序。若上一批最後一個 NSETID 是 37,而還要繼續查,可以用 38 當下一次起點,避免又取回 37。這個起點是識別值,不是第幾頁,也不是記憶體 byte offset。若到 FFFFh 就不能再加 1 回繞成 0。
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 配置一致。
04.01.Create I/O Submission Queue 的 CDW12.NVMSETID 建立 SQ 與 Set 的關聯;CDW11.CQID 則指定完成結果送往哪個 CQ。兩個欄位用途不同。NVMSETID=0 或不支援 SQA 時不建立特定 Set 關聯;SQA 支援時指定清單外的非零 Set,命令必須以 Invalid Field in Command 中止。
來源:NVME-BASE-2.4, Rev. 2.4, §5.3.2, 文件頁 529-531, PDF 頁 555-557
04.02.PCIe 的多個 SQ 可以使用同一個 CQ;共用完成佇列不會取代各 SQ 的 Set 關聯。
來源: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 沒有必須相同的關係。
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。
| 命令位置 | 本例如何組成 | 送出的值 |
|---|---|---|
| CDW10 | 高 16 bits:64−1=63;低 16 bits:QID3 | 003F0003h |
| CDW11 | 高 16 bits:CQID2;PC=1;QPRIO=0 | 00020001h |
| CDW12 | 低 16 bits:Set 7;高 16 bits 保留 | 00000007h |
| PRP1 | 4 KiB 對齊、已配置的連續主機記憶體 | 0000000000100000h |
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 選擇。
04.06.低 16 bits 放 NVMSETID=7,高 16 bits 保留。0 在此有明確定義:不與特定 Set 關聯;它不是廣播到全部 Set。這和某些必須指定有效 Set 的其他命令對 0 的規則不同,必須依 Create I/O SQ 的定義解讀。
04.07.PC=1 時,PRP1 放實體連續 SQ 的基底位址,並依已配置的記憶體頁大小對齊。以 4 KiB 頁、每項 64 bytes、64 筆為例,SQ 恰好占一頁,可用 00100000h 等已配置且對齊的主機位址。這個位址保存命令項目,不是 Set 7 的儲存媒體位址。
04.08.SQ 的 QID、CQID、深度與 Set 識別值都需要各自有效。建立命令成功後,主機才可按該 SQ 的配置提交 I/O。若支援 SQA 卻把不存在的 Set 99 填入 CDW12,這是建立參數錯誤;與之後把其他 Set 的 I/O 送錯佇列是不同問題。
05.01.要取得 SQ Associations 的效益,主機必須把每個 I/O SQ 關聯到某個 NVM Set,並只把命令送入與該命令 NSID 所屬 Set 相符的 SQ。不遵守操作規則可能影響 Predictable Latency;這不是一個由本節定義的強制拒絕其他 Set 命令的存取保護機制。
來源:NVME-BASE-2.4, Rev. 2.4, §8.1.28, 文件頁 733, PDF 頁 759
05.02.先看 I/O 命令的 NSID,再查這個 namespace 的 NVMSETID,最後從主機建立的關聯中選同一個 Set 的 SQ。不要反過來先找一個空 SQ,就假定它可以承載任何 namespace;這會讓主機提供給控制器的提示與實際工作不一致。
05.03.一個 Create I/O SQ 命令只能填一個 NVMSETID,但主機可以建立多個 SQ,逐一填入同一個 Set 編號。例子裡 SQ3、SQ4 都服務 Set 7。這表示關聯不是一個 Set 只能有一個 SQ,也不表示每個 namespace 必須獨占一個 SQ。
05.04.建立時指定不存在的 Set,Figure 578 明定命令中止;建立成功後卻把 Set 9 的命令送入關聯 Set 7 的 SQ,違反的是主機操作規則。§8.1.28 說這可能影響可預測延遲,沒有在此規定每次都回某個錯誤碼,因此不能靠「沒報錯」證明路由正確。
05.05.SQ3 與 SQ5 可以都使用 CQ2;CQ 裡的完成項目仍用命令與佇列識別資訊對應原命令。SQ→CQ 是結果回報路徑,SQ→Set 是工作分組提示。要判斷主機是否遵守 SQA 規則,應比較 Set 歸屬,不是比較 CQID。
05.06.§8.1.28 的啟用方式是在建立 SQ 時給出關聯,不提供直接改寫既有 SQ 關聯的操作。若要換一套佇列配置,主機可先妥善完成既有工作,再依新的配置建立並使用對應 SQ;不能只修改自己記憶體裡的路由表,就宣稱控制器收到新的 Set 提示。
06.01.以下依概念整理規格中的圖表。每組先說明讀取順序與要判斷的問題,接著列出各圖的欄位或行為說明。可以由正文的連結跳到對應組別,也可以用這一節檢查自己能否把欄位連回完整操作。
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。 |
| Unallocated | Set 內尚未配置給 namespace 的容量。 | 它沒有可供一般 I/O 指定的 namespace 對象;不是另一個待選的 Set 或空 SQ。 |
來源:NVME-BASE-2.4, Rev. 2.4, §3.2.2, Figure 67, 文件頁 81, PDF 頁 107
Base67-1先讀 namespace 的包含關係,才知道 SQ 應該服務哪一個 Set。
來源: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 的一部分。
06.04.Figure 338 讀三個支援位元;Figure 751 讀兩種工作視窗,不把視窗的交替誤認為功能支援 bit 在切換。
回到本節的解釋與範例06.05.只取 Figure 338 的 CTRATT bytes 99:96 中 SQA、PLM、NSETS。其餘 bit 不是本篇內容,也不能一律當成保留。
| 一起判讀的欄位或標示 | 如何共同決定操作或結果 | 帶入情境後怎麼讀 |
|---|---|---|
| SQA bit 8 | 1 支援 SQ Associations;0 不支援。 | 0124h & 0100h 非零,表示此能力受支援。 |
| PLM bit 5 | 1 支援 Predictable Latency Mode;支援 SQA 時必須同時為 1。 | 此 bit 不能證明 Set 7 當下已啟用模式。 |
| NSETS bit 2 | 1 支援 NVM Sets;支援 SQA 時必須同時為 1。 | 只看到 NSETS=1,不足以推論 SQA=1。 |
| 三者合併檢查 | 遮罩 0124h=(1<<8)|(1<<5)|(1<<2),檢查與遮罩相 AND 的結果。 | CTRATT=0324h 仍通過三 bit 檢查;額外 bit 9 不改變這個結論。 |
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.14.2.1, Figure 338, 文件頁 344-346, PDF 頁 370-372
Base338-1CTRATT 的三個 bit 回答支援能力,沒有回報 SQ 關聯清單或目前工作視窗。
來源: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 的選用提示不能代替模式啟用與視窗條件。
| 一起判讀的欄位或標示 | 如何共同決定操作或結果 | 帶入情境後怎麼讀 |
|---|---|---|
| 綠色 DTWIN | Set 能提供確定性讀寫延遲;仍需符合該視窗的工作量與時間限制。 | 兩個關聯同 Set 的 SQ 要共同計入該 Set 的負載。 |
| 紅色 NDWIN | 準備後續 DTWIN 所需的工作使 Set 無法提供確定性讀寫延遲。 | 例如進行媒體背景操作;不是主機必須把資料移到另一個 Set。 |
| 橫向交替與 Legend | 時間由左往右,圖例把顏色對應到狀態;未給固定週期或長度。 | DTWIN 畫得較長,不代表它固定是 NDWIN 的某個倍數。 |
| DTWIN → NDWIN | 主機可要求切換;操作屬性超過典型或最大值,或發生 Deterministic Excursion 時,Set 可自行轉入 NDWIN。 | 有關聯而且送對 SQ,仍不能忽略視窗的讀取量、寫入量與時間條件。 |
來源:NVME-BASE-2.4, Rev. 2.4, §8.1.21, Figure 751, 文件頁 682-683, PDF 頁 708-709
Base751-1DTWIN 與 NDWIN 表示同一 Set 沿時間經過的不同工作視窗,不是兩個 Set。
來源: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。原圖沒有時間刻度,不能從方塊寬度算毫秒。
06.07.Figures 333/334/336 選查詢;343~345 解釋清單;346 只取 NSID 查詢條件及 NVMSETID 歸屬欄位。
回到本節的解釋與範例06.08.只取 CNS 01h/04h/08h,以及命令中解釋這三種查詢所需的欄位。
| 一起判讀的欄位或標示 | 如何共同決定操作或結果 | 帶入情境後怎麼讀 |
|---|---|---|
| Figure 333:CNS bits 7:0 | 01h 回控制器資料;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:0 | CNS=04h 用作清單起始 Set ID;01h/08h 未定義,屬保留。bits 23:16 保留。 | 04h 配 7 是找 ID≥7;08h 的目標由 NSID 決定。 |
| Figure 336:O/M 與 Y/N | O/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 對照。 |
來源: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
Base333-1CDW10 的 CNS 選擇要問哪個問題,CNTID 不是 namespace 的編號。
來源: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。
Base334-1CDW11 低 16 bits 的意思由 CNS 決定,不是每次 Identify 都在選 Set。
來源: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 在該選項未定義。
Base336-1先用 CNS 列選回覆結構,再用 Y/N 判斷 NSID、CNTID、CSI 是否參與這次查詢。
來源: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 欄,就認為所有選項都使用它。
06.09.Figure 343 選清單起點,344 定位一筆資料,345 才讀該 Set 的欄位。清單依 ID 排序,只包含處理查詢的控制器可存取的 Set。
| 一起判讀的欄位或標示 | 如何共同決定操作或結果 | 帶入情境後怎麼讀 |
|---|---|---|
| Figure 343:CDW11 bits 15:0 | NVMSETID 是起始識別值,下限為含等號的 ≥。最大值 FFFFh;繼續列舉時不可回繞。 | 上一筆為 37,下一次可從 38 開始;可能直接取得 100,ID 不必連續。 |
| Figure 344:byte 0/bytes 127:1 | NUMENT=0~31;其餘 header 保留。 | 31 筆加 header 為 128+31×128=4096 bytes。 |
| Figure 344:Entry i | i 是從 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,不能把最後一個已知欄位結尾當下一筆起點。 |
來源: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
Base343-1清單的起點是 Set 識別值下限,而且包含等於該值的 entry。
來源: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。
Base344-1NUMENT 是直接筆數,entry 位置則由固定 header 與 128-byte 步距計算。
來源: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 筆。
Base345-1同一筆 entry 同時有識別值、效能參考與儲存容量,必須分開使用。
來源: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:10 | NSID≠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 的共同能力代替。 |
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.14.2.8, Figure 346, 文件頁 390,393, PDF 頁 416,419
Base346-1查特定 NSID 的 NVMSETID,才能把 I/O 對象接到正確的 Set。
來源: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 的歸屬。
06.11.Figures 575~579 按記憶體、深度、完成路徑、Set 與建立錯誤分工閱讀;本篇範例採一般主機記憶體。
回到本節的解釋與範例06.12.這裡以一般主機記憶體為前提,Figures 575~579 分別回答「佇列放哪、多少項、結果送哪、服務哪個 Set」。相關條件在此共用一次。
| 一起判讀的欄位或標示 | 如何共同決定操作或結果 | 帶入情境後怎麼讀 |
|---|---|---|
| Figure 575:PRP1 bits 63:0/PC | PC=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:16 | 0 或超出支援範圍時必須回 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:0 | 0 或 SQA 不受支援:沒有特定關聯。支援 SQA 且非零值不在 Set List:必須以 Invalid Field in Command 中止。 | 選 Set 7 填 00000007h;高 16 bits 保留。NSID 在建立命令中不負責選這個 Set。 |
| Figure 579:命令專用 0h/1h/2h | 依序表示完成佇列未建立、佇列編號無效、佇列深度或項目大小初始化條件不符。 | 此表 0h 是命令專用狀態碼,不等於通用狀態類別的成功碼;需連同類別解讀。 |
來源: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
Base575-1PRP1 的內容由 PC 決定,描述的是 SQ 記憶體,不是 namespace 資料位置。
來源: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 解成頁面清單的位址。
Base576-1QSIZE 選數量、QID 選名稱,64 筆 SQ3 要編成 003F0003h。
來源: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。
Base577-1CQID 決定後續 I/O 的完成去處;PC 與 QPRIO 分別影響記憶體描述與仲裁。
來源: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 優先級。
Base578-1NVMSETID 在建立 SQ 時提供 Set 關聯,0 在這個命令明確表示沒有特定關聯。
來源: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。
Base579-1建立命令的錯誤值要搭配錯誤類別與觸發欄位,不能當作後續 I/O 的分流檢查表。
來源: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。
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
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
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
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
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