NVMe · 規格與原理

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-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 的分工

以「讀出 4 KiB」串起三份規格

先確定想做的工作

01.01.應用程式要讀檔案,作業系統把需求轉成儲存區塊的讀取。NVMe 規格描述的是後面的裝置介面,不會直接接收檔名。這是從 OS 知識進入 NVMe 時要先跨過的界線。

把工作交給正確的命令集

01.02.NVM Command Set 的 Read 以 NSID、SLBA 與區塊數指出讀取對象。4 KiB 是資料量;實際需要幾個 logical blocks,要先從 namespace 格式得知每個 block 的大小。

NSID
Namespace Identifier,controller 用來指向 namespace 的數值 handle;identifier 不等於 namespace 物件本身。

讓共同命令結構經 PCIe 往返

01.03.主機將 Read 放進 Base 定義的 SQE,以資料指標給出目的 buffer,再依 PCIe 的 Doorbell 與記憶體存取流程交給控制器。資料回到 buffer,命令結果回到 CQ;中斷只負責提醒主機查看。

PCIe
PCI Express,NVMe memory-based controller 使用的 transport 與裝置互連。
SQE
Submission Queue Entry,SQ 中的一筆命令資料結構。
CQ
Completion Queue,controller 放入完成結果的完成佇列。
來源:Base 2.4 §1.1.1 · Base 2.4 §2.3.2

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

把流程對回規格條件

01.05.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

01.06.Admin Command Set 管理 controller 與 queue;I/O Command Set 定義對 namespace 的資料操作。Base 說明通用機制,個別 I/O Command Set Specification 說明命令語意。

Admin
Administrative,建立、設定、查詢或管理 controller 與 queue 的控制路徑。
來源:Base 2.4 §2.3.2

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

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。
閱讀相關規格圖表 → Base、Command Set 與 Transport 的分工

02 Namespace、Controller 與存取路徑

一個裝置裡,哪些物件是主機真正看得到的

由 controller 找到管理入口

02.01.主機經 controller 提交命令、查能力和接收結果。controller 是這條命令路徑的端點,不等同 NAND die,也不能直接由控制器數目推論實體 flash 數。

由 namespace 找到資料範圍

02.02.假設同一 controller 能存取 NSID 1 和 NSID 2,兩者各自有容量與格式。對 NSID 1 的 LBA 0 寫入,不會因地址也是 0 就等同對 NSID 2 的 LBA 0 寫入。

再看共享與資源歸屬

02.03.namespace 可能經不只一個 controller 存取,Endurance Group 與 NVM Set 則描述資源組織。先畫出「誰能存取誰」,再補資源歸屬,會比把所有名詞排成一條上下層清單準確。

Endurance Group
Endurance Group,用於隔離與回報耐久度相關狀態的 NVM 資源群組。
NVM Set
NVM Set,把 namespace 與一組共同管理的 NVM 資源建立關聯的容量集合。
來源:Base 2.4 §2.3.1 · Base 2.4 §2.3.3 · Base 2.4 §2.4.1 · Base 2.4 §2.4.2

來源:NVME-BASE-2.4, Rev. 2.4, §2.3.1, 文件頁 26-33, PDF 頁 52-59

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

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

把流程對回規格條件

02.05.儲存模型用 NVM subsystem、domain、Endurance Group、NVM Set/Reclaim Group、Reclaim Unit 與 namespace 表達包含關係。namespace 是 host 實際透過 controller 存取的格式化容量。

Reclaim Group
Reclaim Group,具有共同回收行為的一組非揮發性儲存資源。
Reclaim Unit
Reclaim Unit,controller 執行媒體回收時使用的較小管理粒度。
Host
主機;執行作業系統並送出 NVMe 命令的一端。
來源:Base 2.4 §2.3.1

來源:NVME-BASE-2.4, Rev. 2.4, §2.3.1, 文件頁 26-33, PDF 頁 52-59

02.06.controller、port、namespace 與 PCI Function 是不同物件;NSID 是 controller 用來指向 namespace 的 handle,不是 namespace 本身。

來源:Base 2.4 §2.3.3

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

02.07.multi-path I/O 是同一 host 到同一 namespace 的兩條以上獨立路徑;namespace sharing 是兩個以上 host 經不同 controller 存取同一 shared namespace。兩者都需要至少兩個 controller。

來源:Base 2.4 §2.4.1

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

02.08.支援多路徑或共享時,各 controller 對同一 namespace 的存取特性不一定相同;host 可依 controller 所回報的狀態選擇路徑。

來源:Base 2.4 §2.4.2

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

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 虛擬功能。
閱讀相關規格圖表 → Namespace、Controller 與存取路徑

03 命令提交與完成的往返

03.01.提交佇列放主機提出的命令,完成佇列放控制器回報的結果。主機寫好命令後,以 Doorbell 公布新的佇列位置;控制器執行後寫入完成項目。Doorbell 傳達位置更新,並不承載整份命令資料。這個分工可以避免把通知動作誤認為資料傳輸本身。

03.02.多個 I/O SQ 可以共用一個 CQ,因此完成項目需要足夠資訊辨認原命令。例如 SQ 3 與 SQ 4 都有 CID=5 的命令,完成時仍可由 SQID 與 CID 的組合分辨。CQ 告訴主機的是每筆命令的結果,並不保證結果排列順序與提交順序相同。

SQID
Submission Queue Identifier,辨識 command 所屬 SQ 的數值。
CID
Command Identifier,與 SQ identifier 合用以辨識 outstanding command。
SQ
Submission Queue,主機放入命令的提交佇列。
來源:Base 2.4 §2.1 · Base 2.4 §2.3.3

來源:NVME-BASE-2.4, Rev. 2.4, §2.1, 文件頁 21-23, PDF 頁 47-49

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

一筆命令如何往返
  1. Host 將命令寫入 SQ(提交佇列)。
  2. Host 更新 SQ Tail Doorbell,通知 Controller 有新命令。
  3. Controller 取出並執行命令,將結果寫入 CQ(完成佇列)。
  4. Host 讀取 CQE,再更新 CQ Head Doorbell,交還已讀取的位置。
命令與結果放在佇列;Doorbell 傳達佇列位置的更新。
CQE
Completion Queue Entry,CQ 中的一筆完成結果資料結構。

把流程對回規格條件

03.03.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 找回命令
閱讀相關規格圖表 → 命令提交與完成的往返

04 數值編碼與單位

04.01.規格中的數字要同時讀三件事:進位、編碼方式、單位。1000、1000b、1000h 的外觀接近,數值卻分別是十進位的 1000、8、4096。即使數值解對了,也還要知道它代表 bytes、Dwords、區塊數,或只是某個選項的編號。

04.02.再以 512-byte 傳輸為例:先除以每個 Dword 的 4 bytes,得到 128 Dwords;若 NUMD 採從 0 起算的數量編碼,寫入值才是 127。這是先換單位、再編碼的兩步。反向閱讀時應先加 1 解碼,再乘 4 還原 bytes;不是所有數量欄位都需要加 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。
來源:Base 2.4 §1.4.2 · Base 2.4 §1.4.3

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

把流程對回規格條件

04.03.數值的解讀同時包含進位與單位;十六進位使用 h 後綴,二進位使用 b 後綴,十進位可省略 d。十進位與二進位容量前綴代表不同倍率。

來源:Base 2.4 §1.4.2

來源:NVME-BASE-2.4, Rev. 2.4, §1.4.2, 文件頁 3-5, PDF 頁 29-31

04.04.NVMe 以 byte、word、dword 表示欄位位置;一個 word 為 2 bytes,一個 dword 為 4 bytes。解欄位時先確認 byte 與 bit 編號。

word
word;16 bits,也就是 2 bytes。它比 Dword 小一半;欄位長度不能只看數字,還要看單位。
來源:Base 2.4 §1.4.3

來源:NVME-BASE-2.4, Rev. 2.4, §1.4.3, 文件頁 5, PDF 頁 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。
offset
offset;從指定起點算出的位移。它回答「離起點多遠」,不等於 index。
閱讀相關規格圖表 → 數值編碼與單位

05 讀懂本篇的規格圖表

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

圖表組 01 · Base、Command Set 與 Transport 的分工 · 2 張圖表

05.02.規格家族圖用來連接責任,箭頭不是命令執行順序。先用一個操作分類「共同格式」「命令行為」「傳輸方式」,再對照三份規格的位置。

回到本節的解釋與範例

把命令放回正確的規格層次

05.03.先由主機想做的工作選擇 Admin 或 I/O 命令,再由所選命令集決定命令的細節;傳輸規格說明命令與資料如何經介面往返。這三層需配合閱讀。

一起判讀的欄位或標示如何共同決定操作或結果帶入情境後怎麼讀
Admin/I/O Command SetAdmin 管理控制器與資源;I/O 命令集定義資料操作。Identify 查能力與格式後,Read 才使用查到的格式存取資料。
Base/Command Set/TransportBase 提供共同格式與行為,命令集補上操作語意,PCIe Transport 定義本篇的傳輸方式。同樣的 DPTR 結構可以服務不同命令;buffer 內的資料意義要由命令判斷。
DPTR
Data Pointer,SQE 中指出 command data buffer 的欄位。
來源:Base 2.4 §1.1.1 · Base 2.4 §2

來源:NVME-BASE-2.4, Rev. 2.4, §1.1.1, Figure 1, 文件頁 1, PDF 頁 27

來源:NVME-BASE-2.4, Rev. 2.4, §2, Figure 5, 文件頁 21, PDF 頁 47

Base Figure 1 · NVMe Family of Specifications

一句話重點

Base1-1規格家族把共同機制、傳輸與命令語意分工定義。

來源:Base 2.4 §1.1.1

來源:NVME-BASE-2.4, Rev. 2.4, §1.1.1, Figure 1, 文件頁 1, PDF 頁 27

用例子讀懂

Base1-2追一筆 PCIe Read 時,Base 回答命令長什麼樣,PCIe Transport 回答如何傳遞,NVM Command Set 回答讀取的資料與保護行為。

Base Figure 5 · Types of NVMe Command Sets

一句話重點

Base5-1Admin 與 I/O Command Set 分別管理裝置與操作 namespace 資料。

來源:Base 2.4 §2

來源:NVME-BASE-2.4, Rev. 2.4, §2, Figure 5, 文件頁 21, PDF 頁 47

用例子讀懂

Base5-2建立 I/O queue 是管理工作;對 namespace 發出 Read 則屬資料操作。兩者共用命令機制,但用途不同。

圖表組 02 · Namespace、Controller 與存取路徑 · 12 張圖表

05.04.關係圖先找 namespace,再沿線回到能存取它的 controllers 和 hosts。兩條線通往同一物件表示多條路徑;兩個 hosts 指向同一物件表示共享。SR-IOV 圖另外描述 PCIe Function 的呈現方式。

回到本節的解釋與範例

從邏輯空間連到實際容量組織

05.05.Namespace 提供主機可定址的資料空間;NVM Set、Endurance Group 與 Reclaim Group 描述不同的儲存組織關係。圖上的包含關係需沿父子層次閱讀,不能由圖形大小推論容量。

一起判讀的欄位或標示如何共同決定操作或結果帶入情境後怎麼讀
TNVMCAP/UNVMCAP分別描述 subsystem 的總容量與尚未配置容量;讀值時保留來源指定的容量單位。先由總量扣除已配置量理解可用空間,不能把 UNVMCAP 當成某個 namespace 的剩餘 LBA。
TEGCAP/UEGCAP/MEGCAP描述 Endurance Group 相關容量;需要知道欄位屬於哪個 group 才能比較。兩個 group 的未配置容量不能直接當成可任意互換的同一份空間。
NVM Set/Reclaim Group/NamespaceNVM Set 與回收組織是不同維度;namespace 的歸屬決定要查哪組能力與容量。沿圖找出 namespace 所屬的 Endurance Group,再解釋其配置限制。
來源:Base 2.4 §2.3.1

來源:NVME-BASE-2.4, Rev. 2.4, §2.3.1, Figure 11, 文件頁 27, PDF 頁 53

來源:NVME-BASE-2.4, Rev. 2.4, §2.3.1, Figure 12, 文件頁 28, PDF 頁 54

來源:NVME-BASE-2.4, Rev. 2.4, §2.3.1, Figure 13, 文件頁 29, PDF 頁 55

來源:NVME-BASE-2.4, Rev. 2.4, §2.3.1, Figure 14, 文件頁 30, PDF 頁 56

來源:NVME-BASE-2.4, Rev. 2.4, §2.3.1, Figure 15, 文件頁 31, PDF 頁 57

Base Figure 11 · Simple NVM Storage Hierarchy with NVM Sets

一句話重點

Base11-1簡單 NVM Set 階層把 namespace 與容量集合放在同一張關係圖。

來源:Base 2.4 §2.3.1

來源:NVME-BASE-2.4, Rev. 2.4, §2.3.1, Figure 11, 文件頁 27, PDF 頁 53

用例子讀懂

Base11-2沿一個 namespace 向上追所屬的 NVM Set 與 Endurance Group,就能指出容量和耐久度管理各位於哪一層。

Base Figure 12 · Simple NVM Storage Hierarchy with One Reclaim Group

一句話重點

Base12-1一個 Reclaim Group 可以提供資料回收所使用的資源。

來源:Base 2.4 §2.3.1

來源:NVME-BASE-2.4, Rev. 2.4, §2.3.1, Figure 12, 文件頁 28, PDF 頁 54

用例子讀懂

Base12-2選一個 namespace 的資料放置位置,沿圖找所使用的回收群組;namespace 名稱與回收單位不是一對一同義詞。

Base Figure 13 · Simple NVM Storage Hierarchy with Multiple Reclaim Groups

一句話重點

Base13-1多個 Reclaim Groups 讓放置位置需要同時辨識群組。

來源:Base 2.4 §2.3.1

來源:NVME-BASE-2.4, Rev. 2.4, §2.3.1, Figure 13, 文件頁 29, PDF 頁 55

用例子讀懂

Base13-2同樣的回收單位編號放在不同群組中,不應直接當成同一個位置;沿群組與單位兩層讀圖。

Base Figure 14 · Complex NVM Storage Hierarchy with NVM Sets

一句話重點

Base14-1較複雜的 NVM Set 階層展示多個容量集合如何共存。

來源:Base 2.4 §2.3.1

來源:NVME-BASE-2.4, Rev. 2.4, §2.3.1, Figure 14, 文件頁 30, PDF 頁 56

用例子讀懂

Base14-2先選定一個 Endurance Group,再比較其中的 NVM Sets;不要把圖上並列的所有集合都當成同一份可互換容量。

Base Figure 15 · Complex NVM Storage Hierarchy with Multiple Reclaim Groups

一句話重點

Base15-1多個回收群組與其他儲存層級需要分別追蹤。

來源:Base 2.4 §2.3.1

來源:NVME-BASE-2.4, Rev. 2.4, §2.3.1, Figure 15, 文件頁 31, PDF 頁 57

用例子讀懂

Base15-2先從要管理的 namespace 出發,依圖追到放置與回收資源;只看方塊距離不能推論共享或包含關係。

識別物件與識別存取路徑

05.06.同一個 namespace 可以經不同控制器存取。控制器識別碼、namespace 識別碼、PCIe Function 與 port 各指不同對象,應沿圖上的連接關係逐層追蹤。

一起判讀的欄位或標示如何共同決定操作或結果帶入情境後怎麼讀
NSID/Controller IdentifierNSID 選資料物件,控制器識別碼選控制器;是否可存取還要看附加關係。A、B 都能看到 NSID=7 時,Detach A 只改變 A 的存取關係。
I/O/Administrative Controller控制器類型決定適用的命令與資源要求。先辨認类型,再查命令支援表;不能假定每種控制器都提供一般資料 I/O。
Domain/Port/PCIe Function分別描述資源域、連接位置與 PCIe 裝置功能;多控制器不等於多份 namespace 資料。兩個控制器共享一個 Boot Partition 時,保護狀態的影響會跨過單一控制器。
來源:Base 2.4 §2.3.3 · Base 2.4 §2.4.1

來源:NVME-BASE-2.4, Rev. 2.4, §2.3.3, Figure 16, 文件頁 32, PDF 頁 58

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

來源:NVME-BASE-2.4, Rev. 2.4, §2.3.3, Figure 18, 文件頁 34, PDF 頁 60

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

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

來源:NVME-BASE-2.4, Rev. 2.4, §2.4.1, Figure 21, 文件頁 36, PDF 頁 62

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

Base Figure 16 · Single-Namespace NVM Subsystem

一句話重點

Base16-1單一 namespace 的例子把控制器介面與儲存空間分開。

來源:Base 2.4 §2.3.3

來源:NVME-BASE-2.4, Rev. 2.4, §2.3.3, Figure 16, 文件頁 32, PDF 頁 58

用例子讀懂

Base16-2主機透過控制器存取 namespace,即使兩者各只有一個,也不代表控制器就是 namespace。

Base Figure 17 · Two-Namespace NVM Subsystem

一句話重點

Base17-1兩個 namespace 可以經由同一套裝置介面提供不同儲存空間。

來源:Base 2.4 §2.3.3

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

用例子讀懂

Base17-2主機選 NSID 1 或 2 會指向不同 namespace,不是切換同一 namespace 裡的兩個檔案。

Base Figure 18 · Complex NVM Subsystem

一句話重點

Base18-1複雜 subsystem 圖用來追蹤控制器、連接埠與 namespace 的關係。

來源:Base 2.4 §2.3.3

來源:NVME-BASE-2.4, Rev. 2.4, §2.3.3, Figure 18, 文件頁 34, PDF 頁 60

用例子讀懂

Base18-2選一個 host 要用的 namespace,沿線確認可經哪些控制器到達;不是圖中每個控制器都必然連到每個 namespace。

Base Figure 19 · NVM Express Controller with Two Namespaces

一句話重點

Base19-1同一控制器可以讓主機存取兩個 namespace。

來源:Base 2.4 §2.4.1

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

用例子讀懂

Base19-2Read 的命令機制相同,但 NSID 不同會選到不同容量與格式;不能沿用另一個 namespace 的 LBA 大小。

Base Figure 20 · NVM Subsystem with Two Controllers and One Port

一句話重點

Base20-1兩個控制器可以共用一個連接埠。

來源:Base 2.4 §2.4.1

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

用例子讀懂

Base20-2主機看到兩個控制器時,不應直接推論存在兩條實體連線;圖將介面物件數與 port 數分開。

Base Figure 21 · NVM Subsystem with Two Controllers and Two Ports

一句話重點

Base21-1兩個連接埠提供與單一 port 不同的連接關係。

來源:Base 2.4 §2.4.1

來源:NVME-BASE-2.4, Rev. 2.4, §2.4.1, Figure 21, 文件頁 36, PDF 頁 62

用例子讀懂

Base21-2與 Figure 20 比較時,先保留控制器數相同,再觀察 port 由 1 變 2,理解路徑結構到底改變在哪裡。

Base Figure 22 · PCI Express Device Supporting Single Root I/O Virtualization (SR-IOV)

一句話重點

Base22-1SR-IOV 把 PCIe Function 與控制器介面對應起來。

來源:Base 2.4 §2.4.1

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

用例子讀懂

Base22-2作業系統使用不同 Function 時,仍需辨識各自的控制器與資源關係;多個 Function 不表示有多套獨立 NAND。

圖表組 03 · 命令提交與完成的往返 · 2 張圖表

05.07.佇列圖分開標示存放命令與結果的位置,沿主機→SQ→控制器→CQ→主機閱讀。再看 SQ/CQ 的配對圖,確認完成項目中的 SQID、CID 如何指回原來的命令。

回到本節的解釋與範例

把佇列位置與命令身分分開

05.08.SQ 保存待處理命令,CQ 保存完成項目。Head 與 Tail 描述位置,CID 描述命令身分;多個 SQ 可以把完成結果送到同一 CQ,因此結果還需要 SQID。

一起判讀的欄位或標示如何共同決定操作或結果帶入情境後怎麼讀
SQ Head/SQ Tail比較已取走與已提交的位置以辨認空、滿及可用空間;位置到達佇列末端會回繞。深度為 8 時,index 7 的下一個位置是 0;不能用普通整數大小判斷新舊。
CQ Head/Phase Tag/SQID+CID主機交回已讀取的 CQ 位置;Phase Tag 協助辨認新完成項目,SQID 與 CID 找回原要求。兩個 SQ 可以都使用 CID=3;回覆必須同時保留 SQID 才不會配錯。
index
index;用來選取清單中的項目或格式。它回答「選哪一項」,不是「離起點多遠」。
來源:Base 2.4 §2.1

來源:NVME-BASE-2.4, Rev. 2.4, §2.1, Figure 6, 文件頁 22, PDF 頁 48

來源:NVME-BASE-2.4, Rev. 2.4, §2.1, Figure 7, 文件頁 22, PDF 頁 48

Base Figure 6 · Queue Pair Example, 1:1 Mapping

一句話重點

Base6-1一對一佇列映射讓一個 SQ 的結果送到指定 CQ。

來源:Base 2.4 §2.1

來源:NVME-BASE-2.4, Rev. 2.4, §2.1, Figure 6, 文件頁 22, PDF 頁 48

用例子讀懂

Base6-2SQ1 送出的兩筆命令都回到 CQ1;結果出現順序仍不一定等於提交順序,需要用識別資訊配對。

Base Figure 7 · Queue Pair Example, n:1 Mapping

一句話重點

Base7-1多個 SQ 可以把完成結果送到同一個 CQ。

來源:Base 2.4 §2.1

來源:NVME-BASE-2.4, Rev. 2.4, §2.1, Figure 7, 文件頁 22, PDF 頁 48

用例子讀懂

Base7-2SQ1 與 SQ2 的 CID 都可有值 5;共用 CQ 收到結果時,必須連同 SQID 判斷結果屬於哪一筆。

圖表組 04 · 數值編碼與單位 · 2 張圖表

05.09.閱讀數值表時,把原始表示、實際數量及單位排成不同欄。Index 選第幾個項目;offset 表示離起點多遠。只有知道每個項目大小及起點,才能把 index 轉成 offset。

回到本節的解釋與範例

從欄位的數字算回真正的資料量

05.10.每次計算先寫單位,再確認欄位直接保存數量、數量減 1、指数或索引。數值相同並不表示資料量相同。

一起判讀的欄位或標示如何共同決定操作或結果帶入情境後怎麼讀
byte/word/Dword分別為 8、16、32 bits;bit 位置與 byte 位置不可互換。Dword index 10 對應從結構起點算起的 byte offset 40。
kB/KiB/從 0 起算的數量kB 是 1000 bytes,KiB 是 1024 bytes;只有定義為數量減 1 的欄位才先加 1。NUMD=127 對應 128 Dwords,即 512 bytes;一般 index=127 只選一個項目。
來源:Base 2.4 §1.4.2 · Base 2.4 §1.4.3

來源:NVME-BASE-2.4, Rev. 2.4, §1.4.2, Figure 2, 文件頁 3, PDF 頁 29

來源:NVME-BASE-2.4, Rev. 2.4, §1.4.3, Figure 3, 文件頁 5, PDF 頁 31

Base Figure 2 · Decimal and Binary Units

一句話重點

Base2-1十進位與二進位容量前綴使用不同倍率。

來源:Base 2.4 §1.4.2

來源:NVME-BASE-2.4, Rev. 2.4, §1.4.2, Figure 2, 文件頁 3, PDF 頁 29

用例子讀懂

Base2-21 MB=1000000 bytes,1 MiB=1048576 bytes;數字都寫 1,容量仍不相同。

Base Figure 3 · Byte, Word, and Dword Relationships

一句話重點

Base3-1Byte、Word、Dword 是不同大小的單位。

來源:Base 2.4 §1.4.3

來源:NVME-BASE-2.4, Rev. 2.4, §1.4.3, Figure 3, 文件頁 5, PDF 頁 31

用例子讀懂

Base3-264-byte SQE 有 16 個 Dwords;CDW10 的起點在 10×4=40 bytes,不是 byte 10。

CDW
CDW(Command Dword);命令中的 32-bit 欄位單位,例如 CDW10 的 10 是欄位 index,不是 byte offset。

05.11.規格的 mandatory、may、optional、reserved、shall、should 各有固定語氣;引用時保留英文 keyword,不能把 may 或 should 翻成 shall。

來源:Base 2.4 §1.4.1

來源:NVME-BASE-2.4, Rev. 2.4, §1.4.1, 文件頁 2-3, PDF 頁 28-29

學完後想一想

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