NVMe · 規格與原理

NVMe Base 2.4 第 4 章:SQE、CQE、Status、PRP 與 SGL

00.01.一筆 NVMe 命令必須告訴控制器要做什麼、對哪個 namespace 操作,以及資料放在哪裡;完成結果則必須讓主機認出是哪筆命令、結果如何。本篇從這兩個方向拆解 SQE、CQE 與 PRP/SGL。

namespace
namespace,主機透過 controller 存取的一份已格式化非揮發性容量。
NVMe
Non-Volatile Memory Express,主機與非揮發性記憶體子系統之間的介面規範家族。
CQE
Completion Queue Entry,CQ 中的一筆完成結果資料結構。
PRP
Physical Region Page,以 memory page 為單位描述 host-addressable data buffer 的 pointer 格式。
SGL
Scatter Gather List,以 descriptor 與 segment 描述一段或多段 data buffer 的格式。
SQE
Submission Queue Entry,SQ 中的一筆命令資料結構。

這篇的主軸

01

命令內容 SQE

01-01理解命令識別、操作碼與資料指標的分工。

02

完成結果 CQE

02-01分開理解新完成項目、命令身分與狀態碼。

03

資料位址 PRP/SGL

03-01把作業系統的記憶體頁面概念接到 NVMe 資料傳輸。

04

其他共用資料結構

04-01理解功能值、識別碼、清單與文字的表示方式。

00.02.命令與完成項目是佇列中的記錄,讀寫的資料通常由資料指標指定。先分清楚「命令記錄」與「命令要搬移的資料」,就能理解後面的欄位配置。

把主軸連起來

00.03.把一次操作拆成三份資訊:SQE 說明主機要做什麼,PRP/SGL 描述資料在哪裡,CQE 回報是哪筆命令完成及其結果。識別碼與清單則協助主機選擇正確對象。

00.04.本篇由共同布局逐步深入位元、長度與指標。讀完應能從一個命令範圍算出資料量,選擇正確的指標解讀方式,再利用完成項目找回原命令。每次計算都要先確認單位,而不是只憑欄位名稱推測。

01 SQE 的共用格式與命令欄位

將一筆讀取要求拆成三組資訊

操作與對象

01.01.OPC 說要做什麼,NSID 說對哪個 namespace 做,命令專屬 Dwords 再描述其地址範圍。CID 則是主機日後辨識這筆命令的識別碼;CID 不是資料的起始 LBA。

NSID
Namespace Identifier,controller 用來指向 namespace 的數值 handle;identifier 不等於 namespace 物件本身。
CID
Command Identifier,與 SQ identifier 合用以辨識 outstanding command。

資料要放在哪裡

01.02.DPTR 可能以 PRP 或 SGL 描述資料位置,PSDT 決定解讀方式。控制器先按 PSDT 選結構,再解釋 DPTR 內的 bit;不能只看某個值很像地址就直接作為連續 buffer。

DPTR
Data Pointer,SQE 中指出 command data buffer 的欄位。
PSDT
PRP or SGL for Data Transfer,CDW0 中決定 DPTR 應按 PRP 或 SGL 解讀的欄位。

把回覆對回原要求

01.03.完成後以 CQE 的 SQID 與 CID 對回這筆 SQE,再以 SCT、SC 判斷結果。原 SQE 的參數提供上下文,CQE 的狀態才知道這組要求被如何處理。

SQID
Submission Queue Identifier,辨識 command 所屬 SQ 的數值。
SCT
Status Code Type;指定完成狀態碼所屬類別,需與 SC 一起解讀。
SC
Status Code;指定所選 SCT 類別中的完成結果。
來源:Base 2.4 §4.1.1

來源: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

CDW0 · 32 bitsCDW0 把命令識別、資料指標類型、融合操作與操作碼放在同一個 Dword。欄位寬度以標示的 bit 範圍為準,圖塊為閱讀需要調整。CID31:16PSDT15:14Reserved13:10FUSE9:8OPC7:0
CDW0 把命令識別、資料指標類型、融合操作與操作碼放在同一個 Dword。欄位寬度以標示的 bit 範圍為準,圖塊為閱讀需要調整。
Dword
Dword(Double word);32 bits,也就是 4 bytes。對比 word=16 bits;例如 zero-based dword count=3 代表 4 個 Dwords,也就是 16 bytes。
CDW
CDW(Command Dword);命令中的 32-bit 欄位單位,例如 CDW10 的 10 是欄位 index,不是 byte offset。

把流程對回規格條件

01.05.Admin 與 I/O common SQE 固定為 64 bytes。CDW0、NSID、data pointer 與 CDW10-15 的通用位置先固定,再由各 command 定義命令專屬內容。

Admin
Administrative,建立、設定、查詢或管理 controller 與 queue 的控制路徑。
I/O
Input/Output,對 namespace 執行資料輸入與輸出的操作類別。
來源:Base 2.4 §4.1.1

來源: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。

來源:Base 2.4 §4.1.1

來源: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 定義另有規定。

PCIe
PCI Express,NVMe memory-based controller 使用的 transport 與裝置互連。
來源:Base 2.4 §4.1.1

來源:NVME-BASE-2.4, Rev. 2.4, §4.1.1, 文件頁 140-142, PDF 頁 166-168

SQE 的共用格式與命令欄位
SQE 區域主機在這裡描述什麼如何選擇正確的欄位定義
CDW0命令身分 與 資料指標選擇欄位所有 commands 共用
NSID指定的 namespace 範圍不用時必須依 command 定義清零或使用特殊值
MPTR/DPTRmetadata 與 data buffer由 PSDT 與 command 規則決定
CDW10-15命令專用參數不能跨 command 借用語意
metadata
隨 logical block 儲存的附加資料,可包含資料保護資訊,也可有其他用途。
MPTR
Metadata Pointer,SQE 中指出獨立 metadata buffer 的欄位。
閱讀相關規格圖表 → SQE 的共用格式與命令欄位

02 CQE:新完成項目、命令識別與結果

02.01.主機讀取 CQE 時,先要知道這個位置是否包含新完成項目,再辨認它屬於哪筆命令,最後才解釋結果。Phase Tag、SQID/CID、SCT/SC 分別參與這三個問題。單獨讀出一個狀態碼,缺少命令和類別,就容易查到錯的狀態定義。

02.02.DNR 描述以相同命令重試是否預期能成功,不等於永久硬體故障診斷。CRD 在適用時提供重試延遲選擇,也不是所有狀態都通用的等待時間。這些補充欄位應在辨認主要結果後閱讀,而不是取代主要結果。

CRD
Command Retry Delay,status 中選擇 controller 建議重試延遲值的欄位。
DNR
Do Not Retry,CQE status 中提示以相同 command 重試預期不會成功的 bit。
來源:Base 2.4 §4.2.1 · Base 2.4 §4.2.3 · Base 2.4 §4.2.4

來源: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 看到半成品。

Host
主機;執行作業系統並送出 NVMe 命令的一端。
來源:Base 2.4 §4.2.1

來源: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 單獨解讀。

來源:Base 2.4 §4.2.3

來源: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 翻轉。

CQ
Completion Queue,controller 放入完成結果的完成佇列。
來源:Base 2.4 §4.2.4

來源:NVME-BASE-2.4, Rev. 2.4, §4.2.4, 文件頁 155-158, PDF 頁 181-184

CQE:新完成項目、命令識別與結果
完成狀態欄位回答哪個問題解讀時還需哪些資訊
SCTstatus 大類一定先解
SC類別內具體結果不能脫離 SCT
DNR同 command 重試預期不是永久硬體故障的同義詞
CRD建議 retry delay selector只有適用 status 才使用
閱讀相關規格圖表 → CQE:新完成項目、命令識別與結果

03 PRP 如何描述跨頁資料

一個 buffer 跨頁時,PRP2 的意思會改變

先算第一頁還剩多少

03.01.假設 memory page 是 4096 bytes,PRP1 指到頁內 offset 3072,第一頁可承載 1024 bytes。需要傳輸 6144 bytes 時,第一頁之後還剩 5120 bytes。

offset
offset;從指定起點算出的位移。它回答「離起點多遠」,不等於 index。

判斷剩餘資料需要幾頁

03.02.5120 bytes 超過一個完整 page,因此後面至少需要兩個資料頁。此時 PRP2 應按 PRP List 的規則解讀,而不是直接當成第二個資料頁地址。

沿清單逐頁配置資料

03.03.清單的第一個資料頁承接 4096 bytes,下一頁承接最後 1024 bytes。主機的虛擬地址可以連續,控制器可見的資料頁地址不必因此連續;PRP List 就是在描述這些實際頁位置。

來源:Base 2.4 §4.3.1 · Base 2.4 §4.1.1

來源: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。

page offset
page offset;資料在第一個記憶體 page 內的起始位移;跨過 page boundary 後,位置由下一個 page pointer 決定。
來源:Base 2.4 §4.3.1

來源:NVME-BASE-2.4, Rev. 2.4, §4.3.1, 文件頁 158-159, PDF 頁 184-185

PRP 如何描述跨頁資料
資料跨頁情況PRP2 的解讀方式指標與對齊要求
資料不跨第一頁只需 PRP1PRP2 不承載下一段
剩餘資料只需一頁PRP2 指第二個 data pageaddress page-aligned
剩餘資料超過一頁PRP2 指 PRP Listlist entries 再指 data pages
閱讀相關規格圖表 → PRP 如何描述跨頁資料

04 SGL 的資料與串接描述子

同樣是 16-byte 描述子,也要先看型別

用型別決定箭頭指向什麼

04.01.Data Block descriptor 描述一段資料,Segment descriptor 指向下一組描述子。兩者都可能含地址和長度,但長度指的是資料或描述子集合,不能交叉解讀。

把分散區域接成傳輸順序

04.02.若兩個 Data Block 分別有 1024 與 3072 bytes,它們可共同描述一筆 4096-byte 傳輸。控制器沿描述子順序使用資料;兩個地址不必相鄰。

先檢查支援,再選進階型別

04.03.Identify 回報支援哪些 SGL 能力,命令格式也限制可以採用的 descriptor。圖中出現某種型別,不表示任何控制器、任何命令都能使用。

來源:Base 2.4 §4.3.2 · Base 2.4 §4.1.1

來源: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。

來源:Base 2.4 §4.3.2

來源:NVME-BASE-2.4, Rev. 2.4, §4.3.2, 文件頁 159-166, PDF 頁 185-192

SGL 的資料與串接描述子
指標或描述子種類位址與長度描述什麼沿指標會找到什麼
PRP以記憶體頁描述位址第一頁 offset + 後續 page alignment
SGL Data Block起始位址與資料長度(bytes)資料區段可用 descriptor 表示
SGL Segment清單位址與清單長度(bytes)指向下一層 descriptors,不是 data
Bit Bucket只消耗 transfer length不代表可讀寫的 memory buffer
閱讀相關規格圖表 → SGL 的資料與串接描述子

05 Feature 值、識別碼、清單與字串

05.01.識別資料可能是固定長度的數值,也可能是字串或清單。它們解決的問題不同:廠商 ID 辨認廠商,型號與序號描述產品,namespace 的全域識別值用來辨認儲存對象。長度相同或外觀看起來都是十六進位,並不表示可以互換。

05.02.清單也不一定都從數量欄位開始。Controller List 先放 NUMCIDS,再列控制器 IDs;Namespace List 直接排列 NSIDs,未使用位置依規則填零。字串則要分開計算字元數與 bytes,例如「中」以 UTF-8 編碼占 3 bytes,而不是 1 byte。

NUMCIDS
Number of Controller Identifiers;Controller List 中有效 controller IDs 的數量。
UTF-8
Unicode Transformation Format - 8-bit,以一到四個 bytes 編碼 Unicode code point 的文字格式。
來源:Base 2.4 §4.4 · Base 2.4 §4.5 · Base 2.4 §4.6 · Base 2.4 §4.8

來源: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 判定。

來源:Base 2.4 §4.4

來源: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。

EUI64
64-bit Extended Unique Identifier,使用 IEEE 配置空間建立的 64-bit identifier。
NGUID
Namespace Globally Unique Identifier,namespace 的 128-bit 全域識別值。
SSVID
Subsystem Vendor ID,辨識 subsystem vendor 的 PCI identifier。
UUID
Universally Unique Identifier,128-bit identifier;其實際關聯範圍仍由使用它的資料結構決定。
OUI
Organizationally Unique Identifier,由 IEEE 配置給組織的 identifier 前綴。
VID
Vendor ID,由 PCI-SIG 配置、辨識 vendor 的 identifier。
MN
Model Number,辨識產品型號的字串。
SN
Serial Number,辨識一個產品實例的序號字串。
來源:Base 2.4 §4.5

來源: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。

controller
controller,實作 NVMe 介面、取走 command 並回報 completion 的控制實體。
來源:Base 2.4 §4.6

來源:NVME-BASE-2.4, Rev. 2.4, §4.6, 文件頁 172-173, PDF 頁 198-199

05.06.處理 UTF-8 輸入時要依規格流程驗證編碼、禁止的 code point 與截斷情況;不可把任意 byte sequence 當成有效字串。

來源:Base 2.4 §4.8

來源:NVME-BASE-2.4, Rev. 2.4, §4.8, 文件頁 175, PDF 頁 201

Feature 值、識別碼、清單與字串
識別欄位或清單辨認的對象與格式長度及數量如何解讀
VID/SSVID廠商與 subsystem 廠商識別值按各自欄位辨認對象
SN/MN產品序號與型號字串依固定欄位長度與填補規則閱讀
EUI64/NGUID/UUID不同格式的物件識別值長度及身分範圍不能互換
Controller ListNUMCIDS 加上 16-bit IDs有明確數量欄位
Namespace List直接排列 32-bit NSIDs沒有 Controller List 的數量標頭
閱讀相關規格圖表 → Feature 值、識別碼、清單與字串

06 讀懂本篇的規格圖表

06.01.以下依概念整理規格中的圖表。每組先說明讀取順序與要判斷的問題,接著列出各圖的欄位或行為說明。可以由正文的連結跳到對應組別,也可以用這一節檢查自己能否把欄位連回完整操作。

圖表組 01 · SQE 的共用格式與命令欄位 · 3 張圖表

06.02.共用布局圖先找 CDW0、NSID、MPTR/DPTR 與命令專用區域,再看 CDW0 的 bit 範圍。圖塊為方便閱讀而調整寬度時,以標註的 bits 為準,不能拿像素寬度計算欄位大小。

回到本節的解釋與範例

同一筆命令的身分、對象與資料方向

06.03.CDW0 先選操作與資料指標格式;NSID 選操作對象;DPTR/MPTR 再指向資料。命令專屬 Dwords 的含義由 OPC 與命令集決定。

一起判讀的欄位或標示如何共同決定操作或結果帶入情境後怎麼讀
OPC/FUSE/CIDOPC 選操作,FUSE 說明融合操作角色,CID 讓完成項目找回原命令。相同的 CDW10 數值放在 Read 與 Set Features 中,可能完全不是同一種意思。
PSDT → DPTR/MPTRPSDT 決定指標依 PRP 或 SGL 等格式解讀;指標內的數值不可在未選格式時直接當成長度。主機先選指標格式,再按該格式準備 buffer 描述,最後由命令語意判斷資料方向。
NSID/CDW2–CDW15NSID 與命令專屬欄位共同決定對象、範圍及選項。Create 的 DPTR 指向建立參數;它不是新 namespace 的實體儲存位址。
NDT/NDM/MDPTR廠商命令使用共同格式時,資料與 metadata 長度各有自己的欄位及指標。先看廠商命令格式支援宣告,再依長度定義換算,不能把欄位上限直接加 1 後存回同寬整數。
NDM
Number of Dwords in Metadata Transfer,standard vendor-specific format 中的實際 metadata dword 數。
NDT
Number of Dwords in Data Transfer,standard vendor-specific format 中的實際 data dword 數。
來源:Base 2.4 §4.1.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

Base Figure 92 · Command Dword 0

一句話重點

Base92-1CDW0 把操作碼、資料指標類型、融合設定與命令識別放在一起。

來源:Base 2.4 §4.1.1

來源:NVME-BASE-2.4, Rev. 2.4, §4.1.1, Figure 92, 文件頁 139-140, PDF 頁 165-166

用例子讀懂

Base92-2兩筆命令 OPC 相同但 CID 不同,代表相同操作的兩個請求;不能把 CID 當成操作種類。

Base Figure 93 · Common Command Format

一句話重點

Base93-1共通 SQE 固定各命令共用欄位的位置。

來源:Base 2.4 §4.1.1

來源:NVME-BASE-2.4, Rev. 2.4, §4.1.1, Figure 93, 文件頁 140-142, PDF 頁 166-168

用例子讀懂

Base93-2同樣在 CDW10,Read 與管理命令可以有完全不同含義;先依 OPC 選命令,再查專屬欄位表。

Base Figure 94 · Common Command Format - Vendor Specific Commands (Optional)

一句話重點

Base94-1廠商命令格式另以 NDT、NDM 表達傳輸長度資訊。

來源:Base 2.4 §4.1.1

來源:NVME-BASE-2.4, Rev. 2.4, §4.1.1, Figure 94, 文件頁 143, PDF 頁 169

用例子讀懂

Base94-2若依欄位定義 NDT=16 個 Dwords,資料長度為 64 bytes;此值不能套用別的命令從零起算的加 1 規則。

圖表組 02 · CQE:新完成項目、命令識別與結果 · 11 張圖表

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/CRDTDNR 與重試延遲資訊影響如何理解重新提交;不能把它們當成原命令已成功。重試前仍要確認原操作的狀態與副作用,不能只看延遲已經過。
DW0/DW1/Phase Tag前兩個 Dwords 的內容依命令解釋;Phase Tag 隨 CQ 回繞而變化。Create 成功時 DW0 可回 NSID;同一位置在另一種命令不一定有這種意義。
SQ
Submission Queue,主機放入命令的提交佇列。
來源:Base 2.4 §4.2.1 · Base 2.4 §4.2.3 · Base 2.4 §4.2.3.2 · Base 2.4 §4.2.3.3 · Base 2.4 §4.2.4

來源: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

Base Figure 97 · Common Completion Queue Entry Layout - Admin and All I/O Command Sets

一句話重點

Base97-1CQE 把命令結果、佇列資訊與識別碼組成完成紀錄。

來源:Base 2.4 §4.2.1

來源:NVME-BASE-2.4, Rev. 2.4, §4.2.1, Figure 97, 文件頁 144, PDF 頁 170

用例子讀懂

Base97-2先用 SQID 與 CID 找回原命令,再解 status 與命令專屬結果;DW0 並非每種命令都代表相同東西。

Base Figure 98 · Completion Queue Entry: DW 2

一句話重點

Base98-1CQE DW2 回報來源 SQ 與該 SQ 的 head 資訊。

來源:Base 2.4 §4.2.1

來源:NVME-BASE-2.4, Rev. 2.4, §4.2.1, Figure 98, 文件頁 144, PDF 頁 170

用例子讀懂

Base98-2SQID 指向 SQ2、SQHD 已前進時,主機可理解控制器消耗進度;它不表示其他所有命令都已完成。

Base Figure 99 · Completion Queue Entry: DW 3

一句話重點

Base99-1CQE DW3 同時帶有命令識別碼與完成狀態。

來源:Base 2.4 §4.2.1

來源:NVME-BASE-2.4, Rev. 2.4, §4.2.1, Figure 99, 文件頁 145, PDF 頁 171

用例子讀懂

Base99-2找到 CID 7 的回覆後,仍要讀 STATUS;識別到這筆命令並不等於它成功執行。

Base Figure 101 · Completion Queue Entry: Status Field

一句話重點

Base101-1Status 欄位必須把類型、代碼與附加控制資訊一起解釋。

來源:Base 2.4 §4.2.3

來源:NVME-BASE-2.4, Rev. 2.4, §4.2.3, Figure 101, 文件頁 145-146, PDF 頁 171-172

用例子讀懂

Base101-2相同 SC 數值搭配不同 SCT 可以有不同意思;DNR 也不能從 SC 名稱猜出,必須看實際 bit。

Base Figure 102 · Status Code - Status Code Type Values

一句話重點

Base102-1SCT 先把狀態分成通用、命令專屬等類別。

來源:Base 2.4 §4.2.3

來源:NVME-BASE-2.4, Rev. 2.4, §4.2.3, Figure 102, 文件頁 146, PDF 頁 172

用例子讀懂

Base102-2先看到 SCT=1,再去查命令專屬狀態;若忽略 SCT 直接在通用表找同值,可能得到錯誤原因。

Base Figure 103 · Status Code - Generic Command Status Values

一句話重點

Base103-1通用狀態表描述跨命令可出現的共同錯誤。

來源:Base 2.4 §4.2.3

來源:NVME-BASE-2.4, Rev. 2.4, §4.2.3, Figure 103, 文件頁 147-150, PDF 頁 173-176

用例子讀懂

Base103-2Invalid Field in Command 表示有欄位不符合要求,但哪個欄位仍須回到該命令定義,不是表格會直接告訴你修改哪個 byte。

Base Figure 104 · Status Code - Command Specific Status Values

一句話重點

Base104-1命令專屬狀態表必須和發出命令的種類連用。

來源:Base 2.4 §4.2.3.2

來源: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 範圍。

Base Figure 105 · Status Code - Command Specific Status Values, I/O Command Set Specific

一句話重點

Base105-1I/O Command Set 專屬狀態要再到相應命令集規格解釋。

來源:Base 2.4 §4.2.3.2

來源:NVME-BASE-2.4, Rev. 2.4, §4.2.3.2, Figure 105, 文件頁 152-153, PDF 頁 178-179

用例子讀懂

Base105-2Base 提供共用分類,NVM Command Set 補上資料操作的具體含義;兩份規格在這裡接續。

NVM
Non-Volatile Memory,斷電後仍能保存資料的記憶體。

Base Figure 107 · Status Code - Media and Data Integrity Error Values

一句話重點

Base107-1媒體與資料完整性狀態指出資料讀寫或檢查的結果。

來源:Base 2.4 §4.2.3.2

來源:NVME-BASE-2.4, Rev. 2.4, §4.2.3.2, Figure 107, 文件頁 154-155, PDF 頁 180-181

用例子讀懂

Base107-2Guard Check Error 與 Compare Failure 都與資料有關,但前者是保護檢查、後者是內容不符,不應用同一句「資料錯誤」帶過。

Guard
PI 的檢查值欄位;所選格式決定檢查值的寬度與計算方法。

Base Figure 108 · Status Code - Path Related Status Values

一句話重點

Base108-1路徑相關狀態描述透過目前控制器到資料的存取情況。

來源:Base 2.4 §4.2.3.3

來源:NVME-BASE-2.4, Rev. 2.4, §4.2.3.3, Figure 108, 文件頁 155, PDF 頁 181

用例子讀懂

Base108-2某條路徑不適合存取時,不一定表示 namespace 資料已損毀;要依狀態與可用路徑判斷。

Base Figure 109 · Phase Tag bit Transition Example

一句話重點

Base109-1Phase Tag 隨 CQ 繞回而改變,幫助辨識新完成項目。

來源:Base 2.4 §4.2.4

來源:NVME-BASE-2.4, Rev. 2.4, §4.2.4, Figure 109, 文件頁 156-157, PDF 頁 182-183

用例子讀懂

Base109-2主機把一輪 entries 讀完回到 slot 0 時,期待的 phase 已翻轉,因此舊 CQE 不會被再次當成新結果。

圖表組 03 · PRP 如何描述跨頁資料 · 4 張圖表

06.06.先算第一頁剩餘量,再算未覆蓋的資料長度,用這個結果選 PRP2 分支。沿 PRP List 圖中的箭頭辨認「清單所在頁」和「資料頁」,兩者的用途不同。

回到本節的解釋與範例

從第一個 page 的剩餘空間開始計算

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,不能只給一個下一頁。
清單串接與對齊清單中的頁位址及下一段清單各有對齊與最後項目的使用規則。不能把作為下一張清單指標的位置,又當成一頁實際資料。
來源:Base 2.4 §4.3.1

來源: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

Base Figure 110 · PRP Entry Layout

一句話重點

Base110-1PRP entry 是有固定位元配置的記憶體指標。

來源:Base 2.4 §4.3.1

來源:NVME-BASE-2.4, Rev. 2.4, §4.3.1, Figure 110, 文件頁 158, PDF 頁 184

用例子讀懂

Base110-2先按圖取出位址相關位元,再配合頁大小判斷它指向哪一頁;不能把 64-bit entry 當成資料長度。

Base Figure 111 · PRP Entry - Page Base Address and Offset

一句話重點

Base111-1PRP 的頁基底與頁內 offset 共同形成第一段資料位置。

來源:Base 2.4 §4.3.1

來源: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 由總長度決定。

Base Figure 112 · PRP List Layout for Physically Contiguous Memory Pages

一句話重點

Base112-1連續實體頁面仍可用 PRP List 逐頁描述。

來源:Base 2.4 §4.3.1

來源:NVME-BASE-2.4, Rev. 2.4, §4.3.1, Figure 112, 文件頁 159, PDF 頁 185

用例子讀懂

Base112-2三個資料頁位址相鄰,PRP entries 也各指一頁;連續排列不表示可以把三頁壓成一個只含長度的 PRP。

Base Figure 113 · PRP List Layout for Physically Non-Contiguous Memory Pages

一句話重點

Base113-1不連續實體頁面可由 PRP List 組成連續的傳輸資料。

來源:Base 2.4 §4.3.1

來源:NVME-BASE-2.4, Rev. 2.4, §4.3.1, Figure 113, 文件頁 159, PDF 頁 185

用例子讀懂

Base113-2第一頁在位址 A、第二頁在 B,主機資料順序由 list 順序決定,不要求 A 和 B 的實體位址相鄰。

圖表組 04 · SGL 的資料與串接描述子 · 10 張圖表

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 BucketSegment 與 Last Segment 表達清單串接,Bit Bucket 表達特定資料處理方式。遇到 Last Segment 就按最後一段的規則處理,不再假定有下一段指標。
來源:Base 2.4 §4.3.2 · Base 2.4 §4.3.2.1

來源: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

Base Figure 114 · SGL Validation Error Conditions

一句話重點

Base114-1SGL 錯誤條件涵蓋描述子格式與傳輸長度等不同問題。

來源:Base 2.4 §4.3.2

來源:NVME-BASE-2.4, Rev. 2.4, §4.3.2, Figure 114, 文件頁 161, PDF 頁 187

用例子讀懂

Base114-2描述子型別合法但總長度不足,與型別本身不受支援不同;先確定問題出在哪一層。

Base Figure 115 · SGL Segment

一句話重點

Base115-1SGL Segment 是一組描述子的容器。

來源:Base 2.4 §4.3.2

來源:NVME-BASE-2.4, Rev. 2.4, §4.3.2, Figure 115, 文件頁 161, PDF 頁 187

用例子讀懂

Base115-2一個 segment 裡可有多個 data descriptors,不能把 segment 的 byte 長度直接當成使用者資料長度。

Base Figure 116 · Generic SGL Descriptor Format

一句話重點

Base116-1Generic SGL Descriptor 固定型別欄位的位置。

來源:Base 2.4 §4.3.2

來源:NVME-BASE-2.4, Rev. 2.4, §4.3.2, Figure 116, 文件頁 161, PDF 頁 187

用例子讀懂

Base116-2先讀 SGLID 判斷 descriptor 類型,再解其餘 bytes;同一位置在資料描述子與 segment 描述子中指向不同對象。

Base Figure 117 · SGL Descriptor Type

一句話重點

Base117-1SGL Descriptor Type 決定這個項目描述資料還是另一組描述子。

來源:Base 2.4 §4.3.2

來源:NVME-BASE-2.4, Rev. 2.4, §4.3.2, Figure 117, 文件頁 161-162, PDF 頁 187-188

用例子讀懂

Base117-2Data Block 指向資料,Segment 指向描述子清單;把後者當成資料會把清單內容誤作使用者 payload。

Base Figure 118 · SGL Descriptor Sub Type Values

一句話重點

Base118-1Descriptor Subtype 進一步限定同一型別的解釋。

來源:Base 2.4 §4.3.2

來源:NVME-BASE-2.4, Rev. 2.4, §4.3.2, Figure 118, 文件頁 162, PDF 頁 188

用例子讀懂

Base118-2主型別相同仍要查看 subtype 是否適用於 PCIe 情境,不只比對 descriptor 第一層分類。

Base Figure 119 · SGL Data Block descriptor

一句話重點

Base119-1Data Block descriptor 用位址與長度描述一段資料。

來源:Base 2.4 §4.3.2

來源: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 依頁大小隱含覆蓋長度。

Base Figure 120 · SGL Bit Bucket descriptor

一句話重點

Base120-1Bit Bucket descriptor 表示資料流中要丟棄的部分。

來源:Base 2.4 §4.3.2

來源:NVME-BASE-2.4, Rev. 2.4, §4.3.2, Figure 120, 文件頁 163, PDF 頁 189

用例子讀懂

Base120-2只需保留某段 Read 資料時,可依允許規則讓不需要的部分進 bit bucket;LEN 仍要計入整筆資料流的覆蓋範圍。

Base Figure 121 · SGL Segment descriptor

一句話重點

Base121-1Segment descriptor 指向下一組 SGL 描述子。

來源:Base 2.4 §4.3.2

來源:NVME-BASE-2.4, Rev. 2.4, §4.3.2, Figure 121, 文件頁 163, PDF 頁 189

用例子讀懂

Base121-2LEN 描述下一組 descriptor 占用的 bytes,不能把它當成下一段使用者資料的 bytes。

Base Figure 122 · SGL Last Segment descriptor

一句話重點

Base122-1Last Segment descriptor 表示最後一組描述子的連結。

來源:Base 2.4 §4.3.2

來源:NVME-BASE-2.4, Rev. 2.4, §4.3.2, Figure 122, 文件頁 164, PDF 頁 190

用例子讀懂

Base122-2走到最後一組後應按此型別結束後續連結,不因 buffer 後面還有資料就繼續解成另一個 segment。

Base Figure 125 · SGL Read Example

一句話重點

Base125-1SGL Read 範例把多個 descriptor 串成一筆完整傳輸。

來源:Base 2.4 §4.3.2.1

來源:NVME-BASE-2.4, Rev. 2.4, §4.3.2.1, Figure 125, 文件頁 166, PDF 頁 192

用例子讀懂

Base125-2沿箭頭累計每段資料長度,遇到 segment 先走到描述子清單,遇到 data block 才累計使用者資料。

圖表組 05 · Feature 值、識別碼、清單與字串 · 16 張圖表

06.10.識別格式圖先看對象、寬度及字串填補規則。Controller List 依 NUMCIDS 讀有效項目;Namespace List 依自己的結構和零值規則讀取,不借用另一張清單的 header 格式。

回到本節的解釋與範例

先界定事件影響的範圍,再看狀態如何保留

06.11.Reset、shutdown、power cycle 與逾時偵測是不同事件。圖中的前後狀態要配合受影響的控制器或 subsystem 範圍閱讀。

一起判讀的欄位或標示如何共同決定操作或結果帶入情境後怎麼讀
Current/Saved/Default目前生效值、保存值與預設值有不同用途;事件發生後以適用的恢復規則決定 current。保存過某個值,仍需確認此次 reset 的範圍及功能規則,才能知道它是否成為目前值。
KATT/偵測時間Keep Alive 的計時與檢查時點共同決定何時察覺逾時。在兩次檢查之間錯過一次更新,實際偵測時間可能超過單一 KATT。
KATT
Keep Alive Timeout Total,controller 用於偵測逾時的總時間基準。
來源:Base 2.4 §4.4

來源: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

Base Figure 126 · Current Value after Reset with Scope of Entire NVM Subsystem

一句話重點

Base126-1整個 subsystem reset 後,Feature 目前值 依保存與預設規則恢復。

來源:Base 2.4 §4.4

來源:NVME-BASE-2.4, Rev. 2.4, §4.4, Figure 126, 文件頁 167, PDF 頁 193

用例子讀懂

Base126-2重設前暫時修改的 目前值 不一定保留;要看 保存值與預設值 的選擇條件,不能只讀重設前的值。

Base Figure 127 · Current Value after Reset with Scope of Subset of the NVM Subsystem

一句話重點

Base127-1只重設 subsystem 的部分範圍時,Feature 恢復行為可能不同。

來源:Base 2.4 §4.4

來源: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/IDASSOCUIDX 選清單項目,項目的識別關聯再決定 UUID 如何使用。UIDX=2 是選位置,不是把值 2 當成 128-bit UUID。
UIDX
UUID Index,指向 UUID List 位置的 index;0 表示未指定 UUID。
來源:Base 2.4 §4.5.1 · Base 2.4 §4.5.2 · Base 2.4 §4.5.3 · Base 2.4 §4.5.4 · Base 2.4 §4.5.5 · Base 2.4 §4.6.1 · Base 2.4 §4.6.2 · Base 2.4 §4.8

來源: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

Base Figure 128 · PCI Vendor ID (VID) and PCI Subsystem Vendor ID (SSVID)

一句話重點

Base128-1VID 與 SSVID 分別識別廠商與 subsystem 廠商。

來源:Base 2.4 §4.5.1

來源:NVME-BASE-2.4, Rev. 2.4, §4.5.1, Figure 128, 文件頁 169, PDF 頁 195

用例子讀懂

Base128-2兩台裝置 VID 相同,並不代表 SSVID 或產品配置相同;這些不是 namespace 的唯一識別碼。

Base Figure 129 · Serial Number (SN) and Model Number (MN)

一句話重點

Base129-1Serial Number 與 Model Number 是字元資料欄位。

來源:Base 2.4 §4.5.2

來源:NVME-BASE-2.4, Rev. 2.4, §4.5.2, Figure 129, 文件頁 170, PDF 頁 196

用例子讀懂

Base129-2顯示型號時依欄位長度及字元規則處理,不能把固定長度字串讀成一個整數。

Base Figure 130 · IEEE OUI Identifier (IEEE)

一句話重點

Base130-1IEEE OUI 提供識別碼中的組織分配部分。

來源:Base 2.4 §4.5.3

來源:NVME-BASE-2.4, Rev. 2.4, §4.5.3, Figure 130, 文件頁 170, PDF 頁 196

用例子讀懂

Base130-2相同 OUI 的不同裝置仍需要其他位元區分;OUI 本身不是完整裝置唯一識別碼。

Base Figure 131 · IEEE Extended Unique Identifier (EUI64), MA-L Format

一句話重點

Base131-1EUI64 的 MA-L 格式把組織與延伸識別部分分開。

來源:Base 2.4 §4.5.4

來源:NVME-BASE-2.4, Rev. 2.4, §4.5.4, Figure 131, 文件頁 170, PDF 頁 196

用例子讀懂

Base131-2先依圖切開組織部分及廠商分配部分,再理解完整 64-bit 識別碼;不把其中一半當成完整值。

Base Figure 132 · IEEE Extended Unique Identifier (EUI64), OUI Identifier

一句話重點

Base132-1OUI 在 EUI64 中有固定的分配位置。

來源:Base 2.4 §4.5.4

來源:NVME-BASE-2.4, Rev. 2.4, §4.5.4, Figure 132, 文件頁 170, PDF 頁 196

用例子讀懂

Base132-2比較兩個 EUI64 時,可先看 OUI 是否相同,再看其餘位元;OUI 相同不代表兩個 namespace 相同。

Base Figure 133 · IEEE Extended Unique Identifier (EUI64), Ext. ID (cont)

一句話重點

Base133-1延伸識別欄位補足 EUI64 的個別識別資訊。

來源:Base 2.4 §4.5.4

來源:NVME-BASE-2.4, Rev. 2.4, §4.5.4, Figure 133, 文件頁 170-171, PDF 頁 196-197

用例子讀懂

Base133-2同一組織分配的兩個 ID,可以只在延伸部分不同;比較時必須保留全部位元。

Base Figure 134 · MA-L similarity to WWN

一句話重點

Base134-1MA-L 與 WWN 的相似排列不表示它們可以直接互換。

WWN
World Wide Name,用於儲存與網路裝置識別的全域名稱格式。
來源:Base 2.4 §4.5.4

來源:NVME-BASE-2.4, Rev. 2.4, §4.5.4, Figure 134, 文件頁 171, PDF 頁 197

用例子讀懂

Base134-2看到相近的十六進位外觀時,仍先辨識格式與分配規則,不只按字串長度判斷識別碼種類。

Base Figure 135 · Namespace Globally Unique Identifier (NGUID)

一句話重點

Base135-1NGUID 提供 namespace 的全域識別資訊。

來源:Base 2.4 §4.5.5

來源:NVME-BASE-2.4, Rev. 2.4, §4.5.5, Figure 135, 文件頁 171, PDF 頁 197

用例子讀懂

Base135-2NSID 可能因配置而改變,辨識是否同一 namespace 時可以依支援情況使用 NGUID;兩者回答不同問題。

Base Figure 136 · Namespace Globally Unique Identifier (NGUID), OUI

一句話重點

Base136-1NGUID 的 OUI 與廠商部分有各自位置。

來源:Base 2.4 §4.5.5

來源:NVME-BASE-2.4, Rev. 2.4, §4.5.5, Figure 136, 文件頁 171, PDF 頁 197

用例子讀懂

Base136-2比較完整 NGUID 時,把組織部分與其餘識別資訊一起保留,不能只用 OUI 當資料庫唯一鍵。

Base Figure 137 · Namespace Globally Unique Identifier

一句話重點

Base137-1NGUID 的欄位排列需要按完整格式解釋。

來源:Base 2.4 §4.5.5

來源:NVME-BASE-2.4, Rev. 2.4, §4.5.5, Figure 137, 文件頁 171, PDF 頁 197

用例子讀懂

Base137-2讀出 128-bit 值後先維持原本 byte 順序,再按圖拆欄位,避免把一個合法 ID 顯示成另一種排列。

Base Figure 138 · Namespace Globally Unique Identifier (NGUID), NGUID similarity to WWN

一句話重點

Base138-1NGUID 與 WWN 的結構對照用來理解相似處與不同處。

來源:Base 2.4 §4.5.5

來源:NVME-BASE-2.4, Rev. 2.4, §4.5.5, Figure 138, 文件頁 171, PDF 頁 197

用例子讀懂

Base138-2把相似欄位並排看可以幫助定位,但格式標記和完整位元仍要保留,不用 WWN 的欄位解釋直接取代 NGUID。

Base Figure 139 · Controller List Format

一句話重點

Base139-1Controller List 先列數量,再列要操作的控制器識別碼。

來源:Base 2.4 §4.6.1

來源:NVME-BASE-2.4, Rev. 2.4, §4.6.1, Figure 139, 文件頁 172, PDF 頁 198

用例子讀懂

Base139-2Attach 到控制器 A 與 B 時,清單含 2 個 Controller IDs;命令 NSID 指 namespace,清單則指定哪些控制器。

Base Figure 140 · Namespace List Format

一句話重點

Base140-1Namespace List 是識別碼清單,不包含每個 namespace 的全部屬性。

來源:Base 2.4 §4.6.2

來源:NVME-BASE-2.4, Rev. 2.4, §4.6.2, Figure 140, 文件頁 172, PDF 頁 198

用例子讀懂

Base140-2從清單取得 NSID 3 後,還需相應 Identify 資料才能知道它的格式與容量。

Base Figure 142 · UTF-8 Input Processing

一句話重點

Base142-1UTF-8 輸入處理需要區分 byte 序列與字元。

來源:Base 2.4 §4.8

來源:NVME-BASE-2.4, Rev. 2.4, §4.8, Figure 142, 文件頁 175, PDF 頁 201

用例子讀懂

Base142-2一個中文字通常占多個 bytes;限制 byte 長度時,不能用相同數值當成可容納字元數,也不能截斷字元中間的 bytes。

學完後想一想

1. 2 個 SQ 都使用 CID=5,收到 completion 時該如何分辨命令?

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

2. CQE 的 Phase Tag 符合 host 期待值,是否表示命令成功?

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

3. PRP1 位於 page 中間時,為何跨頁後不能直接延續同一段實體地址?

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

4. 為何解讀 DPTR 前要先看 PSDT?

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