NVMe Base 2.4 第 1、2 章:規格語言、PCIe 佇列與儲存模型
00.01.NVMe 是主機與儲存控制器之間的介面。本篇先建立整體關係:主機如何送出命令、控制器如何回報結果,以及 namespace、controller、NVM subsystem 各代表什麼。這些概念是閱讀後續命令與欄位的起點。
- NVM subsystem
- NVM subsystem,包含 controller、port、namespace 與非揮發性儲存資源的 NVMe 系統邊界。
- controller
- controller,實作 NVMe 介面、取走 command 並回報 completion 的控制實體。
- namespace
- namespace,主機透過 controller 存取的一份已格式化非揮發性容量。
- NVMe
- Non-Volatile Memory Express,主機與非揮發性記憶體子系統之間的介面規範家族。
- NVM
- Non-Volatile Memory,斷電後仍能保存資料的記憶體。
這篇的主軸
規格如何分工
01-01分辨 Base、Transport 與 I/O Command Set 各自定義的內容。
- I/O
- Input/Output,對 namespace 執行資料輸入與輸出的操作類別。
命令如何往返
02-01以提交佇列與完成佇列理解主機和控制器的合作。
儲存物件與路徑
03-01分清 namespace、controller 與 subsystem,並理解多條存取路徑。
00.02.這裡的主機包含作業系統與驅動程式;控制器提供主機可存取的 NVMe 介面。NVMe 描述主機可見的行為,不能直接等同 SSD 內部 NAND 的實體配置。
把主軸連起來
00.03.先用主機、控制器及 namespace 建立整體關係,再跟著一筆命令看提交與完成。規格分工告訴我們這些關係分別由哪份文件定義,數值與單位則是讀懂後續欄位的共同工具。
00.04.閱讀後應能畫出主機到儲存空間的路徑,說明命令與資料各放在哪裡,並分辨同一份儲存空間的多條路徑和多個主機的共享。這些基本概念會在後續各篇的具體機制中再次被使用。
01 Base、Command Set 與 Transport 的分工
01.01.遇到一個 command、register 或資料格式時,第一個問題不是『它在哪一頁』,而是『哪一份規格擁有這個定義』。Base 提供通用協定,Transport 補上 PCIe 綁定,I/O Command Set 再定義 namespace 資料操作。Figure 1 的框線代表適用關係,不代表封包一定逐層穿過這些方塊。
- PCIe
- PCI Express,NVMe memory-based controller 使用的 transport 與裝置互連。
01.02.Base Specification 定義通用 NVMe 協定;Transport Specification 綁定特定傳輸,I/O Command Set Specification 擴充命令與資料結構。這是適用關係,不是協定堆疊。
來源:Base 2.4 §1.1.1
來源:NVME-BASE-2.4, Rev. 2.4, §1.1.1, 文件頁 1, PDF 頁 27
| 規格文件 | 負責定義的內容 | 與其他規格如何分工 |
|---|---|---|
| Base | 共通 command、queue、status 與資料結構 | 不要假設它定義所有 PCIe register 細節 |
| PCIe Transport | BAR、MMIO、doorbell、interrupt 與 PCIe-specific 行為 | 衝突時不能覆蓋 Base |
| I/O Command Set | 特定 namespace I/O command 與延伸資料結構 | 不負責重新定義 transport |
- MMIO
- Memory-Mapped I/O,以 CPU memory access 形式讀寫裝置 register。
- BAR
- Base Address Register,PCI configuration space 中用來找出裝置 memory space 的 register。
02 Namespace、Controller 與存取路徑
02.01.namespace 是 host 實際存取的格式化容量,但容量管理、耐久度、回收與路徑都發生在不同層級。Figures 11-18 用 NVM Set 或 Reclaim Group 描述容量包含關係,Figures 19-22 則改看 controller、port、path 與 PCIe Function。兩組圖回答不同問題,不能疊成單一樹狀圖後便認為每層都一對一。
- Reclaim Group
- Reclaim Group,具有共同回收行為的一組非揮發性儲存資源。
- NVM Set
- NVM Set,把 namespace 與一組共同管理的 NVM 資源建立關聯的容量集合。
- Host
- 主機;執行作業系統並送出 NVMe 命令的一端。
02.02.儲存模型用 NVM subsystem、domain、Endurance Group、NVM Set/Reclaim Group、Reclaim Unit 與 namespace 表達包含關係。namespace 是 host 實際透過 controller 存取的格式化容量。
- Endurance Group
- Endurance Group,用於隔離與回報耐久度相關狀態的 NVM 資源群組。
- Reclaim Unit
- Reclaim Unit,controller 執行媒體回收時使用的較小管理粒度。
來源:Base 2.4 §2.3.1
來源:NVME-BASE-2.4, Rev. 2.4, §2.3.1, 文件頁 26-33, PDF 頁 52-59
| 存取方式 | 涉及的主機與儲存對象 | 它解決什麼問題 |
|---|---|---|
| multi-path I/O | 同一 host、同一 namespace、兩條以上獨立路徑 | 重點是 path redundancy |
| namespace sharing | 兩個以上 hosts 存取同一 shared namespace | 重點是 host ownership 與 coordination |
| SR-IOV | 一個 PCIe 裝置呈現 PF/VF | PCIe Function 不必等同獨立 subsystem |
- SR-IOV
- Single Root I/O Virtualization,讓一個 PCIe 裝置呈現一個 PF 與多個 VF 的虛擬化能力。
- PF
- Physical Function,具有完整 PCIe 設定能力、可管理相關 VF 的實體功能。
- VF
- Virtual Function,由 SR-IOV 建立、資源較受限的 PCIe 虛擬功能。
03 命令提交與完成的往返
03.01.host 不把 command 直接寫進 controller。host 先在記憶體中的 SQE 建好命令,再公布新的 SQ tail;controller 取走命令後執行,最後把 CQE 放進 CQ。Figure 6 的 1:1 與 Figure 7 的 n:1 差異在於多個 SQ 是否共用同一個 CQ,不是 command 是否共用同一個 SQE。
- CQE
- Completion Queue Entry,CQ 中的一筆完成結果資料結構。
- SQE
- Submission Queue Entry,SQ 中的一筆命令資料結構。
- CQ
- Completion Queue,controller 放入完成結果的完成佇列。
- SQ
- Submission Queue,主機放入命令的提交佇列。
- Host 將命令寫入 SQ(提交佇列)。
- Host 更新 SQ Tail Doorbell,通知 Controller 有新命令。
- Controller 取出並執行命令,將結果寫入 CQ(完成佇列)。
- Host 讀取 CQE,再更新 CQ Head Doorbell,交還已讀取的位置。
03.02.PCIe memory-based model 把 Submission Queue 與 Completion Queue 配置在記憶體。多個 I/O Submission Queues 可共用一個 I/O Completion Queue;Admin queue pair 維持一對一。
來源:Base 2.4 §2.1
來源:NVME-BASE-2.4, Rev. 2.4, §2.1, 文件頁 21-23, PDF 頁 47-49
| 佇列配置 | SQ 與 CQ 的對應 | 如何辨認完成的命令 |
|---|---|---|
| Admin queue pair | 一個 Admin SQ 對一個 Admin CQ | 初始化與管理路徑 |
| I/O 1:1 | 一個 I/O SQ 對一個 I/O CQ | 追蹤簡單、隔離清楚 |
| I/O n:1 | 多個 I/O SQ 共用一個 I/O CQ | 完成路徑整併,仍以 SQID/CID 找回命令 |
- SQID
- Submission Queue Identifier,辨識 command 所屬 SQ 的數值。
- CID
- Command Identifier,與 SQ identifier 合用以辨識 outstanding command。
04 數值編碼與單位
04.01.讀任何 raw value 前先確認單位與編碼。zero-based count=3 可能代表 4 個單位;index 選清單項目,offset 則表示離起點的距離,兩者不能互換。
- zero-based
- zero-based;數值從 0 開始計算,因此 raw=3 代表第 4 個項目或 4 個單位,實際含義仍要看欄位定義。
- raw value
- raw value;欄位直接讀出的數值,尚未套用 zero-based、單位或縮放規則;先確認定義再換算。
- offset
- offset;從指定起點算出的位移。它回答「離起點多遠」,不等於 index。
- index
- index;用來選取清單中的項目或格式。它回答「選哪一項」,不是「離起點多遠」。
04.02.數值的解讀同時包含進位與單位;十六進位使用 h 後綴,二進位使用 b 後綴,十進位可省略 d。十進位與二進位容量前綴代表不同倍率。
來源:Base 2.4 §1.4.2
來源:NVME-BASE-2.4, Rev. 2.4, §1.4.2, 文件頁 3-5, PDF 頁 29-31
| 欄位或表示法 | 換算後的值 | 採用這種解讀的依據 |
|---|---|---|
| 1000 | 十進位 1000 | 若無 b/h 後綴則按十進位 |
| 1000b | 二進位 8 | b 是 radix,不是 bit 單位 |
| 1000h | 十六進位 4096 | 常見於 offset 與 register value |
| NUMD=0 | 實際 1 dword | 只有欄位明載 0's-based 才加 1 |
- 0's-based
- 0's-based encoding,以 0 表示實際數量 1;依欄位換算公式通常是欄位值加 1。
- Dword
- Dword(Double word);32 bits,也就是 4 bytes。對比 word=16 bits;例如 zero-based dword count=3 代表 4 個 Dwords,也就是 16 bytes。
- NUMD
- Number of Dwords,0's-based transfer dword count;實際 bytes = (NUMD + 1) × 4。
接著打開 Spec 看什麼
05.01.以下按概念列出閱讀位置。報告時先用上面的流程說明問題,再打開對應章節看欄位與完整條件。中文教學 HTML 另有本篇全部圖表的逐圖重點、案例與細節。
| 要說明的觀念 | Spec 閱讀位置 |
|---|---|
| Base、Command Set 與 Transport 的分工 | Base 2.4 §1.1.1 · Base 2.4 §2.3.2 |
| Namespace、Controller 與存取路徑 | Base 2.4 §2.3.1 · Base 2.4 §2.3.3 · Base 2.4 §2.4.1 · Base 2.4 §2.4.2 |
| 命令提交與完成的往返 | Base 2.4 §2.1 · Base 2.4 §2.3.3 |
| 數值編碼與單位 | Base 2.4 §1.4.2 · Base 2.4 §1.4.3 |
學完後想一想
1. 要了解 Read 做什麼,以及它如何經 PCIe 傳送,為何需要查不同規格?
06.01.Command Set 定義命令對資料的作用;Transport 定義命令與完成如何經連接方式交換;Base 提供共用的 controller、queue 與管理模型。三者共同描述一次完整操作。
來源
來源:NVME-BASE-2.4, Rev. 2.4, §1.1.1, 文件頁 1, PDF 頁 27
來源:NVME-BASE-2.4, Rev. 2.4, §2.3.2, 文件頁 33, PDF 頁 59
2. Host 寫 doorbell 時,命令本身放在哪裡?
06.02.命令已放在 Submission Queue 的 entry 中。Doorbell 更新 queue 的進度資訊,讓 controller 知道可處理的範圍;它不是整筆命令的承載位置。
來源
來源:NVME-BASE-2.4, Rev. 2.4, §2.1, 文件頁 21-23, PDF 頁 47-49
4. 看到某長度欄位的 raw value 為 3,為何不能立即說它是 3 bytes?
06.04.必須先確認單位和編碼。若是 zero-based 的 dword 數,3 代表 4 dwords,也就是 16 bytes;若是實際 byte 數,才是 3 bytes。
來源
來源:NVME-BASE-2.4, Rev. 2.4, §1.4.2, 文件頁 3-5, PDF 頁 29-31
來源:NVME-BASE-2.4, Rev. 2.4, §1.4.3, 文件頁 5, PDF 頁 31


Comments