NVMe Base 2.4 第 1、2 章:規格語言、PCIe 佇列與儲存模型

7 minute read

English

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-01分辨 Base、Transport 與 I/O Command Set 各自定義的內容。

I/O
Input/Output,對 namespace 執行資料輸入與輸出的操作類別。
02

命令如何往返

02-01以提交佇列與完成佇列理解主機和控制器的合作。

03

儲存物件與路徑

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 Set 與 Transport 的分工
規格文件負責定義的內容與其他規格如何分工
Base共通 command、queue、status 與資料結構不要假設它定義所有 PCIe register 細節
PCIe TransportBAR、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

Namespace、Controller 與存取路徑
存取方式涉及的主機與儲存對象它解決什麼問題
multi-path I/O同一 host、同一 namespace、兩條以上獨立路徑重點是 path redundancy
namespace sharing兩個以上 hosts 存取同一 shared namespace重點是 host ownership 與 coordination
SR-IOV一個 PCIe 裝置呈現 PF/VFPCIe 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,主機放入命令的提交佇列。
一筆命令如何往返
  1. Host 將命令寫入 SQ(提交佇列)。
  2. Host 更新 SQ Tail Doorbell,通知 Controller 有新命令。
  3. Controller 取出並執行命令,將結果寫入 CQ(完成佇列)。
  4. Host 讀取 CQE,再更新 CQ Head Doorbell,交還已讀取的位置。
命令與結果放在佇列;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二進位 8b 是 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

3. 同一 namespace 可由 2 個 controllers 存取,是否代表有 2 份資料?

06.03.不代表。Controller 是存取端點,namespace 是邏輯儲存空間;多個存取端點可以連到同一空間。是否有實體副本屬另一層的儲存實作問題。

來源

來源:NVME-BASE-2.4, Rev. 2.4, §2.3.3, 文件頁 33-35, PDF 頁 59-61

來源:NVME-BASE-2.4, Rev. 2.4, §2.4.1, 文件頁 35-37, PDF 頁 61-63

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

採用的規格版本

NVM Express Base Specification, Revision 2.4

Jia-Chang

Jia-Chang

Human

Comments

  Write a comment ...