NVMe 自問自答題庫:PRP 與 SGL
NVMe · Q1–328
Q276–Q285
PRP 與 SGL
- PRP
- Physical Region Page,描述資料頁位置的指標
- SGL
- Scatter Gather List,描述分散資料區段的清單
資料指標描述的是記憶體配置。本冊先算 PRP 跨頁,再讀 SGL 的 descriptor 關係,最後把格式錯誤與傳輸失敗分開。
每個問題都接著完整解說,依內容帶讀欄位、比較機制或追蹤流程。先看本冊總覽,再沿問題閱讀;必要條件與正常路徑直接顯示。所有數字案例均為教學假設;Status 以 SCT/SC 表示,代碼後的 h 代表十六進位。
- SCT
- Status Code Type,完成狀態代碼類型
4KiB 頁面,PRP1 從 offset1024 開始
PRP2 類型由跨頁數決定;不能只用資料總長是否大於一頁判斷。
| 資料長度 | 第一頁之後剩餘 | PRP2 用途 |
|---|---|---|
| 2048bytes | 0 | 保留不用 |
| 4096bytes | 1024 bytes | 直接指第二頁 |
| 8192bytes | 5120 bytes | 指 PRP List |
舉例看懂:SGL Last Segment.LEN=32 描述 2 筆 16-byte descriptors;實際 payload 多長,要讀這兩筆 Data Block.LEN。不要把 descriptor 清單大小當成資料大小。
來源:Base 2.4 §4.2.1, 4.3.1–4.3.2 (PCIe-applicable layouts) · Base 2.4 §5.2.14.2.1 (SGLS) · PCIe Transport 1.4 §3.4 (Command Related Resource Retirement)
需要時回顧本篇名詞
- Controller / namespace
- controller 接收命令並管理存取;namespace 是命令可指定的一份邏輯儲存空間。NVM subsystem 則包含 controller 與非揮發儲存資源,同一 subsystem 可以有多個 controller。
- SQ / CQ / SQE / CQE
- Submission Queue(SQ)是提交佇列,Completion Queue(CQ)是完成佇列;SQE 與 CQE 分別是其中的一筆命令及完成項目。QID 識別 queue,CID 區分同一 SQ 中尚未完成的命令,NSID 則識別 namespace。
- Register / Identify / Feature / Log
- Register 提供可存取的控制或狀態資訊;Identify 查詢物件的能力與屬性;Feature 用來讀取或變更工作設定;Log Page 回報特定種類的狀態或紀錄。FID、LID、CNS、CSI 則分別用來選擇 Feature、Log Page、Identify 資料結構及命令集。
- index / offset / zero-based
- index 指出清單中的第幾筆,通常從 0 起算;offset 表示與起點相隔多遠,解讀時必須確認單位。若數量欄位採 zero-based 編碼,實際數量等於欄位值加 1;但不是所有欄位看到 0 都要加 1。Dword 是 4 bytes,1 byte 是 8 bits。
- Scope / reset / retention
- scope 表示操作影響哪些物件;retention 表示狀態是否保留。清除 CC.EN 所觸發的 Controller Reset,是 Controller Level Reset(CLR)的一種。同屬 CLR 的不同觸發方式,仍可能採用不同的 Register 保留規則。
本冊題目
- Q276 · PRP1 如何描述第一頁的資料?
- Q277 · PRP2 何時是第二頁,何時是清單?
- Q278 · PRP List 如何串接多頁?
- Q279 · PRP 位址、Offset 與 List 有哪些對齊要求?
- Q280 · PRP 為 0、位址無效或鏈結錯誤時,能指定同一種錯誤嗎?
- Q281 · SGL Data Block、Segment 與 Last Segment 如何配合?
- Q282 · SGL 位址、長度、數量與類型錯誤如何區分?
- Q283 · Identify 的 SGL 能力如何限制合法用法?
- Q284 · Data Pointer 錯誤與 Data Transfer Error 有何不同?
- Q285 · PRP/SGL 錯誤如何與 CQE 及 Error Information 對回?
Q276 PRP1 如何描述第一頁的資料?
跟著解說理解
PRP 將連續的命令資料分配到記憶體頁面;第一筆指標也描述資料在第一頁從哪個位置開始。
1. 先確認資料的來源與範圍
這裡的頁面是 CC.MPS 決定的記憶體頁面,不是 SSD 的 NAND page,也不是 namespace 的 LBA。
- LBA
- Logical Block Address,邏輯區塊位址
先讀 CAP.MPSMIN/MPSMAX 與已設定的 CC.MPS,頁面大小是 2^(12+MPS) bytes。
2. 欄位、單位與判讀例子
一般資料傳輸的 PRP1 分成頁基底與頁內 offset,offset 最低兩位須為 0;特殊命令可另定義 PRP1 為清單指標。
先算第一頁剩餘容量 P−offset,再與命令資料長度比較,決定是否需要 PRP2。
假設 P=4096、offset=1024、資料 2048 bytes,第一頁可容納 3072 bytes,因此 PRP1 已足夠,PRP2 保留不用。
3. 判讀時要保留的條件
Create Queue 對 PRP1 有 page-aligned 要求,不能套一般資料第一頁可帶 offset 的規則。
用資料長度、offset 與頁面大小一起驗證;只看長度小於一頁仍可能跨頁。
來源:Base 2.4 §4.2.1, 4.3.1–4.3.2 (PCIe-applicable layouts) · Base 2.4 §5.2.14.2.1 (SGLS) · PCIe Transport 1.4 §3.4 (Command Related Resource Retirement) · Base 2.4 §4.2.3 · Base 2.4 §5.2.13.1.2 · Base 2.4 §5.3.1–5.3.2 · Base 2.4 §3.7.1–3.7.4 · Base 2.4 §5.2.2 · Base 2.4 §5.2.13.1.14 (header, reset, hardware, Set Feature events)
本題原文定位
來源:Base 2.4 §4.2.1, 4.3.1–4.3.2 (PCIe-applicable layouts) · Base 2.4 §5.2.14.2.1 (SGLS) · PCIe Transport 1.4 §3.4 (Command Related Resource Retirement) · Base 2.4 §4.2.3 · Base 2.4 §5.2.13.1.2 · Base 2.4 §5.3.1–5.3.2 · Base 2.4 §3.7.1–3.7.4 · Base 2.4 §5.2.2 · Base 2.4 §5.2.13.1.14 (header, reset, hardware, Set Feature events)
Q277 PRP2 何時是第二頁,何時是清單?
跟著解說理解
PRP2 的意義由跨越的記憶體頁面邊界數決定,沒有另外一個「這是清單」旗標。
1. 機制與適用範圍
適用於採一般 PRP 資料配置的命令;命令專用定義優先。
2. 用操作與結果理解
從 CC.MPS、PRP1 offset 與完整資料長度算需要幾頁。
先算第一頁可放多少資料:頁面大小 P 減去 PRP1 的頁內 offset。剩餘長度 R 就是總長度扣掉已由第一頁描述的資料。
- R=0:只需要第一頁
PRP2 為保留欄位,不需要另一個資料頁。
- 0<R≤P:再一頁就夠
PRP2 直接指向第二個資料頁。
- R>P:還需要至少兩個資料頁
PRP2 指向 PRP List,由清單列出後續資料頁位址。
三列是互斥分支。教學假設 P=4096、offset=1024,第一頁容量為 3072 bytes:傳輸 4096 bytes 時 R=1024,PRP2 指資料頁;傳輸 8192 bytes 時 R=5120,PRP2 指清單。PRP2 沒有獨立的類型旗標,不能只看它非零就猜用途。
3. 容易誤判的地方
類型選錯可能使 controller 把資料 bytes 當成位址;不能期待一定在所有錯誤傳輸前檢出。
檢查 PRP2 指向內容與推導的類型一致,而非只檢查它是不是非零。
來源:Base 2.4 §4.2.1, 4.3.1–4.3.2 (PCIe-applicable layouts) · Base 2.4 §5.2.14.2.1 (SGLS) · PCIe Transport 1.4 §3.4 (Command Related Resource Retirement) · Base 2.4 §4.2.3 · Base 2.4 §5.2.13.1.2 · Base 2.4 §5.3.1–5.3.2 · Base 2.4 §3.7.1–3.7.4 · Base 2.4 §5.2.2 · Base 2.4 §5.2.13.1.14 (header, reset, hardware, Set Feature events)
本題原文定位
來源:Base 2.4 §4.2.1, 4.3.1–4.3.2 (PCIe-applicable layouts) · Base 2.4 §5.2.14.2.1 (SGLS) · PCIe Transport 1.4 §3.4 (Command Related Resource Retirement) · Base 2.4 §4.2.3 · Base 2.4 §5.2.13.1.2 · Base 2.4 §5.3.1–5.3.2 · Base 2.4 §3.7.1–3.7.4 · Base 2.4 §5.2.2 · Base 2.4 §5.2.13.1.14 (header, reset, hardware, Set Feature events)
Q278 PRP List 如何串接多頁?
跟著解說理解
清單頁存放資料頁位址;資料多到清單本身也放不下時,才需要串接下一個清單頁。
1. 先確認資料的來源與範圍
清單描述尚未由命令內 PRP 描述的資料,不得重複第一頁。
以 CC.MPS 與每個 PRP entry 的 8-byte 大小,算清單可放幾筆。
2. 欄位、單位與判讀例子
若仍需下一個清單頁,目前頁的最後一筆改放下一頁清單位址;後續清單頁必須 page-aligned。
逐頁填滿必要 entries,只有還有資料需要描述時才使用鏈結;不能保留無意義的空洞。
【模擬資料】4 KiB 清單從頁首開始有 512 格;非最後頁最多 511 個資料頁位址加 1 個鏈結,最後頁可全放資料頁位址。第一個 PRP List 指標也可以有 Qword 對齊的頁內 offset:若 offset 是 64 bytes,該頁剩餘 (4096−64)÷8=504 格;還需要下一頁時,最後一格放鏈結,最多留下 503 格描述資料頁。鏈結指向的下一個清單頁必須從頁首開始。先用 Figure 93 判斷 PRP2 是否為清單指標,再讀 §4.3.1 和 Figures 111–113 檢查 offset、清單內容與鏈結。
3. 判讀時要保留的條件
最後一格是不是鏈結由剩餘資料量決定;不能把每頁最後一格一律當資料,或一律當鏈結。
Host 要保留清單直到命令完成;描述 queue 的清單則需保留到 queue 刪除成功或 controller reset。
來源:Base 2.4 §4.2.1, 4.3.1–4.3.2 (PCIe-applicable layouts) · Base 2.4 §5.2.14.2.1 (SGLS) · PCIe Transport 1.4 §3.4 (Command Related Resource Retirement) · Base 2.4 §4.2.3 · Base 2.4 §5.2.13.1.2 · Base 2.4 §5.3.1–5.3.2 · Base 2.4 §3.7.1–3.7.4 · Base 2.4 §5.2.2 · Base 2.4 §5.2.13.1.14 (header, reset, hardware, Set Feature events)
本題原文定位
來源:Base 2.4 §4.2.1, 4.3.1–4.3.2 (PCIe-applicable layouts) · Base 2.4 §5.2.14.2.1 (SGLS) · PCIe Transport 1.4 §3.4 (Command Related Resource Retirement) · Base 2.4 §4.2.3 · Base 2.4 §5.2.13.1.2 · Base 2.4 §5.3.1–5.3.2 · Base 2.4 §3.7.1–3.7.4 · Base 2.4 §5.2.2 · Base 2.4 §5.2.13.1.14 (header, reset, hardware, Set Feature events)
Q279 PRP 位址、Offset 與 List 有哪些對齊要求?
跟著解說理解
資料起點與清單起點的對齊要求不同,不能只使用一個「所有指標皆 4KiB 對齊」規則。
1. 先確認資料的來源與範圍
對齊依目前 CC.MPS 及指標角色判斷,不依作業系統恰好使用的頁面大小。
確認第一筆資料、命令內第一個清單指標、清單內資料位址或後續清單鏈結是哪一種。
2. 欄位、單位與判讀例子
一般 PRP1 可帶 Dword-aligned offset;第一個 PRP List 指標需 Qword 對齊且可有頁內 offset;後續資料頁與鏈結頁需 page-aligned。
先檢查對齊,再算第一個清單頁從起點到頁尾還容納多少 entries。
4KiB 頁內清單起點 offset=4080,可放 2 筆;若仍需串接,其中最後 1 筆必須作鏈結。
3. 判讀時要保留的條件
資料 PRP 最低兩位非零時可回 PRP Offset Invalid;若未回錯,須視為兩位清零。後續頁 offset 非零則規範建議回此錯誤,不能把 should 升成必然。
Host 仍必須送合法對齊;controller 可以容錯不代表 Host 的要求就消失。
來源:Base 2.4 §4.2.1, 4.3.1–4.3.2 (PCIe-applicable layouts) · Base 2.4 §5.2.14.2.1 (SGLS) · PCIe Transport 1.4 §3.4 (Command Related Resource Retirement) · Base 2.4 §4.2.3 · Base 2.4 §5.2.13.1.2 · Base 2.4 §5.3.1–5.3.2 · Base 2.4 §3.7.1–3.7.4 · Base 2.4 §5.2.2 · Base 2.4 §5.2.13.1.14 (header, reset, hardware, Set Feature events)
本題原文定位
來源:Base 2.4 §4.2.1, 4.3.1–4.3.2 (PCIe-applicable layouts) · Base 2.4 §5.2.14.2.1 (SGLS) · PCIe Transport 1.4 §3.4 (Command Related Resource Retirement) · Base 2.4 §4.2.3 · Base 2.4 §5.2.13.1.2 · Base 2.4 §5.3.1–5.3.2 · Base 2.4 §3.7.1–3.7.4 · Base 2.4 §5.2.2 · Base 2.4 §5.2.13.1.14 (header, reset, hardware, Set Feature events)
Q280 PRP 為 0、位址無效或鏈結錯誤時,能指定同一種錯誤嗎?
跟著解說理解
0 是位址數值,不是 NVMe 為所有 PRP 定義的通用空指標;是否能存取還取決於實際記憶體映射。
1. 先區分是哪一種失敗
先區分欄位格式錯誤、描述長度錯誤與實際資料搬移失敗。
非法 offset 可對應 PRP Offset Invalid;格式合法但 DMA 存取失敗可能對應 Data Transfer Error,不能只憑位址 0 判定。
- DMA
- Direct Memory Access,裝置直接存取記憶體
規範沒有替每種循環鏈結或不可存取位址規定唯一可預測 CQE;若命令通道受破壞,也不能保證取得 CQE。
- CQE
- Completion Queue Entry,佇列中的完成項目
2. 用哪些資料確認原因
核對 CC.MPS、PRP 角色、需要的頁數與 Host 提供的有效記憶體範圍。
建立一個合法基準,再只改一處;先查清單是否指向預期頁,再檢查整個傳輸所需範圍。
3. 結果與後續驗證
合法且可存取的配置可正常完成;保留的 PRP2 即使為 0,也不構成缺少資料頁。
保存原 SQE、清單快照與位址配置,避免出錯後 Host 改寫清單,導致證據已不同。
- SQE
- Submission Queue Entry,佇列中的命令項目
先確認指標真的被命令使用,而非保留欄位或未走到的清單部分。
來源:Base 2.4 §4.2.1, 4.3.1–4.3.2 (PCIe-applicable layouts) · Base 2.4 §5.2.14.2.1 (SGLS) · PCIe Transport 1.4 §3.4 (Command Related Resource Retirement) · Base 2.4 §4.2.3 · Base 2.4 §5.2.13.1.2 · Base 2.4 §5.3.1–5.3.2 · Base 2.4 §3.7.1–3.7.4 · Base 2.4 §5.2.2 · Base 2.4 §5.2.13.1.14 (header, reset, hardware, Set Feature events)
本題原文定位
來源:Base 2.4 §4.2.1, 4.3.1–4.3.2 (PCIe-applicable layouts) · Base 2.4 §5.2.14.2.1 (SGLS) · PCIe Transport 1.4 §3.4 (Command Related Resource Retirement) · Base 2.4 §4.2.3 · Base 2.4 §5.2.13.1.2 · Base 2.4 §5.3.1–5.3.2 · Base 2.4 §3.7.1–3.7.4 · Base 2.4 §5.2.2 · Base 2.4 §5.2.13.1.14 (header, reset, hardware, Set Feature events)
Q281 SGL Data Block、Segment 與 Last Segment 如何配合?
跟著解說理解
Data Block 描述資料位址與長度;Segment 類型描述下一段 descriptor 清單,而不是資料本身。
1. 差別在哪裡
SGL 用於支援它的 PCIe I/O 命令;PCIe Admin 命令不得使用 SGL。
每個 descriptor16 bytes;Data Block 類型 0h,Segment2h,Last Segment3h。Segment 的 LEN 是下一段清單的 bytes。
2. 如何選擇與確認
先確認 Identify.SGLS,再看 CDW0.PSDT 的 data/metadata 配置。
只有一個資料區塊時,可直接放在命令 SGL1;多區塊時,SGL1 指向清單,再逐筆讀 Data Block。
例如 Last Segment.LEN=32,代表下一段有 2 個 descriptors,不代表命令只傳 32 bytes;實際資料量看那兩筆 Data Block.LEN。
3. 比較時要保留的條件
鏈結 descriptor 只能在目前段最後一筆;Last Segment 指向的最後段不得再含任何鏈結 descriptor。
分開計算 descriptor bytes 與 payload bytes,才能核對清單完整性及命令長度。
來源:Base 2.4 §4.2.1, 4.3.1–4.3.2 (PCIe-applicable layouts) · Base 2.4 §5.2.14.2.1 (SGLS) · PCIe Transport 1.4 §3.4 (Command Related Resource Retirement) · Base 2.4 §4.2.3 · Base 2.4 §5.2.13.1.2 · Base 2.4 §5.3.1–5.3.2 · Base 2.4 §3.7.1–3.7.4 · Base 2.4 §5.2.2 · Base 2.4 §5.2.13.1.14 (header, reset, hardware, Set Feature events)
本題原文定位
來源:Base 2.4 §4.2.1, 4.3.1–4.3.2 (PCIe-applicable layouts) · Base 2.4 §5.2.14.2.1 (SGLS) · PCIe Transport 1.4 §3.4 (Command Related Resource Retirement) · Base 2.4 §4.2.3 · Base 2.4 §5.2.13.1.2 · Base 2.4 §5.3.1–5.3.2 · Base 2.4 §3.7.1–3.7.4 · Base 2.4 §5.2.2 · Base 2.4 §5.2.13.1.14 (header, reset, hardware, Set Feature events)
Q282 SGL 位址、長度、數量與類型錯誤如何區分?
跟著解說理解
不同 SGL 錯誤指出不同的壞掉環節,不能全部簡化成 Invalid Field。
1. 先區分是哪一種失敗
分開 data SGL 與 metadata SGL,兩者長度錯誤有不同 Status。
Segment 位址需 Qword 對齊,LEN 非零且為 16 倍數;Data Block.LEN=0 合法,代表不傳資料。
鏈結不在最後一筆須 0/0Eh;最後段再鏈結須 0/0Dh;不支援類型須 0/11h;資料/metadata 過短分別須 0/0Fh、0/10h。
2. 用哪些資料確認原因
查 SGLS 的對齊、LLDTS 及支援 descriptor 類型,再核對命令要求長度。
沿鏈逐段核對邊界、最後一筆位置、type/subtype,以及全部有效資料長度。
3. 結果與後續驗證
SGL 至少要涵蓋要求的資料量;LLDTS=1 允許較長,仍只按命令要求傳輸。
LLDTS=0 的過長清單建議不要因此中止;若因此中止,建議用對應長度錯誤。對齊錯誤還須保留各欄定義的 may/should 強度。
先找第一個能以結構證明的違規,不憑最終資料不對就猜 descriptor 類型錯誤。
來源:Base 2.4 §4.2.1, 4.3.1–4.3.2 (PCIe-applicable layouts) · Base 2.4 §5.2.14.2.1 (SGLS) · PCIe Transport 1.4 §3.4 (Command Related Resource Retirement) · Base 2.4 §4.2.3 · Base 2.4 §5.2.13.1.2 · Base 2.4 §5.3.1–5.3.2 · Base 2.4 §3.7.1–3.7.4 · Base 2.4 §5.2.2 · Base 2.4 §5.2.13.1.14 (header, reset, hardware, Set Feature events)
本題原文定位
來源:Base 2.4 §4.2.1, 4.3.1–4.3.2 (PCIe-applicable layouts) · Base 2.4 §5.2.14.2.1 (SGLS) · PCIe Transport 1.4 §3.4 (Command Related Resource Retirement) · Base 2.4 §4.2.3 · Base 2.4 §5.2.13.1.2 · Base 2.4 §5.3.1–5.3.2 · Base 2.4 §3.7.1–3.7.4 · Base 2.4 §5.2.2 · Base 2.4 §5.2.13.1.14 (header, reset, hardware, Set Feature events)
Q283 Identify 的 SGL 能力如何限制合法用法?
跟著解說理解
SGL 支援不是只有一個 yes/no;資料對齊、額外類型、metadata 與較長清單都有各自能力。
1. 要查哪個對象、哪份資料
能力還須配合傳輸與命令種類;Base 表列某個類型,不等於所有 PCIe 命令都可使用。
SGLS[1:0]=00 不支援、01 支援且 Data Block 無對齊粒度限制、10 要求 Dword 對齊與粒度。
LLDTS 控制較長清單,SBBDS 控制 Bit Bucket,MSDS 與 MBA 控制 metadata 配置;SDT 是建議 descriptor 數。
2. 查詢順序與回覆判讀
先選合法 PSDT,再只使用已宣告且 PCIe 允許的 type/subtype;Offset subtype 不能因看到其他傳輸定義就套用。
SGLS=10b 時,Data Block 位址與長度須是 4-byte 倍數;這不表示每個資料區塊都要 page-aligned。
3. 證據不足或不一致時怎麼判斷
【模擬資料】假設 PCIe Controller 支援 Bit Bucket,SDT=2,且一筆讀取命令的目的 SGL 含兩個 Length 非零的 Data Block 與一個 Length 非零的 Bit Bucket。依 §4.3.2,計入 SDT 的數量是 3,超過建議值,效能可能降低;這不代表命令因此必須失敗。Segment descriptor 與 Length 為零的 Data Block 不列入這項計數。Figure 338 的 SDT=0 表示沒有回報建議上限;MSDBD 則是 capsule 內的限制,不能當成 PCIe 記憶體清單的通用上限。
支援宣告與合法描述資料必須一致;Admin 命令的 SGL 禁用規則仍優先。
先完整解碼 SGLS,而不是只看整個欄位非零。
來源:Base 2.4 §4.2.1, 4.3.1–4.3.2 (PCIe-applicable layouts) · Base 2.4 §5.2.14.2.1 (SGLS) · PCIe Transport 1.4 §3.4 (Command Related Resource Retirement) · Base 2.4 §4.2.3 · Base 2.4 §5.2.13.1.2 · Base 2.4 §5.3.1–5.3.2 · Base 2.4 §3.7.1–3.7.4 · Base 2.4 §5.2.2 · Base 2.4 §5.2.13.1.14 (header, reset, hardware, Set Feature events)
本題原文定位
來源:Base 2.4 §4.2.1, 4.3.1–4.3.2 (PCIe-applicable layouts) · Base 2.4 §5.2.14.2.1 (SGLS) · PCIe Transport 1.4 §3.4 (Command Related Resource Retirement) · Base 2.4 §4.2.3 · Base 2.4 §5.2.13.1.2 · Base 2.4 §5.3.1–5.3.2 · Base 2.4 §3.7.1–3.7.4 · Base 2.4 §5.2.2 · Base 2.4 §5.2.13.1.14 (header, reset, hardware, Set Feature events)
Q284 Data Pointer 錯誤與 Data Transfer Error 有何不同?
跟著解說理解
Pointer 錯誤表示描述方法不合法;Transfer Error 表示資料或 metadata 搬移失敗,兩者不能用同一個原因解釋。
1. 差別在哪裡
錯誤可能在清單檢查或實際存取時才被發現,時間不同。
記錄 PSDT、指標、長度、SCT/SC、SQID、CID;Error Information 的 PEL 是 Parameter Error Location,不是 Persistent Event Log。
- SCT
- Status Code Type,完成狀態代碼類型
- SQID
- Submission Queue Identifier,提交佇列識別碼
- CID
- Command Identifier,同一提交佇列內的命令識別碼
2. 如何選擇與確認
先檢查 PRP/SGL 規則與完整範圍,再核對當時記憶體是否仍有效。
先排除 Host 提早回收 buffer,再檢查合法位址是否能被 controller 存取。
格式合法、範圍完整且搬移成功,仍需命令本身完成才有 Success;指標合法不代表媒體操作一定成功。
3. 比較時要保留的條件
Data Transfer Error 為 0/04h;PRP Offset 與各 SGL 結構錯誤則用各自 Status,不能把所有傳輸錯誤一律定為 Host 格式錯誤。
SGL 可以先傳輸合法部分,之後才發現另一筆錯誤;失敗 CQE 不證明 buffer 完全未修改。
來源:Base 2.4 §4.2.1, 4.3.1–4.3.2 (PCIe-applicable layouts) · Base 2.4 §5.2.14.2.1 (SGLS) · PCIe Transport 1.4 §3.4 (Command Related Resource Retirement) · Base 2.4 §4.2.3 · Base 2.4 §5.2.13.1.2 · Base 2.4 §5.3.1–5.3.2 · Base 2.4 §3.7.1–3.7.4 · Base 2.4 §5.2.2 · Base 2.4 §5.2.13.1.14 (header, reset, hardware, Set Feature events)
本題原文定位
來源:Base 2.4 §4.2.1, 4.3.1–4.3.2 (PCIe-applicable layouts) · Base 2.4 §5.2.14.2.1 (SGLS) · PCIe Transport 1.4 §3.4 (Command Related Resource Retirement) · Base 2.4 §4.2.3 · Base 2.4 §5.2.13.1.2 · Base 2.4 §5.3.1–5.3.2 · Base 2.4 §3.7.1–3.7.4 · Base 2.4 §5.2.2 · Base 2.4 §5.2.13.1.14 (header, reset, hardware, Set Feature events)
Q285 PRP/SGL 錯誤如何與 CQE 及 Error Information 對回?
跟著解說理解
把錯誤對回原命令,才能知道哪個指標或資料範圍需要修正。
1. 先保留哪些證據
使用同一 controller、同一 queue 使用期間及相同 SQID/CID;CID 可能重用,單看數字不夠。
- SQID
- Submission Queue Identifier,提交佇列識別碼
- CID
- Command Identifier,同一提交佇列內的命令識別碼
保存 CQE 的 SCT、SC、DNR、More,再依適用規則讀 Error Information。
- DNR
- Do Not Retry,命令重試的狀態提示
Error Count、SQID、CID、Status 與 Parameter Error Location 可協助比對;無法指出欄位時,需保留其無效/未指定表示。
2. 依什麼順序排除原因
先保存原命令與清單,避免重試時覆寫唯一能定位問題的內容。
先對命令身分與狀態,再判讀 byte/bit 位置;清單內容在 Host memory 時,不能硬把每個錯誤都映成 SQE 某一 bit。
- SQE
- Submission Queue Entry,佇列中的命令項目
3. 把觀察結果接回規格條件
找到相符紀錄後,可將原始欄位、違規條件與實際 Status 放在一起驗證。
More=0 不證明一定沒有 Error entry;也不是每個失敗命令都要求新增 entry。DNR=0 更不代表可用同一個壞清單直接重試。
- DNR
- Do Not Retry,命令重試的狀態提示
若記錄已被覆蓋或重設後清除,說明證據不足;不能將缺少歷史紀錄當成原命令合法。
4. 錯誤完成與紀錄要如何對照
只有收到 CQE,才有 DNR 與 More 可供判讀。 完整條件見本冊說明
成功 CQE 不會單憑成功這件事,就要求新增 Error Information entry。 完整條件見本冊說明
來源:Base 2.4 §4.2.1, 4.3.1–4.3.2 (PCIe-applicable layouts) · Base 2.4 §5.2.14.2.1 (SGLS) · PCIe Transport 1.4 §3.4 (Command Related Resource Retirement) · Base 2.4 §4.2.3 · Base 2.4 §5.2.13.1.2 · Base 2.4 §5.3.1–5.3.2 · Base 2.4 §3.7.1–3.7.4 · Base 2.4 §5.2.2 · Base 2.4 §5.2.13.1.14 (header, reset, hardware, Set Feature events)
本題原文定位
來源:Base 2.4 §4.2.1, 4.3.1–4.3.2 (PCIe-applicable layouts) · Base 2.4 §5.2.14.2.1 (SGLS) · PCIe Transport 1.4 §3.4 (Command Related Resource Retirement) · Base 2.4 §4.2.3 · Base 2.4 §5.2.13.1.2 · Base 2.4 §5.3.1–5.3.2 · Base 2.4 §3.7.1–3.7.4 · Base 2.4 §5.2.2 · Base 2.4 §5.2.13.1.14 (header, reset, hardware, Set Feature events)
共用規則:各題連到的完整解釋
這些規則在本冊只完整說明一次。返回剛才的題目可用瀏覽器「上一頁」;特定命令或 Feature 的明文例外優先。
命令完成、事件與紀錄 · DNR 與 More 應如何設定?
只有收到 CQE,才有 DNR 與 More 可供判讀。DNR=1 表示相同命令即使重送到此 NVM subsystem 的任一 controller,仍預期會失敗;DNR=0 則只表示可能成功。除非個別錯誤條件另有明定,不能只看 Status 名稱就要求 DNR=1。More=1 表示 Error Information Log 有這筆命令的補充資訊。SCT=SC=0 時,DNR 應為 0。
命令完成、事件與紀錄 · 是否更新 Error Information Log 或其他 Log?
成功 CQE 不會單憑成功這件事,就要求新增 Error Information entry。若錯誤 CQE 的 More=1,則讀取 LID01h,並以 SQID、CID 及 Error Count 關聯紀錄。其他非成功 CQE 是否需要新增 entry,仍須依記錄規則判斷,不能直接以失敗次數推算。至於操作造成的狀態變化,則用本題列出的查詢介面重新確認。
原文定位與既有圖表判讀
Base 的文件頁碼等於 PDF 頁碼減 26;NVM 與 PCIe 兩份規格的文件頁碼則與 PDF 頁碼相同。以下依提供的 PDF 本文列出章節、頁碼及 Figure 編號。若同一頁包含其他主題,只引用本題需要的定義,不納入 Fabrics 或 PCIe Link、封包內容。
- Base 2.4 · §3.7.1–3.7.4
文件頁 120–124 · PDF 146–150 - Base 2.4 · §4.2.1, 4.3.1–4.3.2 (PCIe-applicable layouts)
文件頁 140–142, 158–164 · PDF 166–168, 184–190 · Figure 93, 110–122 - Base 2.4 · §4.2.3
文件頁 145–155 · PDF 171–181 · Figure 101–105 - Base 2.4 · §5.2.2
文件頁 183–190 · PDF 209–216 · Figure 150–156 - Base 2.4 · §5.2.13.1.2
文件頁 218–220 · PDF 244–246 · Figure 212 - Base 2.4 · §5.2.13.1.14 (header, reset, hardware, Set Feature events)
文件頁 244–256, 258, 262–264 · PDF 270–282, 284, 288–290 · Figure 232–244, 246, 252–253 - Base 2.4 · §5.2.14.2.1 (SGLS)
文件頁 377–378 · PDF 403–404 · Figure 338 - Base 2.4 · §5.3.1–5.3.2
文件頁 527–531 · PDF 553–557 · Figure 571–579 - PCIe Transport 1.4 · §3.4 (Command Related Resource Retirement)
文件頁 13 · PDF 13
需要看欄位圖時
以下連結可開啟對應的圖表教學,查閱欄位及判讀方式。每張圖保留固定的教學位置,方便之後反覆查詢。
- Base 2.4 Figure 101 · Completion Queue Entry: Status Field
- Base 2.4 Figure 104 · Status Code – Command Specific Status Values
- Base 2.4 Figure 338 · Identify – Identify Controller Data Structure, I/O Command Set Independent
- Base 2.4 Figure 93 · Common Command Format
使用的原始文件
- NVM Express Base Specification · Revision 2.4 · 2026-07-31
NVM-Express-Base-Specification-Revision-2.4-Ratified-2026.07.31.pdf - NVM Express NVM Command Set Specification · Revision 1.3 · 2026-07-31
NVM-Express-NVM-Command-Set-Specification-Revision-1.3-Ratified-2026.07.31.pdf - NVM Express NVMe over PCIe Transport Specification · Revision 1.4 · 2026-07-31
NVM-Express-NVMe-over-PCIe-Transport-Specification-Revision-1.4-Ratified-2026.07.31.pdf


Comments