NVM Express Base 2.4NVM Command Set 1.3NVMe over PCIe Transport 1.4
反覆查詢 · 欄位判讀 · 原文定位
NVMe 圖表判讀與情境練習 02 · 命令格式、資料指標與完成狀態
先用 SQID/CID 對回命令,再解 SCT/SC。資料搬移異常時,分清 PRP 的頁面指標與 SGL 的位址、長度和描述子類型。
- SQID
- Submission Queue Identifier,提交佇列識別碼
- CID
- Command Identifier,同一提交佇列內的命令識別碼
- SCT
- Status Code Type,完成狀態代碼類型
- PRP
- Physical Region Page,描述資料頁位置的指標
- SGL
- Scatter Gather List,描述分散資料區段的清單
先跟著一個情境讀規格
以下回傳資料均為教學假設。先看需求與已知條件,再沿閱讀路線找到相關欄位,接著一起判讀結果。完整解說直接顯示,來源細節可另外展開。
練習 01同一個 CID 出現兩次,是重複完成嗎?
- CID
- Command Identifier,同一提交佇列內的命令識別碼
除錯工具只以 CID 比對命令,看到兩筆 CID=12h 就報重複完成。請設計正確的比對順序。
模擬回傳與已知條件
- 兩筆新 CQE 的 SQID 分別為 2、5,CID 都是 12h;兩個 SQ 各有一筆該 CID 的 outstanding command。
- 另有一個 CQ slot 的 phase 不符合本輪 host 預期值;讀取記憶體的同步條件已滿足。
沿著欄位一步步理解
查詢次序:先檢查預期 phase → 只對新 CQE 讀 SQID/CID → 找回原 SQE → 再解 SCT/SC。
- CQE
- Completion Queue Entry,佇列中的完成項目
- SQID
- Submission Queue Identifier,提交佇列識別碼
- SQE
- Submission Queue Entry,佇列中的命令項目
- SCT
- Status Code Type,完成狀態代碼類型
推導 1CID 的唯一性是針對同一 SQ 的 outstanding commands,不是全 controller 的永久流水號。因此 (SQID=2, CID=12h) 與 (SQID=5, CID=12h) 可以代表不同命令。
- SQ
- Submission Queue,提交佇列
推導 2phase 不符合預期的 slot 不能當本輪的新完成項目。若先掃 CID 再看 phase,可能把上輪殘留 bytes 誤判成重複完成;CQ wrap 後 host 也要更新預期 phase。
- CQ
- Completion Queue,完成佇列
推導 3即使 SQID/CID 一致,跨 queue 刪除重建或命令結束後重用 CID,仍需要生命週期與時間資訊。留下完整 SQE/CQE 及 queue 身分,才有足夠資料追查。
完整原文定位
- Base 2.4 · §4.1.1 · Figure 92 · Command Dword 0 · 文件頁 139–140 · PDF 165–166
- Base 2.4 · §4.2.1 · Figure 97 · Common Completion Queue Entry Layout – Admin and All I/O Command Sets · 文件頁 144 · PDF 170
- Base 2.4 · §4.2.1 · Figure 98 · Completion Queue Entry: DW 2 · 文件頁 144 · PDF 170
- Base 2.4 · §4.2.1 · Figure 99 · Completion Queue Entry: DW 3 · 文件頁 145 · PDF 171
回情境索引
接著看其他情境
練習 02Invalid Field 指的是哪一個 bit?
CQE 只說 Invalid Field in Command。Error Information 提供的位置要怎麼對回 64-byte SQE?
模擬回傳與已知條件
- 已比對同一命令的 SQID/CID;Error Information 的 ECNT 非零、位置有效,BYTLOC=52、BITLOC=6。
- 保留原始 SQE、opcode、CSI 與完整 completion status。
沿著欄位一步步理解
查詢次序:從 CQE 的 SCT/SC 確認錯誤類型 → Get Log Page LID=01h 找相符 entry → 用 byte offset 對回原命令格式。
推導 1每個 Dword 是 4 bytes,因此 byte 52 是 CDW13 的第一個 byte;BITLOC=6 指向 CDW13 bit 6。BYTLOC 不是 Dword 編號,也不是資料 buffer 的 byte 52。
推導 2接著要依 opcode 與 command set 查 CDW13 的定義,才能知道該 bit 屬於哪個欄位。共同 SQE 格式只能提供位置,不能替每種命令決定此處語意。
推導 3錯誤位置指出值得檢查的參數,不能自行推導成「那個 bit 必須翻轉」。可能是保留值、能力不支援,或與別的欄位組合不合法;修正仍要核對該命令條件。
完整原文定位
- Base 2.4 · §5.2.13.1.2 · Figure 212 · Error Information Log Entry Data Structure · 文件頁 218–220 · PDF 244–246
- Base 2.4 · §4.1.1 · Figure 93 · Common Command Format · 文件頁 140–142 · PDF 166–168
- Base 2.4 · §4.2.3 · Figure 101 · Completion Queue Entry: Status Field · 文件頁 145–146 · PDF 171–172
- Base 2.4 · §4.2.3.1 · Figure 103 · Status Code – Generic Command Status Values · 文件頁 147–150 · PDF 173–176
回情境索引
練習 03PRP2 是第二個資料頁,還是 list 位址?
同樣的起始位址,把傳輸長度從 5120 改成 6144 bytes,就可能需要改變 PRP2 的解讀。為什麼?
模擬回傳與已知條件
- 目前記憶體頁大小 4096 bytes;PRP1 在第一頁內的 offset=3072,位址符合要求。
- 資料頁彼此不連續;使用 PRP,沒有 metadata 影響本例長度。
沿著欄位一步步理解
查詢次序:讀 CC.MPS 確定頁大小 → 由命令與格式算傳輸 bytes → 計算第一頁剩餘空間,再決定 PRP2 類型。
推導 1第一頁只剩 4096−3072=1024 bytes。長度 5120 時,剩下 4096 bytes 恰可放一個後續資料頁,PRP2 可直接指向該頁。
推導 2長度 6144 時,剩下 5120 bytes,需兩個後續資料頁。此時 PRP2 指向 PRP list,list entries 再指向那兩個資料頁;不能仍把 PRP2 當第一個後續資料 buffer。
- PRP
- Physical Region Page,描述資料頁位置的指標
推導 3判斷關鍵是跨越的頁數,不是總長是否大於某個固定常數。把 6144 bytes 改成從頁首開始,又只跨兩個頁面,PRP2 的角色便可能不同。
完整原文定位
- Base 2.4 · §4.3.1 · Figure 111 · PRP Entry – Page Base Address and Offset · 文件頁 158 · PDF 184
- Base 2.4 · §4.3.1 · Figure 113 · PRP List Layout for Physically Non-Contiguous Memory Pages · 文件頁 159 · PDF 185
- Base 2.4 · §4.3.1 · 文件頁 158–160 · PDF 184–186
- Base 2.4 · §3.1.4.5 · Figure 41 · Offset 14h: CC – Controller Configuration · 文件頁 60–63 · PDF 86–89
回情境索引
練習 04SGL 地址正確,長度還可能不夠嗎?
- SGL
- Scatter Gather List,描述分散資料區段的清單
buffer 的地址都能存取,但命令仍有資料長度問題。如何在不讀取實體記憶體的情況下先檢查描述子?
模擬回傳與已知條件
- 命令要求 8192 data bytes;完整 SGL 只有兩個合法 Data Block descriptors,Length 分別為 4096、2048。
- 沒有 Bit Bucket、metadata 或其他 descriptors;SGL 支援與排列方式已確認。
沿著欄位一步步理解
查詢次序:由命令與 LBA 格式計算需求 → 按 descriptor type 走訪完整 SGL → 加總 Data Block lengths。
- LBA
- Logical Block Address,邏輯區塊位址
推導 1兩段合計 6144 bytes,比命令需要的 8192 少 2048。地址合法只回答可指向哪裡,Length 才界定可傳輸的範圍;兩者不能互相代替。
推導 2Segment descriptor 的 Length 用來描述另一段 descriptors 所占的範圍,不能當作 payload bytes 加進資料總量。先按 type 區分「描述資料」與「描述下一段清單」,才不會把缺少的資料藏在表頭長度裡。
推導 3本例可確定描述的 payload 不足;實際 controller 回覆仍要保留 SCT/SC,按 SGL validation 規則比對。不能因找出一個長度問題,就忽略可能同時存在的其他格式錯誤。
完整原文定位
- Base 2.4 · §4.3.2 · Figure 114 · SGL Validation Error Conditions · 文件頁 161 · PDF 187
- Base 2.4 · §4.3.2 · Figure 116 · Generic SGL Descriptor Format · 文件頁 161 · PDF 187
- Base 2.4 · §4.3.2 · Figure 119 · SGL Data Block descriptor · 文件頁 162–163 · PDF 188–189
- Base 2.4 · §4.3.2 · Figure 121 · SGL Segment descriptor · 文件頁 163 · PDF 189
回情境索引
練習 05要從 offset 1024 讀 3 KiB,NUMD 應填多少?
一個一般 byte-offset log 支援這個讀取範圍。請分別編碼長度與起點,不把 byte 數直接填進 NUMD。
模擬回傳與已知條件
- 需 3072 bytes,起點距 log 開頭 1024 bytes;OT=0,無特殊長度覆寫規則。
- LID、NSID、CSI、LSP、LSI 都已依目標 log 正確選定。
沿著欄位一步步理解
查詢次序:Get Log Page:NUMDU/NUMDL 控制長度;LPO 配 OT 控制位置;先查該 log 是否有例外。
推導 13072÷4=768 Dwords,減 1 後 NUMD=767=02FFh,所以 NUMDU=0、NUMDL=02FFh。填入 3072 會被解成另一個 Dword 數,而不是 3072 bytes。
推導 2OT=0 時 LPO=1024 表示 byte offset;本次範圍為 bytes 1024–4095。若改成 OT=1,LPO 變成資料結構 index,只有支援該模式的 log 才能使用,不能把同一數字當相同位置。
推導 3還要確認讀取是否保留事件:RAE 的選擇可能有通知確認效果。像 Persistent Event Log 的 ACT=3 另有固定 header 規則,就不能套用本題的一般長度算法控制回傳範圍。
完整原文定位
- Base 2.4 · §5.2.13 · Figure 204 · Get Log Page – Command Dword 10 · 文件頁 213 · PDF 239
- Base 2.4 · §5.2.13 · Figure 205 · Get Log Page – Command Dword 11 · 文件頁 214 · PDF 240
- Base 2.4 · §5.2.13 · Figure 208 · Get Log Page – Command Dword 14 · 文件頁 214–215 · PDF 240–241
- Base 2.4 · §5.2.13.1.14 · Figure 232 · Persistent Event Log Specific Parameter Field · 文件頁 246 · PDF 272
回情境索引
練習 06Effects log 說會改 namespace,就表示剛剛新增了嗎?
操作後,工具只靠 NIC=1 就把 namespace 數量加 1。這是能力查詢還是歷史查詢?
模擬回傳與已知條件
- Commands Supported and Effects 中,目標 Admin opcode 的 CSUPP=1、NIC=1。
- 一筆該 opcode 的命令已完成,但工具未保留 action、status 或新的 Identify 清單。
沿著欄位一步步理解
查詢次序:Get Log Page LID=05h 查對應 Admin/I/O opcode 區;再取得實際命令及完成紀錄,必要時重新 Identify。
推導 1CSUPP 說明命令支援,NIC 說明命令可能改 namespace inventory。它們不是事件時間線,也沒說該命令這一次一定成功或一定執行 Create。
推導 2正確做法是依命令 action 與完成狀態決定是否更新盤點,再取得 Allocated/Active lists。若一律加 1,Delete、失敗的 Create、或沒有變更的動作都會把快取搞錯。
推導 3I/O opcode 還要在正確 command set 下解讀。相同數字出現在另一張 opcode 表,不一定是同一個命令;effects 的作用範圍與協調要求也不能取代實際結果。
完整原文定位
- Base 2.4 · §5.2.13.1.6 · Figure 217 · Commands Supported and Effects Data Structure · 文件頁 228–229 · PDF 254–255
- Base 2.4 · §5.2.14 · Figure 336 · Identify – CNS Values · 文件頁 338–339 · PDF 364–365
回情境索引
01CDW0:先辨認命令與資料指標格式
Base 2.4 · Figure 92 · Command Dword 0
§4.1.1 · 文件頁 139–140 · PDF 165–166
01.1 · 用途解讀一筆 SQE 時,先看 CDW0,確定命令識別、opcode 及後續資料指標的格式。CID 要連同 SQID 才能唯一識別尚未完成的命令。
01.2 · 欄位與關係CID 在 bits31:16,PSDT 在 15:14,FUSE 在 9:8,OPC 在 7:0。PSDT=00b 使用 PRP;01b/10b 使用 SGL 但 metadata 指標解讀不同。PCIe Admin 命令使用 PRP。FUSE 區分一般操作與融合操作中的第一/第二筆。
01.3 · 判讀與例子同樣的 DPTR bytes,PSDT 不同就可能代表兩個 PRP 指標或一個 SGL 描述子。因此看到一個似乎合理的地址,不足以證明解析正確;先核對 PSDT 和命令所允許的格式。
搜尋詞:CDW0 · OPC · CID · PSDT · FUSE
回本冊圖表索引
0264-byte 命令的共同位置
Base 2.4 · Figure 93 · Common Command Format
§4.1.1 · 文件頁 140–142 · PDF 166–168
02.1 · 用途這張表是把原始命令 bytes 對回欄位的總地圖。它告訴你哪些位置共通,哪些位置必須接到個別命令定義。
02.2 · 欄位與關係CDW0 在 bytes3:0,NSID 在 7:4,CDW2/3 在 15:8,MPTR 在 23:16,DPTR 在 39:24,CDW10~15 在 63:40。PRP 模式下,DPTR 分為 PRP1 與 PRP2;PRP2 可能保留、指第二頁或指 PRP List,取決於傳輸跨越多少頁邊界。
- NSID
- Namespace Identifier,邏輯儲存空間識別碼
02.3 · 判讀與例子例如 4 KiB 頁、PRP1 頁內 offset=512、傳輸 8192 bytes,需要 3 個資料頁;PRP2 因此指向清單,而不是第二資料頁。NSID=FFFFFFFFh 也不是所有命令都接受的通用廣播值。
- NSID
- Namespace Identifier,邏輯儲存空間識別碼
搜尋詞:SQE · NSID · MPTR · DPTR · CDW10 · PRP2
回本冊圖表索引
03CQE:完成結果的外框
Base 2.4 · Figure 97 · Common Completion Queue Entry Layout – Admin and All I/O Command Sets
§4.2.1 · 文件頁 144 · PDF 170
03.1 · 用途拿到 completion 原始資料時,先用此配置圖分出回傳值、queue 位置、命令識別與 status。共同格式至少 16 bytes,圖中只描述前 16 bytes。
03.2 · 欄位與關係DW0 與 DW1 依命令定義,不能一律當 0 或一般 status;DW2 含 SQID 與 SQHD,DW3 含 STATUS、P 與 CID。P 是 phase tag,用來辨認環形 CQ 中的新項目。
- CQ
- Completion Queue,完成佇列
03.3 · 判讀與例子Get Features 的 DW0 可能是 Feature 值,Namespace Management 的 DW0 可能是新 NSID。兩者都應先查命令定義;是否成功則由 DW3 的 status 判斷。
搜尋詞:CQE · DW0 · DW1 · DW2 · DW3
回本冊圖表索引
04CQE DW2:對回 SQ 與已消耗的位置
- SQ
- Submission Queue,提交佇列
Base 2.4 · Figure 98 · Completion Queue Entry: DW 2
§4.2.1 · 文件頁 144 · PDF 170
04.1 · 用途多個 SQ 共用同一個 CQ 時,SQID 協助把完成結果對回來源。SQHD 則讓主機知道提交佇列哪些位置已被 controller 消耗。
04.2 · 欄位與關係SQID 在 bits31:16,SQHD 在 15:0。SQID 加上 DW3 的 CID 識別命令;SQHD 是建立這筆 CQE 時的 SQ head 快照,不是完成的命令在 SQ 中的 index。
04.3 · 判讀與例子SQHD=12 不代表 CID12 完成,也不保證主機讀取時 controller 仍停在 12。命令可以不同順序完成,應分開追蹤 buffer 可重用位置與命令完成狀態。
搜尋詞:SQID · SQHD · CQE DW2
回本冊圖表索引
05CQE DW3:新舊判別、CID 與狀態
Base 2.4 · Figure 99 · Completion Queue Entry: DW 3
§4.2.1 · 文件頁 145 · PDF 171
05.1 · 用途主機掃描 CQ 時,這張表把「是否新完成項目」與「哪筆命令、什麼結果」分開。P 不是成功旗標。
05.2 · 欄位與關係CID 在 bits15:0,P 在 bit16,STATUS 在 bits31:17。主機按目前 CQ 循環所期待的 phase 判斷新項目;若 CQE 分多次寫入,phase bit 必須在最後一次寫入更新。
05.3 · 判讀與例子P 符合目前期待值後,再用 SQID/CID 對命令並解析 status。P=1 本身不代表新項目,因為期待值會隨 CQ 回繞改變。
搜尋詞:CID · P · Phase Tag · STATUS · CQE DW3
回本冊圖表索引
06Status:類別、錯誤碼與重試提示
Base 2.4 · Figure 101 · Completion Queue Entry: Status Field
§4.2.3 · 文件頁 145–146 · PDF 171–172
06.1 · 用途命令有完成結果但不成功時,從這張表拆出狀態欄位,再選正確的錯誤碼表。原圖 bit 位置是相對整個 CQE DW3,不是已移位的 15-bit STATUS。
06.2 · 欄位與關係DNR bit31 表示相同命令重送是否預期仍失敗;M bit30 表示 Error Information 有額外資訊;CRD bits29:28 選重試等待時間;SCT bits27:25 為類別,SC bits24:17 為代碼。CRD 只有 DNR=0 且 Host Behavior Support 的 ACRE=1 才適用。
- DNR
- Do Not Retry,命令重試的狀態提示
06.3 · 判讀與例子DW3=8005002Ah 可拆出 DNR=1、SCT=0、SC=02h、P=1、CID=002Ah。這表示通用 Invalid Field in Command,不能只取 02h 就忽略類別;DNR=0 的情況也不保證重試成功。
搜尋詞:SCT · SC · DNR · M · CRD · ACRE
回本冊圖表索引
07SCT:決定去哪張錯誤碼表
Base 2.4 · Figure 102 · Status Code – Status Code Type Values
§4.2.3 · 文件頁 146 · PDF 172
07.1 · 用途這張表是 status 查詢的分流入口。同一個 SC 數值,在不同 SCT 下可能完全不同。
07.2 · 欄位與關係SCT=0 是通用命令狀態,1 是命令專屬狀態,2 是媒體與資料完整性,3 是路徑相關,7 是廠商專屬,4~6 保留。表的 Reference 欄帶你到對應 Base 小節;I/O 命令還可能有 command set 補充。
07.3 · 判讀與例子SC=80h、SCT=0 在 NVM 代表 LBA Out of Range;SC=80h、SCT=1 則是 Conflicting Attributes。工具若只印 80h,資訊不足以判讀。
- LBA
- Logical Block Address,邏輯區塊位址
搜尋詞:SCT · Generic · Command Specific · Media · Path Related
回本冊圖表索引
08通用錯誤碼:先區分哪類參數問題
Base 2.4 · Figure 103 · Status Code – Generic Command Status Values
§4.2.3.1 · 文件頁 147–150 · PDF 173–176
08.1 · 用途SCT=0 時,這張表可查 opcode、欄位、namespace、資料傳輸與命令順序等通用結果。它不是所有 I/O 特有錯誤的完整清單。
08.2 · 欄位與關係Value 欄是 SC,Definition 描述觸發情況。常查 00h 成功、01h 非法 opcode、02h 非法欄位、0Bh 非法 namespace 或格式。錯誤名稱相近不代表相同條件;inactive NSID 與 invalid NSID 也不能混為一談。
08.3 · 判讀與例子收到 02h 時先看命令的欄位及有效條件,再用 M 和 Error Information 中的 Parameter Error Location 縮小位置。不能把每個 02h 都直接歸因為 NSID 錯誤。
搜尋詞:generic status · Invalid Field · Invalid Namespace · SC
回本冊圖表索引
09Admin 命令專屬狀態
Base 2.4 · Figure 104 · Status Code – Command Specific Status Values
§4.2.3.2 · 文件頁 151–152 · PDF 177–178
09.1 · 用途SCT=1 且涉及 Admin 操作時,先在這張表找原因,再回到發出命令的章節。部分狀態表示需要後續動作,不宜只分成成功/硬體故障。
09.2 · 欄位與關係表以 SC 對應描述,包含 queue ID 或大小錯誤、韌體 slot/image 問題,以及需要 reset 的啟用結果。對照時保留原 opcode,因為命令專屬碼必須放回命令情境。
09.3 · 判讀與例子韌體要求 reset 的完成結果,和下載 image 無效是兩種處理方向:前者應確認啟用時點與所需 reset 層級,後者應檢查 image 及提交參數。不要看到非 0 狀態就反覆重送相同更新。
搜尋詞:command specific · queue error · firmware status · SCT 1
回本冊圖表索引
10媒體與保護檢查錯誤
Base 2.4 · Figure 107 · Status Code – Media and Data Integrity Error Values
§4.2.3.3 · 文件頁 154–155 · PDF 180–181
10.1 · 用途SCT=2 時,用這張表區分媒體讀寫錯誤與資料保護檢查失敗。保護資訊不符不必然等於 NAND 物理損壞。
10.2 · 欄位與關係SC 及描述涵蓋 Write Fault、Unrecovered Read,以及 Guard、Application Tag、Reference Tag 檢查錯誤。先保留失敗種類,再查 namespace 格式、命令的檢查旗標與預期 tag。
10.3 · 判讀與例子Reference Tag 失敗時,LBA 起點、PI 類型或 tag 設定不一致都值得核對;若只記成「讀取錯誤」,會失去定位線索。NVM 另補 Compare Failure 及 Deallocated/Unwritten 相關碼。
- PI
- Protection Information,資料保護資訊
搜尋詞:SCT 2 · Guard · Application Tag · Reference Tag · Media Error
回本冊圖表索引
11PRP 地址如何分成頁基底與 offset
Base 2.4 · Figure 110 · PRP Entry Layout
§4.3.1 · 文件頁 158 · PDF 184
11.1 · 用途這張位元圖用來確認 PRP 的地址切割。頁內 offset 是從該頁起點算起的 bytes,不是第幾個 PRP entry。
11.2 · 欄位與關係高位是 Page Base Address,低 n+1 位是頁內 offset;分界由 CC.MPS 決定。4 KiB 頁使用低 12bits,8 KiB 頁使用低 13bits,不能在所有配置硬套同一個 FFFh 遮罩。
11.3 · 判讀與例子地址 12345000h 在 4 KiB 頁下 offset 為 0;在 8 KiB 頁下 offset 為 1000h。相同地址的 PRP 是否合法,還要看它在命令或清單中的角色。
搜尋詞:PRP · Page Base Address · offset · CC.MPS
回本冊圖表索引
12PRP:哪些位置允許頁內 offset
Base 2.4 · Figure 111 · PRP Entry – Page Base Address and Offset
§4.3.1 · 文件頁 158 · PDF 184
12.1 · 用途看懂位址分界後,查這張表與其後段落判斷對齊要求。第一個資料指標、PRP List 指標和清單內資料頁指標,規則不同。
12.2 · 欄位與關係PBAO 佔 64bits。一般 PRP offset 至少 Dword 對齊;資料起始 PRP 可依命令允許非 0 offset,清單內資料頁指標則頁對齊。初始 PRP List 指標另須 8-byte 對齊,後續 list page 須頁對齊。
12.3 · 判讀與例子4 KiB 頁下,作為第一個資料 PRP 的 200004h 可能合法,作為清單內資料頁指標卻不合頁對齊要求。不能只檢查最低 2bits 就放行所有 PRP 位置。
搜尋詞:PBAO · PRP1 · PRP2 · alignment
回本冊圖表索引
13PRP List:不連續實體頁的排列
Base 2.4 · Figure 113 · PRP List Layout for Physically Non-Contiguous Memory Pages
§4.3.1 · 文件頁 159 · PDF 185
13.1 · 用途主機資料 buffer 跨多個不連續實體頁時,這張圖展示 PRP List 如何保存每頁地址。資料邏輯上連續,不代表實體地址必須連續。
13.2 · 欄位與關係每個清單項目 8bytes,資料頁地址的 offset 為 0;項目緊密排列,從 entry0 開始。若清單需要下一頁,當頁最後一項改為下一個 list page 的指標,因此不是每一項都代表資料頁。
13.3 · 判讀與例子4 KiB 清單頁可容納 512 個 8-byte 項目;需要串接時,最後一項用於串接,這一頁最多剩 511 個資料頁地址。不能把清單 page 地址也算入資料傳輸。
搜尋詞:PRP List · page chain · non-contiguous
回本冊圖表索引
14SGL 結構錯誤如何對應 status
Base 2.4 · Figure 114 · SGL Validation Error Conditions
§4.3.2 · 文件頁 161 · PDF 187
14.1 · 用途SGL 地址看來正確卻被拒絕時,查這張條件對照表。它針對描述子排列與類型的錯誤,不只檢查 buffer 是否夠長。
14.2 · 欄位與關係Segment/Last Segment 描述子出現在 segment 中非最後位置,對應 Invalid Number of SGL Descriptors;最後一個 segment 又含串接描述子,對應 Invalid SGL Segment Descriptor;不支援的 type 或 type/subtype 組合則是 SGL Descriptor Type Invalid。
14.3 · 判讀與例子若 3 個描述子中第 2 個是 Segment,第 3 個還是 Data Block,錯在串接描述子的位置;把第 3 個資料 buffer 加大不會解決這個結構錯誤。
搜尋詞:SGL validation · Invalid Number of SGL Descriptors · Invalid SGL Segment Descriptor
回本冊圖表索引
15SGL 描述子的 type 與 subtype
Base 2.4 · Figure 116 · Generic SGL Descriptor Format
§4.3.2 · 文件頁 161 · PDF 187
15.1 · 用途每個 SGL 描述子長 16bytes,先看最後一個 byte,才能決定前 15bytes 如何解讀。不能看見前 8bytes 就一律當使用者資料地址。
15.2 · 欄位與關係byte15 為 SGLID,上半 byte bits7:4 是 type,下半 byte bits3:0 是 subtype;bytes14:0 依類型定義。常見 Data Block、Segment、Last Segment 的 type 分別為 0、2、3。
15.3 · 判讀與例子SGLID=30h 表示 type3、subtype0,地址指向最後一段描述子清單,而不是直接指資料。支援哪些類型仍要查 Identify 及 PCIe 適用條件。
搜尋詞:SGLID · SGLDT · SGLDST · descriptor
回本冊圖表索引
16SGL Data Block:直接描述資料 buffer
Base 2.4 · Figure 119 · SGL Data Block descriptor
§4.3.2 · 文件頁 162–163 · PDF 188–189
16.1 · 用途這張表用來解讀真正的資料範圍。以本系列的 PCIe memory address 用法,ADDR 是 buffer 起點,LEN 是資料長度。
16.2 · 欄位與關係ADDR 在 bytes7:0,LEN 在 11:8,12~14 保留,byte15 的 type 為 0。LEN 直接以 bytes 計,0 表示不傳資料,仍是有效描述子;對齊與粒度須配合 Identify 的 SGLS。
16.3 · 判讀與例子LEN=4096 是 4096 bytes,不能套用 NLB 的加 1 規則。若 controller 要求 4-byte 粒度,ADDR 及 LEN 都要符合,不能只把地址對齊而保留 4097-byte 長度。
搜尋詞:SGL Data Block · ADDR · LEN · SGLS
回本冊圖表索引
17SGL Segment:指向下一段描述子
Base 2.4 · Figure 121 · SGL Segment descriptor
§4.3.2 · 文件頁 163 · PDF 189
17.1 · 用途當單一描述子不能描述所有資料時,Segment 描述子把讀取者帶到下一段 SGL。它的長度是描述子清單大小,不是資料 buffer 大小。
17.2 · 欄位與關係ADDR bytes7:0 指向下一段,LEN bytes11:8 必須非 0 且是 16 的倍數,byte15 的 type 為 2。這種串接描述子必須位於所屬 segment 的最後。
17.3 · 判讀與例子LEN=48 表示下一段有 3 個 16-byte 描述子,不能推論只傳 48bytes 使用者資料;實際資料量要由 Data Block 等資料描述子計算。
搜尋詞:SGL Segment · type 2 · LEN · ADDR
回本冊圖表索引
18SGL Last Segment:最後一段仍是一份清單
Base 2.4 · Figure 122 · SGL Last Segment descriptor
§4.3.2 · 文件頁 164 · PDF 190
18.1 · 用途這張表標示接下來指向的 segment 已是最後一段。Last 不表示這個描述子直接指向最後一塊使用者資料。
18.2 · 欄位與關係ADDR bytes7:0 及 LEN bytes11:8 描述下一段,也是最後一段的描述子陣列;LEN 非 0 且是 16 的倍數。type=3;被指向的最後 segment 不能再放 Segment 或 Last Segment 串接描述子。
18.3 · 判讀與例子LEN=32 的 Last Segment 可指向兩個 Data Block 描述子。若第二個又是 Segment,就違反最後 segment 的結構限制,應回查 Figure114。
搜尋詞:SGL Last Segment · type 3 · last segment
回本冊圖表索引
19NVM 通用狀態補充:地址、容量與原子性
NVM Command Set 1.3 · Figure 18 · Status Code – Generic Command Status Values
§3.1.2 · 文件頁 25 · PDF 25
19.1 · 用途Base 通用表找不到 NVM 特有原因時,接著查這張補充表,SCT 仍然是 0。這不是新的 status 編碼格式。
19.2 · 欄位與關係SC14h 為超過 atomic write unit,1Eh 為 SGL 地址或長度粒度錯誤,25h 為 Invalid Key Tag,80h 為 LBA 超出 namespace 大小,81h 為配置使用量超過 namespace 容量。
19.3 · 判讀與例子80h 查 SLBA、NLB 與 NSZE;81h 查 NUSE、NCAP 及配置情境。兩者都與容量相關,但「位址越界」和「使用量超過可配置容量」不應使用同一個判斷式。
- SLBA
- Starting LBA,起始邏輯區塊位址
搜尋詞:SCT 0 · LBA Out of Range · Capacity Exceeded · Atomic Write Unit Exceeded
回本冊圖表索引
20NVM 命令專屬錯誤與命令清單
NVM Command Set 1.3 · Figure 19 · Status Code – Command Specific Status Values
§3.1.2 · 文件頁 25 · PDF 25
20.1 · 用途收到 NVM 命令的 SCT=1 時,這張表除了錯誤名稱,也直接列出哪些命令可能回它。適合檢查工具是否套錯 command set。
20.2 · 欄位與關係80h 為 Conflicting Attributes,81h 為 Invalid Protection Information,82h 為 Attempted Write to Read Only Range;Copy 還有 83h 大小限制、85h 格式不相容、86h 無法 fast copy、87h 重疊範圍與 89h 資源不足。
20.3 · 判讀與例子SC81h 在這裡是 PI 設定無效,不等於 SCT2 的 Guard Check Error;前者先檢查要求的保護參數是否成立,後者則檢查資料與保護值是否吻合。
- PI
- Protection Information,資料保護資訊
搜尋詞:SCT 1 · Conflicting Attributes · Invalid Protection Information · Copy errors
回本冊圖表索引
21NVM 媒體狀態補充:Compare 與未寫入區塊
NVM Command Set 1.3 · Figure 20 · Status Code – Media and Data Integrity Error Values
§3.1.2 · 文件頁 26 · PDF 26
21.1 · 用途此表補上 NVM 命令對資料內容或已釋放區塊的失敗原因。它能避免把 Compare 不一致一律記成媒體不可讀。
21.2 · 欄位與關係SC85h 表示 Compare Failure;87h 表示 Copy、Read 或 Verify 嘗試使用 deallocated 或 unwritten 的 LBA 範圍而失敗。解讀 87h 時,還應核對 namespace 行為與 Deallocated or Unwritten Logical Block Error 相關設定。
21.3 · 判讀與例子Compare 回 85h 表示比較不相符,不是該命令一定遇到 CRC 失敗。Read 回 87h 也不能直接推論實體媒體損壞,先確認這段 LBA 是否被 deallocate 或尚未寫入。
搜尋詞:SCT 2 · Compare Failure · Deallocated or Unwritten Logical Block · DULBE
回本冊圖表索引