命令內容 SQE
01-01理解命令識別、操作碼與資料指標的分工。
NVMe · 規格與原理
00.01.一筆 NVMe 命令必須告訴控制器要做什麼、對哪個 namespace 操作,以及資料放在哪裡;完成結果則必須讓主機認出是哪筆命令、結果如何。本篇從這兩個方向拆解 SQE、CQE 與 PRP/SGL。
01-01理解命令識別、操作碼與資料指標的分工。
02-01分開理解新完成項目、命令身分與狀態碼。
03-01把作業系統的記憶體頁面概念接到 NVMe 資料傳輸。
04-01理解功能值、識別碼、清單與文字的表示方式。
00.02.命令與完成項目是佇列中的記錄,讀寫的資料通常由資料指標指定。先分清楚「命令記錄」與「命令要搬移的資料」,就能理解後面的欄位配置。
00.03.把一次操作拆成三份資訊:SQE 說明主機要做什麼,PRP/SGL 描述資料在哪裡,CQE 回報是哪筆命令完成及其結果。識別碼與清單則協助主機選擇正確對象。
00.04.本篇由共同布局逐步深入位元、長度與指標。讀完應能從一個命令範圍算出資料量,選擇正確的指標解讀方式,再利用完成項目找回原命令。每次計算都要先確認單位,而不是只憑欄位名稱推測。
01.01.OPC 說要做什麼,NSID 說對哪個 namespace 做,命令專屬 Dwords 再描述其地址範圍。CID 則是主機日後辨識這筆命令的識別碼;CID 不是資料的起始 LBA。
01.02.DPTR 可能以 PRP 或 SGL 描述資料位置,PSDT 決定解讀方式。控制器先按 PSDT 選結構,再解釋 DPTR 內的 bit;不能只看某個值很像地址就直接作為連續 buffer。
01.03.完成後以 CQE 的 SQID 與 CID 對回這筆 SQE,再以 SCT、SC 判斷結果。原 SQE 的參數提供上下文,CQE 的狀態才知道這組要求被如何處理。
來源:NVME-BASE-2.4, Rev. 2.4, §4.1.1, 文件頁 139-143, PDF 頁 165-169
來源:NVME-BASE-2.4, Rev. 2.4, §4.1.1, 文件頁 140, PDF 頁 166
來源:NVME-BASE-2.4, Rev. 2.4, §4.1.1, 文件頁 140-142, PDF 頁 166-168
01.05.Admin 與 I/O common SQE 固定為 64 bytes。CDW0、NSID、data pointer 與 CDW10-15 的通用位置先固定,再由各 command 定義命令專屬內容。
來源:NVME-BASE-2.4, Rev. 2.4, §4.1.1, 文件頁 139-143, PDF 頁 165-169
01.06.CID 與 Submission Queue identifier 的組合用來唯一識別 command;FFFFh 宜(should)避免使用,因 Error Information log 以該值表示錯誤未對應特定 command。
來源:NVME-BASE-2.4, Rev. 2.4, §4.1.1, 文件頁 140, PDF 頁 166
01.07.CDW0.PSDT 決定 DPTR 解讀為 PRP 或 SGL。NVMe over PCIe 的 Admin command 原則上必須(shall)使用 PRP,除非 command 定義另有規定。
來源:NVME-BASE-2.4, Rev. 2.4, §4.1.1, 文件頁 140-142, PDF 頁 166-168
| SQE 區域 | 主機在這裡描述什麼 | 如何選擇正確的欄位定義 |
|---|---|---|
| CDW0 | 命令身分 與 資料指標選擇欄位 | 所有 commands 共用 |
| NSID | 指定的 namespace 範圍 | 不用時必須依 command 定義清零或使用特殊值 |
| MPTR/DPTR | metadata 與 data buffer | 由 PSDT 與 command 規則決定 |
| CDW10-15 | 命令專用參數 | 不能跨 command 借用語意 |
02.01.主機讀取 CQE 時,先要知道這個位置是否包含新完成項目,再辨認它屬於哪筆命令,最後才解釋結果。Phase Tag、SQID/CID、SCT/SC 分別參與這三個問題。單獨讀出一個狀態碼,缺少命令和類別,就容易查到錯的狀態定義。
02.02.DNR 描述以相同命令重試是否預期能成功,不等於永久硬體故障診斷。CRD 在適用時提供重試延遲選擇,也不是所有狀態都通用的等待時間。這些補充欄位應在辨認主要結果後閱讀,而不是取代主要結果。
來源:NVME-BASE-2.4, Rev. 2.4, §4.2.1, 文件頁 144-145, PDF 頁 170-171
來源:NVME-BASE-2.4, Rev. 2.4, §4.2.3, 文件頁 145-155, PDF 頁 171-181
來源:NVME-BASE-2.4, Rev. 2.4, §4.2.4, 文件頁 155-158, PDF 頁 181-184
02.03.common CQE 至少 16 bytes;若以多次寫入建立 CQE,Phase Tag 必須(shall)在最後一次寫入更新,避免 host 看到半成品。
來源:NVME-BASE-2.4, Rev. 2.4, §4.2.1, 文件頁 144-145, PDF 頁 170-171
02.04.status 要先解 Status Code Type(SCT),再解 Status Code(SC),同時檢查 Do Not Retry(DNR)等控制 bit;數值不能脫離 SCT 單獨解讀。
來源:NVME-BASE-2.4, Rev. 2.4, §4.2.3, 文件頁 145-155, PDF 頁 171-181
02.05.Phase Tag 讓 host 判斷環形 Completion Queue slot 是否為新完成項目;host 消費 CQE 後推進 CQ head doorbell,wrap 時預期 phase 翻轉。
來源:NVME-BASE-2.4, Rev. 2.4, §4.2.4, 文件頁 155-158, PDF 頁 181-184
| 完成狀態欄位 | 回答哪個問題 | 解讀時還需哪些資訊 |
|---|---|---|
| SCT | status 大類 | 一定先解 |
| SC | 類別內具體結果 | 不能脫離 SCT |
| DNR | 同 command 重試預期 | 不是永久硬體故障的同義詞 |
| CRD | 建議 retry delay selector | 只有適用 status 才使用 |
03.01.假設 memory page 是 4096 bytes,PRP1 指到頁內 offset 3072,第一頁可承載 1024 bytes。需要傳輸 6144 bytes 時,第一頁之後還剩 5120 bytes。
03.02.5120 bytes 超過一個完整 page,因此後面至少需要兩個資料頁。此時 PRP2 應按 PRP List 的規則解讀,而不是直接當成第二個資料頁地址。
03.03.清單的第一個資料頁承接 4096 bytes,下一頁承接最後 1024 bytes。主機的虛擬地址可以連續,控制器可見的資料頁地址不必因此連續;PRP List 就是在描述這些實際頁位置。
來源:NVME-BASE-2.4, Rev. 2.4, §4.3.1, 文件頁 158-159, PDF 頁 184-185
來源:NVME-BASE-2.4, Rev. 2.4, §4.1.1, 文件頁 140-142, PDF 頁 166-168
03.05.PRP 以固定大小 entry 指向 physical memory page。第一個 entry 可含 page offset;後續 PRP 必須(shall)符合 page alignment,資料長度決定需要幾個 entry。
來源:NVME-BASE-2.4, Rev. 2.4, §4.3.1, 文件頁 158-159, PDF 頁 184-185
| 資料跨頁情況 | PRP2 的解讀方式 | 指標與對齊要求 |
|---|---|---|
| 資料不跨第一頁 | 只需 PRP1 | PRP2 不承載下一段 |
| 剩餘資料只需一頁 | PRP2 指第二個 data page | address page-aligned |
| 剩餘資料超過一頁 | PRP2 指 PRP List | list entries 再指 data pages |
04.01.Data Block descriptor 描述一段資料,Segment descriptor 指向下一組描述子。兩者都可能含地址和長度,但長度指的是資料或描述子集合,不能交叉解讀。
04.02.若兩個 Data Block 分別有 1024 與 3072 bytes,它們可共同描述一筆 4096-byte 傳輸。控制器沿描述子順序使用資料;兩個地址不必相鄰。
04.03.Identify 回報支援哪些 SGL 能力,命令格式也限制可以採用的 descriptor。圖中出現某種型別,不表示任何控制器、任何命令都能使用。
來源:NVME-BASE-2.4, Rev. 2.4, §4.3.2, 文件頁 159-166, PDF 頁 185-192
來源:NVME-BASE-2.4, Rev. 2.4, §4.1.1, 文件頁 140-142, PDF 頁 166-168
04.05.SGL 由一個以上 descriptor/segment 描述資料 buffer。SGL length 必須(shall)大於等於 requested transfer length;本報告只介紹 PCIe 可用的通用 descriptor。
來源:NVME-BASE-2.4, Rev. 2.4, §4.3.2, 文件頁 159-166, PDF 頁 185-192
| 指標或描述子種類 | 位址與長度描述什麼 | 沿指標會找到什麼 |
|---|---|---|
| PRP | 以記憶體頁描述位址 | 第一頁 offset + 後續 page alignment |
| SGL Data Block | 起始位址與資料長度(bytes) | 資料區段可用 descriptor 表示 |
| SGL Segment | 清單位址與清單長度(bytes) | 指向下一層 descriptors,不是 data |
| Bit Bucket | 只消耗 transfer length | 不代表可讀寫的 memory buffer |
05.01.識別資料可能是固定長度的數值,也可能是字串或清單。它們解決的問題不同:廠商 ID 辨認廠商,型號與序號描述產品,namespace 的全域識別值用來辨認儲存對象。長度相同或外觀看起來都是十六進位,並不表示可以互換。
05.02.清單也不一定都從數量欄位開始。Controller List 先放 NUMCIDS,再列控制器 IDs;Namespace List 直接排列 NSIDs,未使用位置依規則填零。字串則要分開計算字元數與 bytes,例如「中」以 UTF-8 編碼占 3 bytes,而不是 1 byte。
來源:NVME-BASE-2.4, Rev. 2.4, §4.4, 文件頁 166-169, PDF 頁 192-195
來源:NVME-BASE-2.4, Rev. 2.4, §4.5, 文件頁 169-172, PDF 頁 195-198
來源:NVME-BASE-2.4, Rev. 2.4, §4.6, 文件頁 172-173, PDF 頁 198-199
來源:NVME-BASE-2.4, Rev. 2.4, §4.8, 文件頁 175, PDF 頁 201
05.03.Feature 可能具有 default、saved、目前值;保存值 支援與跨 reset/power cycle 的 persistence 由 SSFS 與各 Feature capability 判定。
來源:NVME-BASE-2.4, Rev. 2.4, §4.4, 文件頁 166-169, PDF 頁 192-195
05.04.VID/SSVID、SN/MN、IEEE OUI、EUI64、NGUID 與 UUID 的來源、長度與唯一性範圍不同;不能只因外觀相似就互換。此節為 informative。
來源:NVME-BASE-2.4, Rev. 2.4, §4.5, 文件頁 169-172, PDF 頁 195-198
05.05.Controller List 先以 NUMCIDS 指定數量,再依遞增順序排列最多 2047 個 16-bit controller identifiers。Namespace List 沒有數量 header,直接依遞增順序排列 32-bit NSIDs;兩種清單未使用的 entries 都填 0。
來源:NVME-BASE-2.4, Rev. 2.4, §4.6, 文件頁 172-173, PDF 頁 198-199
05.06.處理 UTF-8 輸入時要依規格流程驗證編碼、禁止的 code point 與截斷情況;不可把任意 byte sequence 當成有效字串。
來源:NVME-BASE-2.4, Rev. 2.4, §4.8, 文件頁 175, PDF 頁 201
| 識別欄位或清單 | 辨認的對象與格式 | 長度及數量如何解讀 |
|---|---|---|
| VID/SSVID | 廠商與 subsystem 廠商識別值 | 按各自欄位辨認對象 |
| SN/MN | 產品序號與型號字串 | 依固定欄位長度與填補規則閱讀 |
| EUI64/NGUID/UUID | 不同格式的物件識別值 | 長度及身分範圍不能互換 |
| Controller List | NUMCIDS 加上 16-bit IDs | 有明確數量欄位 |
| Namespace List | 直接排列 32-bit NSIDs | 沒有 Controller List 的數量標頭 |
06.01.以下依概念整理規格中的圖表。每組先說明讀取順序與要判斷的問題,接著列出各圖的欄位或行為說明。可以由正文的連結跳到對應組別,也可以用這一節檢查自己能否把欄位連回完整操作。
06.02.共用布局圖先找 CDW0、NSID、MPTR/DPTR 與命令專用區域,再看 CDW0 的 bit 範圍。圖塊為方便閱讀而調整寬度時,以標註的 bits 為準,不能拿像素寬度計算欄位大小。
回到本節的解釋與範例06.03.CDW0 先選操作與資料指標格式;NSID 選操作對象;DPTR/MPTR 再指向資料。命令專屬 Dwords 的含義由 OPC 與命令集決定。
| 一起判讀的欄位或標示 | 如何共同決定操作或結果 | 帶入情境後怎麼讀 |
|---|---|---|
| OPC/FUSE/CID | OPC 選操作,FUSE 說明融合操作角色,CID 讓完成項目找回原命令。 | 相同的 CDW10 數值放在 Read 與 Set Features 中,可能完全不是同一種意思。 |
| PSDT → DPTR/MPTR | PSDT 決定指標依 PRP 或 SGL 等格式解讀;指標內的數值不可在未選格式時直接當成長度。 | 主機先選指標格式,再按該格式準備 buffer 描述,最後由命令語意判斷資料方向。 |
| NSID/CDW2–CDW15 | NSID 與命令專屬欄位共同決定對象、範圍及選項。 | Create 的 DPTR 指向建立參數;它不是新 namespace 的實體儲存位址。 |
| NDT/NDM/MDPTR | 廠商命令使用共同格式時,資料與 metadata 長度各有自己的欄位及指標。 | 先看廠商命令格式支援宣告,再依長度定義換算,不能把欄位上限直接加 1 後存回同寬整數。 |
來源:NVME-BASE-2.4, Rev. 2.4, §4.1.1, Figure 92, 文件頁 139-140, PDF 頁 165-166
來源:NVME-BASE-2.4, Rev. 2.4, §4.1.1, Figure 93, 文件頁 140-142, PDF 頁 166-168
來源:NVME-BASE-2.4, Rev. 2.4, §4.1.1, Figure 94, 文件頁 143, PDF 頁 169
Base92-1CDW0 把操作碼、資料指標類型、融合設定與命令識別放在一起。
來源:NVME-BASE-2.4, Rev. 2.4, §4.1.1, Figure 92, 文件頁 139-140, PDF 頁 165-166
Base92-2兩筆命令 OPC 相同但 CID 不同,代表相同操作的兩個請求;不能把 CID 當成操作種類。
Base93-1共通 SQE 固定各命令共用欄位的位置。
來源:NVME-BASE-2.4, Rev. 2.4, §4.1.1, Figure 93, 文件頁 140-142, PDF 頁 166-168
Base93-2同樣在 CDW10,Read 與管理命令可以有完全不同含義;先依 OPC 選命令,再查專屬欄位表。
Base94-1廠商命令格式另以 NDT、NDM 表達傳輸長度資訊。
來源:NVME-BASE-2.4, Rev. 2.4, §4.1.1, Figure 94, 文件頁 143, PDF 頁 169
Base94-2若依欄位定義 NDT=16 個 Dwords,資料長度為 64 bytes;此值不能套用別的命令從零起算的加 1 規則。
06.04.完成布局圖按「新項目→原命令→結果」閱讀:先確認 P,再連接 SQID、CID,最後用 SCT 選狀態表並查 SC。DNR、CRD 接在主要結果後解釋。
回到本節的解釋與範例06.05.先以 Phase Tag 辨認新完成項目,再用 SQID 與 CID 對回要求。SCT 決定 SC 所屬表格,DNR 與 CRD 補充重試資訊;SQHD 表示提交佇列進度,不能當成這筆命令的資料長度。
| 一起判讀的欄位或標示 | 如何共同決定操作或結果 | 帶入情境後怎麼讀 |
|---|---|---|
| SQID/CID/SQHD | 前兩者辨認命令,SQHD 告知控制器的 SQ Head。 | 一個 CQ 收到多個 SQ 的完成項目時,即使 CID 相同也可由 SQID 區分。 |
| SCT → SC | 先選 Generic、Command Specific、Media 或 Path 等類別,再查具體碼值。 | SC=某個值不能單獨命名錯誤;必須保留它搭配的 SCT。 |
| DNR/CRD/CRDT | DNR 與重試延遲資訊影響如何理解重新提交;不能把它們當成原命令已成功。 | 重試前仍要確認原操作的狀態與副作用,不能只看延遲已經過。 |
| DW0/DW1/Phase Tag | 前兩個 Dwords 的內容依命令解釋;Phase Tag 隨 CQ 回繞而變化。 | Create 成功時 DW0 可回 NSID;同一位置在另一種命令不一定有這種意義。 |
來源:NVME-BASE-2.4, Rev. 2.4, §4.2.1, Figure 97, 文件頁 144, PDF 頁 170
來源:NVME-BASE-2.4, Rev. 2.4, §4.2.1, Figure 98, 文件頁 144, PDF 頁 170
來源:NVME-BASE-2.4, Rev. 2.4, §4.2.1, Figure 99, 文件頁 145, PDF 頁 171
來源:NVME-BASE-2.4, Rev. 2.4, §4.2.3, Figure 101, 文件頁 145-146, PDF 頁 171-172
來源:NVME-BASE-2.4, Rev. 2.4, §4.2.3, Figure 102, 文件頁 146, PDF 頁 172
來源:NVME-BASE-2.4, Rev. 2.4, §4.2.3, Figure 103, 文件頁 147-150, PDF 頁 173-176
來源:NVME-BASE-2.4, Rev. 2.4, §4.2.3.2, Figure 104, 文件頁 151-152, PDF 頁 177-178
來源:NVME-BASE-2.4, Rev. 2.4, §4.2.3.2, Figure 105, 文件頁 152-153, PDF 頁 178-179
來源:NVME-BASE-2.4, Rev. 2.4, §4.2.3.2, Figure 107, 文件頁 154-155, PDF 頁 180-181
來源:NVME-BASE-2.4, Rev. 2.4, §4.2.3.3, Figure 108, 文件頁 155, PDF 頁 181
來源:NVME-BASE-2.4, Rev. 2.4, §4.2.4, Figure 109, 文件頁 156-157, PDF 頁 182-183
Base97-1CQE 把命令結果、佇列資訊與識別碼組成完成紀錄。
來源:NVME-BASE-2.4, Rev. 2.4, §4.2.1, Figure 97, 文件頁 144, PDF 頁 170
Base97-2先用 SQID 與 CID 找回原命令,再解 status 與命令專屬結果;DW0 並非每種命令都代表相同東西。
Base98-1CQE DW2 回報來源 SQ 與該 SQ 的 head 資訊。
來源:NVME-BASE-2.4, Rev. 2.4, §4.2.1, Figure 98, 文件頁 144, PDF 頁 170
Base98-2SQID 指向 SQ2、SQHD 已前進時,主機可理解控制器消耗進度;它不表示其他所有命令都已完成。
Base99-1CQE DW3 同時帶有命令識別碼與完成狀態。
來源:NVME-BASE-2.4, Rev. 2.4, §4.2.1, Figure 99, 文件頁 145, PDF 頁 171
Base99-2找到 CID 7 的回覆後,仍要讀 STATUS;識別到這筆命令並不等於它成功執行。
Base101-1Status 欄位必須把類型、代碼與附加控制資訊一起解釋。
來源:NVME-BASE-2.4, Rev. 2.4, §4.2.3, Figure 101, 文件頁 145-146, PDF 頁 171-172
Base101-2相同 SC 數值搭配不同 SCT 可以有不同意思;DNR 也不能從 SC 名稱猜出,必須看實際 bit。
Base102-1SCT 先把狀態分成通用、命令專屬等類別。
來源:NVME-BASE-2.4, Rev. 2.4, §4.2.3, Figure 102, 文件頁 146, PDF 頁 172
Base102-2先看到 SCT=1,再去查命令專屬狀態;若忽略 SCT 直接在通用表找同值,可能得到錯誤原因。
Base103-1通用狀態表描述跨命令可出現的共同錯誤。
來源:NVME-BASE-2.4, Rev. 2.4, §4.2.3, Figure 103, 文件頁 147-150, PDF 頁 173-176
Base103-2Invalid Field in Command 表示有欄位不符合要求,但哪個欄位仍須回到該命令定義,不是表格會直接告訴你修改哪個 byte。
Base104-1命令專屬狀態表必須和發出命令的種類連用。
來源:NVME-BASE-2.4, Rev. 2.4, §4.2.3.2, Figure 104, 文件頁 151-152, PDF 頁 177-178
Base104-2Namespace Insufficient Capacity 應連回建立 namespace 所需容量;不能拿它解釋一般 Read 超出 LBA 範圍。
Base105-1I/O Command Set 專屬狀態要再到相應命令集規格解釋。
來源:NVME-BASE-2.4, Rev. 2.4, §4.2.3.2, Figure 105, 文件頁 152-153, PDF 頁 178-179
Base105-2Base 提供共用分類,NVM Command Set 補上資料操作的具體含義;兩份規格在這裡接續。
Base107-1媒體與資料完整性狀態指出資料讀寫或檢查的結果。
來源:NVME-BASE-2.4, Rev. 2.4, §4.2.3.2, Figure 107, 文件頁 154-155, PDF 頁 180-181
Base107-2Guard Check Error 與 Compare Failure 都與資料有關,但前者是保護檢查、後者是內容不符,不應用同一句「資料錯誤」帶過。
Base108-1路徑相關狀態描述透過目前控制器到資料的存取情況。
來源:NVME-BASE-2.4, Rev. 2.4, §4.2.3.3, Figure 108, 文件頁 155, PDF 頁 181
Base108-2某條路徑不適合存取時,不一定表示 namespace 資料已損毀;要依狀態與可用路徑判斷。
Base109-1Phase Tag 隨 CQ 繞回而改變,幫助辨識新完成項目。
來源:NVME-BASE-2.4, Rev. 2.4, §4.2.4, Figure 109, 文件頁 156-157, PDF 頁 182-183
Base109-2主機把一輪 entries 讀完回到 slot 0 時,期待的 phase 已翻轉,因此舊 CQE 不會被再次當成新結果。
06.06.先算第一頁剩餘量,再算未覆蓋的資料長度,用這個結果選 PRP2 分支。沿 PRP List 圖中的箭頭辨認「清單所在頁」和「資料頁」,兩者的用途不同。
回到本節的解釋與範例06.07.PRP1 的 page offset 決定第一頁還能容納多少資料,總長度再決定 PRP2 是下一頁位址還是 PRP List 位址。指標串接與資料是否實體連續是兩個問題。
| 一起判讀的欄位或標示 | 如何共同決定操作或結果 | 帶入情境後怎麼讀 |
|---|---|---|
| Page Base Address/Offset | 將位址拆為 page 基底與頁內位移;page 大小以主機所選記憶體 page 設定解讀。 | page 為 4096 bytes、offset=3072,第一頁只剩 1024 bytes 可放資料。 |
| PRP2/PRP List entries | 先扣掉第一頁已涵蓋的長度,再依剩餘量判斷直接指下一頁或使用清單。 | 傳輸 8192 bytes 且第一頁只剩 1024 bytes 時,還需涵蓋後續 7168 bytes,不能只給一個下一頁。 |
| 清單串接與對齊 | 清單中的頁位址及下一段清單各有對齊與最後項目的使用規則。 | 不能把作為下一張清單指標的位置,又當成一頁實際資料。 |
來源:NVME-BASE-2.4, Rev. 2.4, §4.3.1, Figure 110, 文件頁 158, PDF 頁 184
來源:NVME-BASE-2.4, Rev. 2.4, §4.3.1, Figure 111, 文件頁 158, PDF 頁 184
來源:NVME-BASE-2.4, Rev. 2.4, §4.3.1, Figure 112, 文件頁 159, PDF 頁 185
來源:NVME-BASE-2.4, Rev. 2.4, §4.3.1, Figure 113, 文件頁 159, PDF 頁 185
Base110-1PRP entry 是有固定位元配置的記憶體指標。
來源:NVME-BASE-2.4, Rev. 2.4, §4.3.1, Figure 110, 文件頁 158, PDF 頁 184
Base110-2先按圖取出位址相關位元,再配合頁大小判斷它指向哪一頁;不能把 64-bit entry 當成資料長度。
Base111-1PRP 的頁基底與頁內 offset 共同形成第一段資料位置。
來源:NVME-BASE-2.4, Rev. 2.4, §4.3.1, Figure 111, 文件頁 158, PDF 頁 184
Base111-24 KiB 頁、offset=128 時,第一頁剩餘 4096−128=3968 bytes;是否需要下一個 PRP 由總長度決定。
Base112-1連續實體頁面仍可用 PRP List 逐頁描述。
來源:NVME-BASE-2.4, Rev. 2.4, §4.3.1, Figure 112, 文件頁 159, PDF 頁 185
Base112-2三個資料頁位址相鄰,PRP entries 也各指一頁;連續排列不表示可以把三頁壓成一個只含長度的 PRP。
Base113-1不連續實體頁面可由 PRP List 組成連續的傳輸資料。
來源:NVME-BASE-2.4, Rev. 2.4, §4.3.1, Figure 113, 文件頁 159, PDF 頁 185
Base113-2第一頁在位址 A、第二頁在 B,主機資料順序由 list 順序決定,不要求 A 和 B 的實體位址相鄰。
06.08.每次沿箭頭前先讀 descriptor type,區分目的地是 data 還是 descriptor list。加總傳輸資料量只計入相應的資料描述,不能把存放清單的 bytes 也當作使用者資料。
回到本節的解釋與範例06.09.SGL 的型別與子型別決定描述子是在描述資料、下一段描述子,或其他受支援行為。LEN 的單位雖然是長度,所指的內容仍由型別決定。
| 一起判讀的欄位或標示 | 如何共同決定操作或結果 | 帶入情境後怎麼讀 |
|---|---|---|
| SGLID/SGLDT/SGLDST | 型別與子型別決定此描述子的結構及合法組合。 | Data Block 的 ADDR 指向資料;Segment 的 ADDR 指向更多描述子,兩者不能當成相同 buffer。 |
| ADDR/LEN | 一起描述一段範圍;主機還需檢查總涵蓋長度與命令要求相符。 | 前段 1024 bytes、後段 3072 bytes 可涵蓋 4096 bytes,但每個描述子仍需符合自身規則。 |
| Segment/Last Segment/Bit Bucket | Segment 與 Last Segment 表達清單串接,Bit Bucket 表達特定資料處理方式。 | 遇到 Last Segment 就按最後一段的規則處理,不再假定有下一段指標。 |
來源:NVME-BASE-2.4, Rev. 2.4, §4.3.2, Figure 114, 文件頁 161, PDF 頁 187
來源:NVME-BASE-2.4, Rev. 2.4, §4.3.2, Figure 115, 文件頁 161, PDF 頁 187
來源:NVME-BASE-2.4, Rev. 2.4, §4.3.2, Figure 116, 文件頁 161, PDF 頁 187
來源:NVME-BASE-2.4, Rev. 2.4, §4.3.2, Figure 117, 文件頁 161-162, PDF 頁 187-188
來源:NVME-BASE-2.4, Rev. 2.4, §4.3.2, Figure 118, 文件頁 162, PDF 頁 188
來源:NVME-BASE-2.4, Rev. 2.4, §4.3.2, Figure 119, 文件頁 162-163, PDF 頁 188-189
來源:NVME-BASE-2.4, Rev. 2.4, §4.3.2, Figure 120, 文件頁 163, PDF 頁 189
來源:NVME-BASE-2.4, Rev. 2.4, §4.3.2, Figure 121, 文件頁 163, PDF 頁 189
來源:NVME-BASE-2.4, Rev. 2.4, §4.3.2, Figure 122, 文件頁 164, PDF 頁 190
來源:NVME-BASE-2.4, Rev. 2.4, §4.3.2.1, Figure 125, 文件頁 166, PDF 頁 192
Base114-1SGL 錯誤條件涵蓋描述子格式與傳輸長度等不同問題。
來源:NVME-BASE-2.4, Rev. 2.4, §4.3.2, Figure 114, 文件頁 161, PDF 頁 187
Base114-2描述子型別合法但總長度不足,與型別本身不受支援不同;先確定問題出在哪一層。
Base115-1SGL Segment 是一組描述子的容器。
來源:NVME-BASE-2.4, Rev. 2.4, §4.3.2, Figure 115, 文件頁 161, PDF 頁 187
Base115-2一個 segment 裡可有多個 data descriptors,不能把 segment 的 byte 長度直接當成使用者資料長度。
Base116-1Generic SGL Descriptor 固定型別欄位的位置。
來源:NVME-BASE-2.4, Rev. 2.4, §4.3.2, Figure 116, 文件頁 161, PDF 頁 187
Base116-2先讀 SGLID 判斷 descriptor 類型,再解其餘 bytes;同一位置在資料描述子與 segment 描述子中指向不同對象。
Base117-1SGL Descriptor Type 決定這個項目描述資料還是另一組描述子。
來源:NVME-BASE-2.4, Rev. 2.4, §4.3.2, Figure 117, 文件頁 161-162, PDF 頁 187-188
Base117-2Data Block 指向資料,Segment 指向描述子清單;把後者當成資料會把清單內容誤作使用者 payload。
Base118-1Descriptor Subtype 進一步限定同一型別的解釋。
來源:NVME-BASE-2.4, Rev. 2.4, §4.3.2, Figure 118, 文件頁 162, PDF 頁 188
Base118-2主型別相同仍要查看 subtype 是否適用於 PCIe 情境,不只比對 descriptor 第一層分類。
Base119-1Data Block descriptor 用位址與長度描述一段資料。
來源:NVME-BASE-2.4, Rev. 2.4, §4.3.2, Figure 119, 文件頁 162-163, PDF 頁 188-189
Base119-2ADDR 指向主機 buffer、LEN=4096 表示這段有 4096 bytes;它不同於 PRP 依頁大小隱含覆蓋長度。
Base120-1Bit Bucket descriptor 表示資料流中要丟棄的部分。
來源:NVME-BASE-2.4, Rev. 2.4, §4.3.2, Figure 120, 文件頁 163, PDF 頁 189
Base120-2只需保留某段 Read 資料時,可依允許規則讓不需要的部分進 bit bucket;LEN 仍要計入整筆資料流的覆蓋範圍。
Base121-1Segment descriptor 指向下一組 SGL 描述子。
來源:NVME-BASE-2.4, Rev. 2.4, §4.3.2, Figure 121, 文件頁 163, PDF 頁 189
Base121-2LEN 描述下一組 descriptor 占用的 bytes,不能把它當成下一段使用者資料的 bytes。
Base122-1Last Segment descriptor 表示最後一組描述子的連結。
來源:NVME-BASE-2.4, Rev. 2.4, §4.3.2, Figure 122, 文件頁 164, PDF 頁 190
Base122-2走到最後一組後應按此型別結束後續連結,不因 buffer 後面還有資料就繼續解成另一個 segment。
Base125-1SGL Read 範例把多個 descriptor 串成一筆完整傳輸。
來源:NVME-BASE-2.4, Rev. 2.4, §4.3.2.1, Figure 125, 文件頁 166, PDF 頁 192
Base125-2沿箭頭累計每段資料長度,遇到 segment 先走到描述子清單,遇到 data block 才累計使用者資料。
06.10.識別格式圖先看對象、寬度及字串填補規則。Controller List 依 NUMCIDS 讀有效項目;Namespace List 依自己的結構和零值規則讀取,不借用另一張清單的 header 格式。
回到本節的解釋與範例06.11.Reset、shutdown、power cycle 與逾時偵測是不同事件。圖中的前後狀態要配合受影響的控制器或 subsystem 範圍閱讀。
| 一起判讀的欄位或標示 | 如何共同決定操作或結果 | 帶入情境後怎麼讀 |
|---|---|---|
| Current/Saved/Default | 目前生效值、保存值與預設值有不同用途;事件發生後以適用的恢復規則決定 current。 | 保存過某個值,仍需確認此次 reset 的範圍及功能規則,才能知道它是否成為目前值。 |
| KATT/偵測時間 | Keep Alive 的計時與檢查時點共同決定何時察覺逾時。 | 在兩次檢查之間錯過一次更新,實際偵測時間可能超過單一 KATT。 |
來源:NVME-BASE-2.4, Rev. 2.4, §4.4, Figure 126, 文件頁 167, PDF 頁 193
來源:NVME-BASE-2.4, Rev. 2.4, §4.4, Figure 127, 文件頁 168, PDF 頁 194
Base126-1整個 subsystem reset 後,Feature 目前值 依保存與預設規則恢復。
來源:NVME-BASE-2.4, Rev. 2.4, §4.4, Figure 126, 文件頁 167, PDF 頁 193
Base126-2重設前暫時修改的 目前值 不一定保留;要看 保存值與預設值 的選擇條件,不能只讀重設前的值。
Base127-1只重設 subsystem 的部分範圍時,Feature 恢復行為可能不同。
來源:NVME-BASE-2.4, Rev. 2.4, §4.4, Figure 127, 文件頁 168, PDF 頁 194
Base127-2將 Figure 126 的全部重設改成部分控制器重設,先確認 Feature scope 是否涵蓋未重設的物件,再沿表判斷 目前值。
06.12.識別碼、文字欄位與清單索引需要不同解讀方式。先讀來源定義的長度與編碼,再決定要比較整個值、拆出廠商部分,或沿清單尋找指定物件。
| 一起判讀的欄位或標示 | 如何共同決定操作或結果 | 帶入情境後怎麼讀 |
|---|---|---|
| VID/SSVID/SN/MN | 前兩者識別廠商與子系統廠商,後兩者是序號與型號文字;不能套用相同的數值或字串規則。 | 文字欄位的 padding 與編碼要按定義處理,不將固定長度緩衝區一概當成以零結尾的字串。 |
| OUI/EUI64/NGUID/UUID | 有各自的長度與組成規則;識別物件時保留完整值。 | 僅有相同 OUI 只能說明共同的組成部分,不代表兩個 namespace 相同。 |
| NUMCIDS/Controller List/Namespace List | 數量欄位或清單終止規則決定有效項目;識別碼的合法性另行判斷。 | NUMCIDS=2 表示讀取兩個有效控制器項目,並非最高控制器識別碼是 2。 |
| UIDX/UUID List Entry/IDASSOC | UIDX 選清單項目,項目的識別關聯再決定 UUID 如何使用。 | UIDX=2 是選位置,不是把值 2 當成 128-bit UUID。 |
來源:NVME-BASE-2.4, Rev. 2.4, §4.5.1, Figure 128, 文件頁 169, PDF 頁 195
來源:NVME-BASE-2.4, Rev. 2.4, §4.5.2, Figure 129, 文件頁 170, PDF 頁 196
來源:NVME-BASE-2.4, Rev. 2.4, §4.5.3, Figure 130, 文件頁 170, PDF 頁 196
來源:NVME-BASE-2.4, Rev. 2.4, §4.5.4, Figure 131, 文件頁 170, PDF 頁 196
來源:NVME-BASE-2.4, Rev. 2.4, §4.5.4, Figure 132, 文件頁 170, PDF 頁 196
來源:NVME-BASE-2.4, Rev. 2.4, §4.5.4, Figure 133, 文件頁 170-171, PDF 頁 196-197
來源:NVME-BASE-2.4, Rev. 2.4, §4.5.4, Figure 134, 文件頁 171, PDF 頁 197
來源:NVME-BASE-2.4, Rev. 2.4, §4.5.5, Figure 135, 文件頁 171, PDF 頁 197
來源:NVME-BASE-2.4, Rev. 2.4, §4.5.5, Figure 136, 文件頁 171, PDF 頁 197
來源:NVME-BASE-2.4, Rev. 2.4, §4.5.5, Figure 137, 文件頁 171, PDF 頁 197
來源:NVME-BASE-2.4, Rev. 2.4, §4.5.5, Figure 138, 文件頁 171, PDF 頁 197
來源:NVME-BASE-2.4, Rev. 2.4, §4.6.1, Figure 139, 文件頁 172, PDF 頁 198
來源:NVME-BASE-2.4, Rev. 2.4, §4.6.2, Figure 140, 文件頁 172, PDF 頁 198
來源:NVME-BASE-2.4, Rev. 2.4, §4.8, Figure 142, 文件頁 175, PDF 頁 201
Base128-1VID 與 SSVID 分別識別廠商與 subsystem 廠商。
來源:NVME-BASE-2.4, Rev. 2.4, §4.5.1, Figure 128, 文件頁 169, PDF 頁 195
Base128-2兩台裝置 VID 相同,並不代表 SSVID 或產品配置相同;這些不是 namespace 的唯一識別碼。
Base129-1Serial Number 與 Model Number 是字元資料欄位。
來源:NVME-BASE-2.4, Rev. 2.4, §4.5.2, Figure 129, 文件頁 170, PDF 頁 196
Base129-2顯示型號時依欄位長度及字元規則處理,不能把固定長度字串讀成一個整數。
Base130-1IEEE OUI 提供識別碼中的組織分配部分。
來源:NVME-BASE-2.4, Rev. 2.4, §4.5.3, Figure 130, 文件頁 170, PDF 頁 196
Base130-2相同 OUI 的不同裝置仍需要其他位元區分;OUI 本身不是完整裝置唯一識別碼。
Base131-1EUI64 的 MA-L 格式把組織與延伸識別部分分開。
來源:NVME-BASE-2.4, Rev. 2.4, §4.5.4, Figure 131, 文件頁 170, PDF 頁 196
Base131-2先依圖切開組織部分及廠商分配部分,再理解完整 64-bit 識別碼;不把其中一半當成完整值。
Base132-1OUI 在 EUI64 中有固定的分配位置。
來源:NVME-BASE-2.4, Rev. 2.4, §4.5.4, Figure 132, 文件頁 170, PDF 頁 196
Base132-2比較兩個 EUI64 時,可先看 OUI 是否相同,再看其餘位元;OUI 相同不代表兩個 namespace 相同。
Base133-1延伸識別欄位補足 EUI64 的個別識別資訊。
來源:NVME-BASE-2.4, Rev. 2.4, §4.5.4, Figure 133, 文件頁 170-171, PDF 頁 196-197
Base133-2同一組織分配的兩個 ID,可以只在延伸部分不同;比較時必須保留全部位元。
Base134-1MA-L 與 WWN 的相似排列不表示它們可以直接互換。
來源:NVME-BASE-2.4, Rev. 2.4, §4.5.4, Figure 134, 文件頁 171, PDF 頁 197
Base134-2看到相近的十六進位外觀時,仍先辨識格式與分配規則,不只按字串長度判斷識別碼種類。
Base135-1NGUID 提供 namespace 的全域識別資訊。
來源:NVME-BASE-2.4, Rev. 2.4, §4.5.5, Figure 135, 文件頁 171, PDF 頁 197
Base135-2NSID 可能因配置而改變,辨識是否同一 namespace 時可以依支援情況使用 NGUID;兩者回答不同問題。
Base136-1NGUID 的 OUI 與廠商部分有各自位置。
來源:NVME-BASE-2.4, Rev. 2.4, §4.5.5, Figure 136, 文件頁 171, PDF 頁 197
Base136-2比較完整 NGUID 時,把組織部分與其餘識別資訊一起保留,不能只用 OUI 當資料庫唯一鍵。
Base137-1NGUID 的欄位排列需要按完整格式解釋。
來源:NVME-BASE-2.4, Rev. 2.4, §4.5.5, Figure 137, 文件頁 171, PDF 頁 197
Base137-2讀出 128-bit 值後先維持原本 byte 順序,再按圖拆欄位,避免把一個合法 ID 顯示成另一種排列。
Base138-1NGUID 與 WWN 的結構對照用來理解相似處與不同處。
來源:NVME-BASE-2.4, Rev. 2.4, §4.5.5, Figure 138, 文件頁 171, PDF 頁 197
Base138-2把相似欄位並排看可以幫助定位,但格式標記和完整位元仍要保留,不用 WWN 的欄位解釋直接取代 NGUID。
Base139-1Controller List 先列數量,再列要操作的控制器識別碼。
來源:NVME-BASE-2.4, Rev. 2.4, §4.6.1, Figure 139, 文件頁 172, PDF 頁 198
Base139-2Attach 到控制器 A 與 B 時,清單含 2 個 Controller IDs;命令 NSID 指 namespace,清單則指定哪些控制器。
Base140-1Namespace List 是識別碼清單,不包含每個 namespace 的全部屬性。
來源:NVME-BASE-2.4, Rev. 2.4, §4.6.2, Figure 140, 文件頁 172, PDF 頁 198
Base140-2從清單取得 NSID 3 後,還需相應 Identify 資料才能知道它的格式與容量。
Base142-1UTF-8 輸入處理需要區分 byte 序列與字元。
來源:NVME-BASE-2.4, Rev. 2.4, §4.8, Figure 142, 文件頁 175, PDF 頁 201
Base142-2一個中文字通常占多個 bytes;限制 byte 長度時,不能用相同數值當成可容納字元數,也不能截斷字元中間的 bytes。
07.01.CID 的唯一性範圍是同一 SQ 的 outstanding commands。完成資訊需要連同 SQ identifier 解讀,才能找到正確 SQ 中的那筆命令。
來源:NVME-BASE-2.4, Rev. 2.4, §4.1.1, 文件頁 140, PDF 頁 166
來源:NVME-BASE-2.4, Rev. 2.4, §4.2.1, 文件頁 144-145, PDF 頁 170-171
07.02.Phase Tag 讓 host 辨認這個位置的新 completion;是否成功則由 Status Code Type、Status Code 等狀態資訊決定。新資料與成功結果是兩個判斷。
來源:NVME-BASE-2.4, Rev. 2.4, §4.2.4, 文件頁 155-158, PDF 頁 181-184
來源:NVME-BASE-2.4, Rev. 2.4, §4.2.3, 文件頁 145-155, PDF 頁 171-181
07.03.PRP1 提供第一段的 page offset;跨頁後由後續 PRP page address 或 PRP List 指定資料位置。Host 的邏輯連續 buffer 不必對應連續的實體 pages。
來源:NVME-BASE-2.4, Rev. 2.4, §4.3.1, 文件頁 158-159, PDF 頁 184-185
07.04.DPTR 的同一組 bits 可依選定格式表達 PRP 或 SGL。先確認 PSDT 與命令支援條件,才知道應把後續資料當 page pointers 或 segment descriptors。
來源:NVME-BASE-2.4, Rev. 2.4, §4.1.1, 文件頁 140-142, PDF 頁 166-168
來源:NVME-BASE-2.4, Rev. 2.4, §4.3.2, 文件頁 159-166, PDF 頁 185-192