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 預期值;讀取記憶體的同步條件已滿足。

這個情境要連起哪些規格圖表?

下面是閱讀規格的順序;實際操作的先後與等待條件,會在情境解說中另外交代。

  1. 先看這筆完成項目是否有效

    先從 CQE 的 DW3 找到 Phase Tag,依這一輪預期值判讀。只有本輪的新完成項目才接著配對命令。

    CQE
    Completion Queue Entry,佇列中的完成項目
    Base 2.4 · Figure 97 Base 2.4 · Figure 99
  2. 用 SQID 與 CID 找回命令

    由 DW2 取得提交佇列識別值,再由 DW3 取得命令識別值。兩者一起定位同一佇列內尚未完成的命令。

    Base 2.4 · Figure 98 Base 2.4 · Figure 99
  3. 回到原命令及生命週期

    對照原 SQE 的 CID 與當時的佇列配置,再讀完成狀態;保留佇列重建與 CID 重用的時間資訊。

    SQE
    Submission Queue Entry,佇列中的命令項目
    Base 2.4 · Figure 92 Base 2.4 · Figure 97
沿著欄位一步步理解

查詢次序:先檢查預期 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

回本冊圖表索引