NVMe 管理與資料命令:沿著 Spec 講解

21 minute read

English

00.01.這份報告串起主機管理 SSD 與執行資料操作所需的介面:如何確認能力、調整運作方式、接收狀態,再把 Read/Write 等命令的範圍與完成保證講清楚。先看全貌,接著真的打開 Base 與 NVM Command Set,依頁碼往後讀。

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

這篇的主軸

01

認識裝置與可用能力

01-01Identify 是裝置及 namespace 的能力地圖;Log 補充狀態與變動。先知道查詢在問誰,才知道如何使用回覆。

namespace
namespace,主機透過 controller 存取的一份已格式化非揮發性容量。
02

安排命令與設定行為

02-01Features 設定行為,SQ/CQ 承接命令。維護時再依目的選動作:Create 與 Attach 分別建立空間及存取關係;Self-test、Telemetry、Sanitize 則各有作業狀態與結果。

CQ
Completion Queue,controller 放入完成結果的完成佇列。
SQ
Submission Queue,主機放入命令的提交佇列。
03

用資料流比較 I/O

03-01Read 取回資料,Write 送入資料,Compare 接收預期資料,Verify 不傳回一般資料,Copy 只傳來源描述子。用資料方向和結果比較八種命令。

04

判斷結果能保證什麼

04-01命令完成、立即中止、內容相同、持久保存與原子性是不同證據;用範圍、時間順序和格式條件界定每一種保證。

00.02.讀者已學過 OS 與 Computer Organization。本篇用 4096-byte LBA 的例子建立共同背景;實際裝置的大小仍須從 Identify 確認。本篇依主範圍納入 Self-test、namespace 操作、Boot、Telemetry 與 Sanitize 的相關介面。

LBA
Logical Block Address;以 logical block 為單位的地址。例如每 block 為 4096 bytes 時,LBA 2 的資料起點對應第 8192 byte。

把主軸連起來

00.03.學習時,把「能力 → 設定 → 操作 → 結果」連起來;正式開 Spec 報告時,則採「Base 5 → Base 7 → NVM 指定章節」的順序。兩種順序解決不同需求:先建立理解,再減少翻頁。

00.04.Base 和 NVM 的共同介面與專屬定義不用每次來回找。例如先在 Base 說明 Format 範圍,等讀到 NVM 時再補 PIL/PI/MSET。先前留下的問題在 NVM 段集中回答,全程只切換一次文件。

PI
Protection Information;用 Guard 與 tags 檢查資料及其關聯資訊的保護欄位。

開著 Spec 的報告路徑

R-1先開 Base 2.4 PDF,從檢視器的第 202 頁開始。完成 B22 後,再切換 NVM Command Set 1.3 PDF 的第 27 頁。表中使用檢視器的 PDF 頁數,不是印在頁面下方或目錄中的數字。

打開的檔案頁碼對照
NVM-Express-Base-Specification-Revision-2.4-Ratified-2026.07.31.pdfPDF 頁 = 正文印刷頁 + 26;以本表實際位置為準。
NVM-Express-NVM-Command-Set-Specification-Revision-1.3-Ratified-2026.07.31.pdfPDF 頁與印刷頁相同。

R-2每站先跳到「起點」的章節標題,按順序往下讀,到列出的停止標題前停下。起點或停止點可能在頁面中段,因此不以整頁作為納入範圍。§5.2.13.2 沒有需要另講的 PCIe Log 定義;§5.2.14.3 的子項已全部排除,兩處不另外停留。

PCIe
PCI Express,NVMe memory-based controller 使用的 transport 與裝置互連。

先讀 Base 2.4:B01–B22

站點起點(PDF 頁/章節)這一段怎麼講停止位置
B01202
§5
Admin opcode、資料方向與 NSID;Figure 144 同時比較 Format 與 Sanitize 各狀態下的命令限制。PDF 205
§5.1.2 標題前
B02207
§5.2
Abort:目標與 IANP → AER:完成格式、事件型別、事件參數。PDF 217
§5.2.3 標題前
B03225
§5.2.6
Device Self-test:NSID 與 STC → 作業互動 → 完成狀態。先提醒啟動命令成功不等於背景測試完成,稍後在 LID 06h 看紀錄。PDF 227
§5.2.7 標題前
B04228
§5.2.9
Firmware Commit → Image Download → Format → Get Features → Get Log Page 共同格式 → LID 00h–08h。LID 06h 接回 Self-test;07h/08h 用同一張 block 範圍圖說明 Telemetry。PDF 263
§5.2.13.1.10 標題前
B05302
§5.2.13.1.18
LID 12h:依 FID 索引,區分支援、scope 與內容/能力變動;不展開排除 FID。PDF 304
§5.2.13.1.19 標題前
B06309
§5.2.13.1.21
Boot Partition LID 15h:BPID 選對象,16-byte header 與映像資料分開,LPO 用 Log 起點計算。PDF 310
§5.2.13.1.22 標題前
B07327
§5.2.13.1.33
LID 24h:只讀預設配置狀態及其支援條件,不進入還原配置流程。PDF 328
§5.2.13.1.34 標題前
B08339
§5.2.13.1.38
Sanitize Status LID 81h:先看 SSTAT,再看有效的 SPROG、action 資訊及估計時間;把命令接受與最終結果分開。PDF 345
§5.2.13.2 標題前
B09362
§5.2.13.4
先讀 Get Log Page completion,再讀 Identify 請求。CNS 01h 長表分組講,接著依原順序讀 02h、03h、04h、05h、06h、07h、08h、10h、11h、12h、13h、16h。PDF 421
§5.2.14.2.14 標題前
B10422
§5.2.14.2.15
CNS 18h、19h、1Ah、1Bh、1Ch、1Dh、1Fh、20h:資源與格式清單。以 CNSSID 起始索引、GENCTR 與最多 12 筆項目示範 Underlying Namespace 列舉。PDF 427
§5.2.14.2.23 標題前
B11431
§5.2.14.5
Identify 的共同完成行為;接著順向跳到 Namespace Attachment。PDF 431
§5.2.15 標題前
B12470
§5.2.24
Namespace Attachment → Management → Sanitize。先比較附加關係和儲存物件,再用 SEL/CSI/回傳 NSID 讀 Management;Sanitize 的 SANACT 和 Overwrite 欄位接回先前 LID 81h 的狀態。PDF 478
§5.2.27 標題前
B13480
§5.2.28
Security Receive → Send → Set Features 共同規則 → FID 01h、02h、04h、06h、07h、0Bh、0Ch、0Eh。PDF 497
§5.2.30.1.9 標題前
B14497
§5.2.30.1.10
FID 10h 與 11h:熱管理界線、非 operational 狀態的背景活動。PDF 499
§5.2.30.1.12 標題前
B15503
§5.2.30.1.16
Sanitize Config FID 17h:用 NDI=1、NDAS=1 的例子比較 NODRM=0 的拒絕與 NODRM=1 的警告處理。PDF 504
§5.2.30.1.17 標題前
B16504
§5.2.30.1.18
FID 19h:Set 選組合索引,Get 回目前索引;對回稍早 Identify 的命令集 vector。PDF 505
§5.2.30.1.19 標題前
B17534
§5.2.30.1.34
FID 80h:PBSLC 的 pre-boot software load count,不解成進度百分比。PDF 534
§5.2.30.1.35 標題前
B18539
§5.2.30.1.39
Boot Write Protection FID 85h 的 Set/Get 狀態 → PCIe 中斷 FID 08h/09h → HMB FID 0Dh。同頁的章節界線須辨清。PDF 545
§5.2.30.3 標題前
B19545
§5.2.30.4
在同一頁略過 §5.2.30.3,直接讀 §5.2.30.4 的 Set Features completion。PDF 546
§5.2.31 標題前
B20553
§5.3
Create CQ → Create SQ → Delete CQ → Delete SQ;頁面依此順序,但實際刪除先 SQ 後 CQ。PDF 558
§5.3.5 標題前
B21590
§7
第 7 章 opcode 表只讀 Flush 列;同頁 Cancel 開始處停下。PDF 590
§7.1 標題前
B22593
§7.2
從頁面中的 §7.2 開始,讀 Flush 時間界線、VWC.FB、cache 不存在或未啟用時的行為。然後關閉 Base 的報告段落。PDF 594
§7.3 標題前

只切換這一次:NVM Command Set 1.3,N01–N07

站點起點(PDF 頁/章節)這一段怎麼講停止位置
N0127
§3.3.1
Compare → Copy → Dataset Management → Read → Verify → Write → Write Uncorrectable → Write Zeroes。先比較要提供什麼,再讀每筆命令欄位與結果。PDF 62
§4 標題前
N0262
§4.1.1
NVM 的 AER Notice 與 Format 專屬欄位,補回前面 Base 留下的共同位置。PDF 63
§4.1.3 標題前
N0364
§4.1.3.1
NVM Power Management 補充 → LBA Range Type。PDF 66
§4.1.3.3 標題前
N0466
§4.1.3.4
在同頁跳過 Error Recovery,從 Write Atomicity Normal 的 DN 開始。PDF 67
§4.1.3.5 標題前
N0576
§4.1.4.1
同頁只讀 Error Information 與 SMART/Health 兩節;不要繼續到 Device Self-test。PDF 76
§4.1.4.3 標題前
N0683
§4.1.5
依序讀 NVM Identify 各 CNS:容量與基本格式 → controller 能力 → 延伸 namespace 格式 →命令限制 →格式查詢及粒度。PDF 110
§4.1.6 標題前
N07160
§5.6
LBA Format List 的布局與 CNS 適用表;用同一個 Format Index 把整份 I/O 例子串起來。PDF 162
§5.7 標題前

R-3有些共用表格列出已排除的功能。本次不朗讀那些功能列,也不跟進其設定章節;但保留命令本身的欄位,仍要解釋其單位與有效條件。例如 AER 的事件參數照 §5.2.2 判讀,不因此加入電壓或資料佇列 Feature 的配置。

AER
Asynchronous Event Request;主機預先提交,讓控制器日後以命令完成回報事件的 NVMe Admin 命令。
核對本篇的納入與排除清單
範圍項目內容
主範圍Base 第 5、7 章扣除下列項目;NVM 只納入明列小節及其子節。
NVM3.3.1, 3.3.2, 3.3.3, 3.3.4, 3.3.5, 3.3.6, 3.3.7, 3.3.8, 4.1.1, 4.1.2, 4.1.3.1, 4.1.3.2, 4.1.3.4, 4.1.4.1, 4.1.4.2, 4.1.5, 5.6
Base 排除章節5.1.2, 5.2.3, 5.2.4, 5.2.5, 5.2.7, 5.2.8, 5.2.13.3, 5.2.14.4, 5.2.15, 5.2.16, 5.2.17, 5.2.18, 5.2.19, 5.2.20, 5.2.21, 5.2.22, 5.2.23, 5.2.27, 5.2.30.3, 5.2.31, 5.2.32, 5.3.5, 5.3.6, 5.4, 7.1, 7.3, 7.4, 7.5, 7.6, 7.7, 7.8
保留 FID01h, 02h, 03h, 04h, 06h, 07h, 08h, 09h, 0Ah, 0Bh, 0Ch, 0Dh, 0Eh, 10h, 11h, 17h, 19h, 80h, 85h
保留 LID00h, 01h, 02h, 03h, 04h, 05h, 06h, 07h, 08h, 12h, 15h, 24h, 81h
保留 CNS00h, 01h, 02h, 03h, 04h, 05h, 06h, 07h, 08h, 09h, 0Ah, 10h, 11h, 12h, 13h, 16h, 18h, 19h, 1Ah, 1Bh, 1Ch, 1Dh, 1Fh, 20h
排除 FID0Fh, 12h, 13h, 14h, 16h, 18h, 1Ah, 1Bh, 1Dh, 1Eh, 1Fh, 21h, 22h, 23h, 24h, 25h, 26h, 27h, 78h, 79h, 7Dh, 7Eh, 7Fh, 81h, 82h, 83h, 84h
排除 LID09h, 0Ah, 0Bh, 0Ch, 0Dh, 0Fh, 10h, 11h, 13h, 14h, 16h, 17h, 18h, 1Ah, 1Bh, 1Ch, 1Dh, 20h, 21h, 22h, 23h, 25h, 27h, 7Fh, 80h
排除 CNS14h, 15h, 17h, 21h, 22h
CNS
Controller or Namespace Structure;Identify 命令用來選擇回傳資料結構的欄位。
FID
Feature Identifier;指定要讀取或設定哪一項 Feature 的編號。
LID
Log Page Identifier;指定要讀取哪一種 log page 的編號。

01 先分清管理命令與資料命令

命令主機提供什麼SSD 處理什麼/主機得到什麼
ReadLBA 範圍及接收 buffer讀取內容,將資料傳回主機。
WriteLBA 範圍及要寫入的資料把資料寫入指定範圍。
CompareLBA 範圍及預期資料比對儲存內容;回報相同或 Compare Failure。
VerifyLBA 範圍與檢查選項執行驗證,沒有一般 Read 的資料回傳。
Copy來源範圍描述子與目的起點在裝置內複製資料,主機不搬送整段內容。
Dataset Management範圍描述子與屬性提供使用提示或要求解除配置;不是寫入零值。
Write UncorrectableLBA 範圍標記不可更正條件;後續存取依規格回報錯誤。
Write ZeroesLBA 範圍與控制選項依零值/解除配置條件處理,不需傳送一般資料 payload。
先以資料方向與問題比較 8 種命令,再到後文讀各自條件。來源:NVM 1.3 §3.3.1–3.3.8。

01.01.Admin 命令建立及調整控制器的工作環境;I/O 命令處理 namespace 的資料。Opcode 要連同命令集解讀,命令支援與目前是否允許執行也要分開確認。

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

來源:NVME-BASE-2.4, Rev. 2.4, §5, 5.1.1, 文件頁 176-178, PDF 頁 202-204

02 Abort:要求中止與確認中止是兩件事

02.01.Abort 用 SQID 與 CID 指定原命令。Abort 的成功 CQE 不保證原命令已立即中止;IANP 和原命令的 CQE 必須分別判讀。

IANP
Immediate Abort Not Performed;1 表示沒有執行立即中止,0 表示已執行。
SQID
Submission Queue Identifier,辨識 command 所屬 SQ 的數值。
CID
Command Identifier,與 SQ identifier 合用以辨識 outstanding command。
CQE
Completion Queue Entry,CQ 中的一筆完成結果資料結構。
來源:Base 2.4 §5.2.1

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.1, 文件頁 181-182, PDF 頁 207-208

03 AER:讓事件找到接收它的主機

一般事件:通知與取得完整紀錄分兩步
  1. 主機先提交 AER,讓控制器保有可完成的要求。
  2. 事件發生:控制器完成 AER,帶回 AET/AEI/LID。
  3. 主機讀相應 Log,確認事件內容與有效欄位。
  4. 依事件規則清除通知,並維持需要的 outstanding AER。
這條流程適用於相應的一般事件;Immediate 與 One Shot 的例外在正文分開說明。
AEI
Asynchronous Event Information;由 AET 選定的事件類型決定此值的意義。
AET
Asynchronous Event Type;先選事件類型,再在該類型內解讀事件資訊。

03.01.主機先提交 Asynchronous Event Request,控制器再以完成這筆命令的方式回報事件。事件類型、事件資訊、相關 LID 與 Event Specific Parameter 共同決定後續該讀什麼。

來源:Base 2.4 §5.2.2

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.2, 文件頁 183-191, PDF 頁 209-217

04 Firmware:先看啟用選擇,再看映像怎麼送入

下載、保存與啟用分別改變什麼
  1. Firmware Image Download:傳送映像的各個片段。
  2. Firmware Commit:依 CA 選擇保存至 slot 與啟用方式。
  3. 需要 reset 的啟用:在指定 reset 發生後切換執行版本。
  4. Firmware Slot Information:分開查看目前執行 slot 與下次預定 slot。
下載完成、映像已保存、版本正在執行,是不同狀態。
CA
Commit Action,Firmware Commit 中選擇 replace、activate 與 reset policy 的欄位。

04.01.Firmware Image Download 傳送映像片段;Firmware Commit 依 CA 與 FS 決定保存及啟用。實際執行是先 Download 再 Commit,Spec 的編排則先介紹 Commit。

FS
Firmware Slot,Firmware Commit 中選擇目標 slot 的欄位。
來源:Base 2.4 §5.2.9, 5.2.10

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.9, 5.2.10, 文件頁 202-206, PDF 頁 228-232

05 Format:先決定影響誰,再決定新格式

05.01.Format NVM 可變更媒體格式,也可依 SES 要求 secure erase。SES 決定要用 FNS 還是 SENS 判讀範圍;NSID 與 FNVMBS 再決定指定 namespace 或 broadcast 的行為。

NSID
Namespace Identifier;識別命令作用的 namespace。
來源:Base 2.4 §5.2.11

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.11, 文件頁 206-209, PDF 頁 232-235

06 Log:先定位紀錄,再解讀紀錄裡的證據

06.01.本單元整理 LID 00h、01h、02h、03h、04h、05h、12h、24h;06h、07h、08h、15h、81h 配合相應作業另行教學。Get Log Page 的長度、位移與事件保留是共同機制;各 Log 的範圍、單位與有效條件由其資料結構決定。

來源:Base 2.4 §5.2.13, 5.2.13.1.1–5.2.13.1.6, 5.2.13.1.18, 5.2.13.1.33, 5.2.13.2, 5.2.13.4

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13, 5.2.13.1.1–5.2.13.1.6, 5.2.13.1.18, 5.2.13.1.33, 5.2.13.2, 5.2.13.4, 文件頁 212-229,276-278,301-302,319,336, PDF 頁 238-255,302-304,327-328,345,362

07 Identify:建立控制器、namespace 與能力的地圖

07.01.Identify 通常回傳 4096-byte 結構;CNS 選結構,CSI 選命令集,NSID、CNTID 或 CNS-specific identifier 決定查詢對象。這幾個選擇值不能互相代替。

CSI
I/O Command Set Identifier;選擇 I/O 命令集,NVM Command Set 使用 00h。
來源:Base 2.4 §5.2.14.1, 5.2.14.2, 5.2.14.5

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.14.1, 5.2.14.2, 5.2.14.5, 文件頁 336-405, PDF 頁 362-431

08 Security Send/Receive:協定資料的傳遞介面

08.01.Security Send 把安全協定資料送入控制器;Security Receive 取得相應結果。SECP 選協定,SPSP 與 NSSF 的意義由該協定決定,NVMe 命令成功不等於協定內每一步都已成功。

NVMe
Non-Volatile Memory Express,主機與非揮發性記憶體子系統之間的介面規範家族。
來源:Base 2.4 §5.2.28, 5.2.29

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.28, 5.2.29, 文件頁 454-456, PDF 頁 480-482

09 Set Features:把設定連到佇列、事件與電源行為

閒置時間如何影響功耗狀態
  1. Host 設定 APST entries 的閒置時間 ITPT 與目標狀態 ITPS。
  2. 啟用 APST 後,controller 依閒置計時判斷轉移。
  3. 到達適用門檻後,進入指定 non-operational power state。
  4. 恢復處理 I/O 前,需要計入離開該狀態的延遲。
APST 以閒置時間換取節能,同時引入狀態轉移延遲。
controller
controller,實作 NVMe 介面、取走 command 並回報 completion 的控制實體。
APST
Autonomous Power State Transition;依設定的閒置條件自動轉換電源狀態。
Host
主機;執行作業系統並送出 NVMe 命令的一端。
ITPS
Idle Transition Power State,APST entry 選擇的目標 non-operational power state。
ITPT
Idle Time Prior to Transition,APST entry 的 idle threshold,單位為 milliseconds。

09.01.Set Features 的 FID 選功能,SV 要求保存,命令專屬欄位或 buffer 承載設定。每個功能有各自的作用範圍、可變更條件與重設行為,不能只照同一種設定值模型解讀。

SV
Save,Set Features 要求 controller 同時保存所設定 value 的 bit。
來源:Base 2.4 §5.2.30.1, 5.2.30.4

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.1, 5.2.30.4, 文件頁 456-514,519, PDF 頁 482-540,545

10 I/O 佇列:先建立完成端,再接上提交端

用引用關係決定操作順序
  1. 先用 Number of Queues 協商可用數量。
  2. 建立 CQ 2,再建立指向 CQ 2 的 SQ 3、SQ 4。
  3. 正常命令的完成項目寫到 CQ 2。
  4. 移除時先刪 SQ 3、SQ 4,再刪 CQ 2。
Spec 先列 Delete CQ 再列 Delete SQ,是文件編排;實際移除仍須先消除 SQ 引用。

10.01.Create I/O SQ 以 CQID 指向已存在的 I/O CQ,因此通常先建立 CQ 再建立 SQ。刪除時先移除引用該 CQ 的 SQ;數量配置、佇列建立與正常送命令是不同步驟。

來源:Base 2.4 §5.3.1–5.3.4

來源:NVME-BASE-2.4, Rev. 2.4, §5.3.1–5.3.4, 文件頁 527-532, PDF 頁 553-558

11 Flush:用完成界線說明持久保存

Write A 的持久保存界線已完成的 A 被後續 Flush 涵蓋;與 Flush 同時仍在執行的 B,不能只靠這次 Flush 判定已持久保存。Write ACQE 已完成Flush主機提交FlushCQE 成功Write B:提交 Flush 時仍未完成
已完成的 A 被後續 Flush 涵蓋;與 Flush 同時仍在執行的 B,不能只靠這次 Flush 判定已持久保存。

11.01.Flush 要求指定 namespace 的資料及 metadata 提交至 non-volatile media。它至少涵蓋在 Flush 提交前已完成的命令;同時仍在執行的 Write 不可自動視為被納入。

metadata
隨 logical block 儲存的附加資料,可包含資料保護資訊,也可有其他用途。
來源:Base 2.4 §7, 7.2

來源:NVME-BASE-2.4, Rev. 2.4, §7, 7.2, 文件頁 564,567, PDF 頁 590,593

12 Copy:主機傳描述子,控制器搬資料

兩個來源範圍接成一段目的範圍說明性範例:4 blocks 接 6 blocks。目的起點為 1000,第二段必須接在 1004;主機傳的是兩筆描述子,NR=1。來源 A:4 blocks來源 B:6 blocks1000–10031004–1009
說明性範例:4 blocks 接 6 blocks。目的起點為 1000,第二段必須接在 1004;主機傳的是兩筆描述子,NR=1。

12.01.Copy 的 DPTR 指向來源範圍描述子,目的位置由命令指定。描述子格式、來源與目的格式的對應、MSRC/MSSRL/MCL 及完成回覆共同限制一次操作。

DPTR
Data Pointer,SQE 中指出 command data buffer 的欄位。
來源:NVM Command Set 1.3 §3.3.2

來源:NVME-NVM-CS-1.3, Rev. 1.3, §3.3.2, 文件頁 30-43, PDF 頁 30-43

13 Read:把範圍、格式與主機 buffer 接起來

13.01.Read 用 SLBA 和 NLB 選 namespace 內的範圍,再依資料格式、metadata 配置及檢查設定把內容送入主機 buffer。命令欄位中的 block 數與 byte 數需要透過目前格式換算。

SLBA
Starting LBA;指定命令範圍的起點。
來源:NVM Command Set 1.3 §3.3.4

來源:NVME-NVM-CS-1.3, Rev. 1.3, §3.3.4, 文件頁 48-51, PDF 頁 48-51

14 Write:寫入內容、持久性與原子性分開看

14.01.Write 把主機提供的資料寫入指定 LBA 範圍。FUA、volatile write cache、原子寫入限制及 PI 檢查回答不同問題;單筆命令成功不能自動推論所有可能的持久性與原子性保證。

FUA
Force Unit Access;其效果由命令定義。對 Write 而言,要求資料與 metadata 提交至非揮發性媒體後才完成。
來源:NVM Command Set 1.3 §3.3.6

來源:NVME-NVM-CS-1.3, Rev. 1.3, §3.3.6, 文件頁 53-56, PDF 頁 53-56

15 NVM Identify:用格式與上限驗算一筆 I/O

15.01.NVM Identify 補上 namespace 容量、LBA 格式、metadata/PI、原子性和命令限制。CNS、CSI、NSID 與 Format Index 的組合決定查目前 namespace,或查某個支援格式。

Format Index
格式索引;用來選取一組 LBAF/ELBAF 格式資訊的編號。
index
index;用來選取清單中的項目或格式。它回答「選哪一項」,不是「離起點多遠」。
來源:NVM Command Set 1.3 §4.1.5

來源:NVME-NVM-CS-1.3, Rev. 1.3, §4.1.5, 文件頁 83-110, PDF 頁 83-110

16 Device Self-test:從啟動要求到檢查結果

16.01.Device Self-test 的命令完成表示已處理啟動或中止要求;背景作業進度與結果要從 LID 06h 分別讀取。STC 選動作,NSID 選測試對象,結果欄位的有效旗標決定哪些資訊可用。

LID 06h
Device Self-test Log Page 的 identifier 06h;同時包含 current operation 與 20 筆歷史結果。
STC
此縮寫有多種用途:I/O 的 Storage Tag Check 控制保護檢查;Device Self-test 命令的 Self-test Code 選測試動作;Self-test 結果的 Status Code 則補充失敗狀態。先看所在結構,再解讀數值。
來源:Base 2.4 §5.2.6, 5.2.13.1.7

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.6, 5.2.13.1.7, 文件頁 199-201,230-232, PDF 頁 225-227,256-258

17 Namespace:建立儲存空間,再建立存取關係

17.01.Namespace Management 建立或刪除 namespace;Namespace Attachment 改變 controller 與 namespace 的連接關係。Create 成功回傳 NSID,不代表已附加;Detach 移除存取關係,不等於刪除資料對象。

來源:Base 2.4 §5.2.24, 5.2.25

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.24, 5.2.25, 文件頁 445-448, PDF 頁 471-474

18 Boot Partition:讀映像、寫映像與切換啟動來源

18.01.Boot Partition 與一般 namespace 是不同對象。LID 15h 讀取所選 partition 的資訊與內容;Firmware Commit CA=6 寫入映像、CA=7 選啟動來源;FID 85h 管理寫入保護。

來源:Base 2.4 §5.2.9, 5.2.13.1.21, 5.2.30.1.39

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.9, 5.2.13.1.21, 5.2.30.1.39, 文件頁 202-204,283-284,513-514, PDF 頁 228-230,309-310,539-540

19 Telemetry:完整取得同一次診斷資料

19.01.LID 07h 由主機要求建立 Telemetry,LID 08h 回報控制器建立的資料。讀取時要同時處理 512-byte block 邊界、累積 Data Area 範圍與 generation,避免拼接不同次擷取。

來源:Base 2.4 §5.2.13.1.8, 5.2.13.1.9

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.8, 5.2.13.1.9, 文件頁 232-237, PDF 頁 258-263

20 Sanitize:清除要求、背景進度與最終狀態

20.01.Sanitize 依支援能力選 Block Erase、Overwrite 或 Crypto Erase;命令成功不表示背景清除已完成。LID 81h 回報狀態、進度與估計時間;FID 17h 的設定會影響要求不解除配置時的處理方式。

來源:Base 2.4 §5.1.1, 5.2.26, 5.2.13.1.38, 5.2.30.1.16

來源:NVME-BASE-2.4, Rev. 2.4, §5.1.1, 5.2.26, 5.2.13.1.38, 5.2.30.1.16, 文件頁 178-179,314-319,449-451,477-478, PDF 頁 204-205,340-345,475-477,503-504

接著打開 Spec 看什麼

21.01.正式報告時使用開頭的 B01–B22、N01–N07 順向路徑;以下僅供按觀念查找,不需要逐列重新翻一次 Spec。

要說明的觀念Spec 閱讀位置
先分清管理命令與資料命令Base 2.4 §5, 5.1.1
Abort:要求中止與確認中止是兩件事Base 2.4 §5.2.1
AER:讓事件找到接收它的主機Base 2.4 §5.2.2
Firmware:先看啟用選擇,再看映像怎麼送入Base 2.4 §5.2.9, 5.2.10
Format:先決定影響誰,再決定新格式Base 2.4 §5.2.11
Get Features:查目前值、預設值或支援能力Base 2.4 §5.2.12
Log:先定位紀錄,再解讀紀錄裡的證據Base 2.4 §5.2.13, 5.2.13.1.1–5.2.13.1.6, 5.2.13.1.18, 5.2.13.1.33, 5.2.13.2, 5.2.13.4
Identify:建立控制器、namespace 與能力的地圖Base 2.4 §5.2.14.1, 5.2.14.2, 5.2.14.5
Security Send/Receive:協定資料的傳遞介面Base 2.4 §5.2.28, 5.2.29
Set Features:把設定連到佇列、事件與電源行為Base 2.4 §5.2.30.1, 5.2.30.4
PCIe 功能:中斷通知與借出的主機記憶體Base 2.4 §5.2.30.2
I/O 佇列:先建立完成端,再接上提交端Base 2.4 §5.3.1–5.3.4
Flush:用完成界線說明持久保存Base 2.4 §7, 7.2
Compare:把主機提供的內容拿來比對NVM 1.3 §3.3.1
Copy:主機傳描述子,控制器搬資料NVM 1.3 §3.3.2
Dataset Management:描述資料用途與解除配置NVM 1.3 §3.3.3
Read:把範圍、格式與主機 buffer 接起來NVM 1.3 §3.3.4
Verify:檢查可讀性,沒有主機比對資料NVM 1.3 §3.3.5
Write:寫入內容、持久性與原子性分開看NVM 1.3 §3.3.6
Write Uncorrectable 與 Write Zeroes:兩種不同結果NVM 1.3 §3.3.7, 3.3.8
NVM 補充:同一個 Admin 命令的資料語意NVM 1.3 §4.1.1, 4.1.2
NVM 功能補充:閒置退出延遲、LBA 用途與原子性NVM 1.3 §4.1.3.1, 4.1.3.2, 4.1.3.4
NVM Log 補充:把數值換回資料範圍與計數NVM 1.3 §4.1.4.1, 4.1.4.2
NVM Identify:用格式與上限驗算一筆 I/ONVM 1.3 §4.1.5
LBA Format List:選定同一筆格式才能配對能力NVM 1.3 §5.6
Device Self-test:從啟動要求到檢查結果Base 2.4 §5.2.6, 5.2.13.1.7
Namespace:建立儲存空間,再建立存取關係Base 2.4 §5.2.24, 5.2.25
Boot Partition:讀映像、寫映像與切換啟動來源Base 2.4 §5.2.9, 5.2.13.1.21, 5.2.30.1.39
Telemetry:完整取得同一次診斷資料Base 2.4 §5.2.13.1.8, 5.2.13.1.9
Sanitize:清除要求、背景進度與最終狀態Base 2.4 §5.1.1, 5.2.26, 5.2.13.1.38, 5.2.30.1.16
開啟完整中文教學與逐圖解釋 →

學完後想一想

1. Abort 的 status 成功,但 IANP=1,可以立即收回原命令的 buffer 嗎?

22.01.不能只根據這筆 Abort 回覆作決定。IANP=1 沒有立即中止保證,必須確認原命令最終完成與其記憶體使用已結束。

來源

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.1, 文件頁 181-182, PDF 頁 207-208

2. 8 blocks 的 Read 與 8 blocks 的 DSM 範圍,長度欄位應各填多少?

22.02.Read 的 NLB 填 7;DSM 範圍描述子的 LLB 填 8。兩者不是同一個欄位,外層 DSM 的 NR 還另外表示描述子數減 1。

來源

來源:NVME-NVM-CS-1.3, Rev. 1.3, §3.3.4, 文件頁 48-51, PDF 頁 48-51

來源:NVME-NVM-CS-1.3, Rev. 1.3, §3.3.3, 文件頁 44-48, PDF 頁 44-48

3. Format 指定 NSID=3,為什麼還可能影響其他 namespaces?

22.03.還必須檢查 SES 選出的 FNS 或 SENS 分支。scope bit 若指定整體範圍,單看 NSID 不能縮小該命令的效果。

來源

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.11, 文件頁 206-209, PDF 頁 232-235

4. 刪除共用 CQ 前,為什麼不能只確認它現在是空的?

22.04.空佇列只描述目前沒有待消費的完成項目,不代表沒有 SQ 引用。先移除那些 SQ 並遵守完成及記憶體生命週期條件,再刪 CQ。

來源

來源:NVME-BASE-2.4, Rev. 2.4, §5.3.1–5.3.4, 文件頁 527-532, PDF 頁 553-558

5. Write A 尚未完成就提交 Flush,只等到 Flush 成功,能證明 A 已持久保存嗎?

22.05.不能。保證集合至少包含 Flush 提交前已完成的命令;若要把 A 納入保證,主機先建立 A 已完成再提交 Flush 的順序。

來源

來源:NVME-BASE-2.4, Rev. 2.4, §7, 7.2, 文件頁 564,567, PDF 頁 590,593

來源:NVME-NVM-CS-1.3, Rev. 1.3, §3.3.6, 文件頁 53-56, PDF 頁 53-56

採用的規格版本

NVM Express Base Specification, Revision 2.4

NVM Express NVM Command Set Specification, Revision 1.3

Jia-Chang

Jia-Chang

Human

Comments

  Write a comment ...