規格如何分工
01-01分辨 Base、Transport 與 I/O Command Set 各自定義的內容。
- I/O
- Input/Output,對 namespace 執行資料輸入與輸出的操作類別。
NVMe · 規格與原理
00.01.NVMe 是主機與儲存控制器之間的介面。本篇先建立整體關係:主機如何送出命令、控制器如何回報結果,以及 namespace、controller、NVM subsystem 各代表什麼。這些概念是閱讀後續命令與欄位的起點。
01-01分辨 Base、Transport 與 I/O Command Set 各自定義的內容。
02-01以提交佇列與完成佇列理解主機和控制器的合作。
03-01分清 namespace、controller 與 subsystem,並理解多條存取路徑。
00.02.這裡的主機包含作業系統與驅動程式;控制器提供主機可存取的 NVMe 介面。NVMe 描述主機可見的行為,不能直接等同 SSD 內部 NAND 的實體配置。
00.03.先用主機、控制器及 namespace 建立整體關係,再跟著一筆命令看提交與完成。規格分工告訴我們這些關係分別由哪份文件定義,數值與單位則是讀懂後續欄位的共同工具。
00.04.閱讀後應能畫出主機到儲存空間的路徑,說明命令與資料各放在哪裡,並分辨同一份儲存空間的多條路徑和多個主機的共享。這些基本概念會在後續各篇的具體機制中再次被使用。
01.01.應用程式要讀檔案,作業系統把需求轉成儲存區塊的讀取。NVMe 規格描述的是後面的裝置介面,不會直接接收檔名。這是從 OS 知識進入 NVMe 時要先跨過的界線。
01.02.NVM Command Set 的 Read 以 NSID、SLBA 與區塊數指出讀取對象。4 KiB 是資料量;實際需要幾個 logical blocks,要先從 namespace 格式得知每個 block 的大小。
01.03.主機將 Read 放進 Base 定義的 SQE,以資料指標給出目的 buffer,再依 PCIe 的 Doorbell 與記憶體存取流程交給控制器。資料回到 buffer,命令結果回到 CQ;中斷只負責提醒主機查看。
來源: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 擴充命令與資料結構。這是適用關係,不是協定堆疊。
來源: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 說明命令語意。
來源:NVME-BASE-2.4, Rev. 2.4, §2.3.2, 文件頁 33, PDF 頁 59
| 規格文件 | 負責定義的內容 | 與其他規格如何分工 |
|---|---|---|
| Base | 共通 command、queue、status 與資料結構 | 不要假設它定義所有 PCIe register 細節 |
| PCIe Transport | BAR、MMIO、doorbell、interrupt 與 PCIe-specific 行為 | 衝突時不能覆蓋 Base |
| I/O Command Set | 特定 namespace I/O command 與延伸資料結構 | 不負責重新定義 transport |
02.01.主機經 controller 提交命令、查能力和接收結果。controller 是這條命令路徑的端點,不等同 NAND die,也不能直接由控制器數目推論實體 flash 數。
02.02.假設同一 controller 能存取 NSID 1 和 NSID 2,兩者各自有容量與格式。對 NSID 1 的 LBA 0 寫入,不會因地址也是 0 就等同對 NSID 2 的 LBA 0 寫入。
02.03.namespace 可能經不只一個 controller 存取,Endurance Group 與 NVM Set 則描述資源組織。先畫出「誰能存取誰」,再補資源歸屬,會比把所有名詞排成一條上下層清單準確。
來源: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 存取的格式化容量。
來源: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 本身。
來源: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。
來源:NVME-BASE-2.4, Rev. 2.4, §2.4.1, 文件頁 35-37, PDF 頁 61-63
02.08.支援多路徑或共享時,各 controller 對同一 namespace 的存取特性不一定相同;host 可依 controller 所回報的狀態選擇路徑。
來源:NVME-BASE-2.4, Rev. 2.4, §2.4.2, 文件頁 37, PDF 頁 63
| 存取方式 | 涉及的主機與儲存對象 | 它解決什麼問題 |
|---|---|---|
| multi-path I/O | 同一 host、同一 namespace、兩條以上獨立路徑 | 重點是 path redundancy |
| namespace sharing | 兩個以上 hosts 存取同一 shared namespace | 重點是 host ownership 與 coordination |
| SR-IOV | 一個 PCIe 裝置呈現 PF/VF | PCIe Function 不必等同獨立 subsystem |
03.01.提交佇列放主機提出的命令,完成佇列放控制器回報的結果。主機寫好命令後,以 Doorbell 公布新的佇列位置;控制器執行後寫入完成項目。Doorbell 傳達位置更新,並不承載整份命令資料。這個分工可以避免把通知動作誤認為資料傳輸本身。
03.02.多個 I/O SQ 可以共用一個 CQ,因此完成項目需要足夠資訊辨認原命令。例如 SQ 3 與 SQ 4 都有 CID=5 的命令,完成時仍可由 SQID 與 CID 的組合分辨。CQ 告訴主機的是每筆命令的結果,並不保證結果排列順序與提交順序相同。
來源: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
03.03.PCIe memory-based model 把 Submission Queue 與 Completion Queue 配置在記憶體。多個 I/O Submission Queues 可共用一個 I/O Completion Queue;Admin queue pair 維持一對一。
來源: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.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。
來源: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。十進位與二進位容量前綴代表不同倍率。
來源: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 編號。
來源:NVME-BASE-2.4, Rev. 2.4, §1.4.3, 文件頁 5, PDF 頁 31
| 欄位或表示法 | 換算後的值 | 採用這種解讀的依據 |
|---|---|---|
| 1000 | 十進位 1000 | 若無 b/h 後綴則按十進位 |
| 1000b | 二進位 8 | b 是 radix,不是 bit 單位 |
| 1000h | 十六進位 4096 | 常見於 offset 與 register value |
| NUMD=0 | 實際 1 dword | 只有欄位明載 0's-based 才加 1 |
05.01.以下依概念整理規格中的圖表。每組先說明讀取順序與要判斷的問題,接著列出各圖的欄位或行為說明。可以由正文的連結跳到對應組別,也可以用這一節檢查自己能否把欄位連回完整操作。
05.02.規格家族圖用來連接責任,箭頭不是命令執行順序。先用一個操作分類「共同格式」「命令行為」「傳輸方式」,再對照三份規格的位置。
回到本節的解釋與範例05.03.先由主機想做的工作選擇 Admin 或 I/O 命令,再由所選命令集決定命令的細節;傳輸規格說明命令與資料如何經介面往返。這三層需配合閱讀。
| 一起判讀的欄位或標示 | 如何共同決定操作或結果 | 帶入情境後怎麼讀 |
|---|---|---|
| Admin/I/O Command Set | Admin 管理控制器與資源;I/O 命令集定義資料操作。 | Identify 查能力與格式後,Read 才使用查到的格式存取資料。 |
| Base/Command Set/Transport | Base 提供共同格式與行為,命令集補上操作語意,PCIe Transport 定義本篇的傳輸方式。 | 同樣的 DPTR 結構可以服務不同命令;buffer 內的資料意義要由命令判斷。 |
來源: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
Base1-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 回答讀取的資料與保護行為。
Base5-1Admin 與 I/O Command Set 分別管理裝置與操作 namespace 資料。
來源:NVME-BASE-2.4, Rev. 2.4, §2, Figure 5, 文件頁 21, PDF 頁 47
Base5-2建立 I/O queue 是管理工作;對 namespace 發出 Read 則屬資料操作。兩者共用命令機制,但用途不同。
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/Namespace | NVM Set 與回收組織是不同維度;namespace 的歸屬決定要查哪組能力與容量。 | 沿圖找出 namespace 所屬的 Endurance Group,再解釋其配置限制。 |
來源: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
Base11-1簡單 NVM Set 階層把 namespace 與容量集合放在同一張關係圖。
來源:NVME-BASE-2.4, Rev. 2.4, §2.3.1, Figure 11, 文件頁 27, PDF 頁 53
Base11-2沿一個 namespace 向上追所屬的 NVM Set 與 Endurance Group,就能指出容量和耐久度管理各位於哪一層。
Base12-1一個 Reclaim Group 可以提供資料回收所使用的資源。
來源:NVME-BASE-2.4, Rev. 2.4, §2.3.1, Figure 12, 文件頁 28, PDF 頁 54
Base12-2選一個 namespace 的資料放置位置,沿圖找所使用的回收群組;namespace 名稱與回收單位不是一對一同義詞。
Base13-1多個 Reclaim Groups 讓放置位置需要同時辨識群組。
來源:NVME-BASE-2.4, Rev. 2.4, §2.3.1, Figure 13, 文件頁 29, PDF 頁 55
Base13-2同樣的回收單位編號放在不同群組中,不應直接當成同一個位置;沿群組與單位兩層讀圖。
Base14-1較複雜的 NVM Set 階層展示多個容量集合如何共存。
來源:NVME-BASE-2.4, Rev. 2.4, §2.3.1, Figure 14, 文件頁 30, PDF 頁 56
Base14-2先選定一個 Endurance Group,再比較其中的 NVM Sets;不要把圖上並列的所有集合都當成同一份可互換容量。
Base15-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 Identifier | NSID 選資料物件,控制器識別碼選控制器;是否可存取還要看附加關係。 | A、B 都能看到 NSID=7 時,Detach A 只改變 A 的存取關係。 |
| I/O/Administrative Controller | 控制器類型決定適用的命令與資源要求。 | 先辨認类型,再查命令支援表;不能假定每種控制器都提供一般資料 I/O。 |
| Domain/Port/PCIe Function | 分別描述資源域、連接位置與 PCIe 裝置功能;多控制器不等於多份 namespace 資料。 | 兩個控制器共享一個 Boot Partition 時,保護狀態的影響會跨過單一控制器。 |
來源: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
Base16-1單一 namespace 的例子把控制器介面與儲存空間分開。
來源:NVME-BASE-2.4, Rev. 2.4, §2.3.3, Figure 16, 文件頁 32, PDF 頁 58
Base16-2主機透過控制器存取 namespace,即使兩者各只有一個,也不代表控制器就是 namespace。
Base17-1兩個 namespace 可以經由同一套裝置介面提供不同儲存空間。
來源:NVME-BASE-2.4, Rev. 2.4, §2.3.3, Figure 17, 文件頁 33, PDF 頁 59
Base17-2主機選 NSID 1 或 2 會指向不同 namespace,不是切換同一 namespace 裡的兩個檔案。
Base18-1複雜 subsystem 圖用來追蹤控制器、連接埠與 namespace 的關係。
來源:NVME-BASE-2.4, Rev. 2.4, §2.3.3, Figure 18, 文件頁 34, PDF 頁 60
Base18-2選一個 host 要用的 namespace,沿線確認可經哪些控制器到達;不是圖中每個控制器都必然連到每個 namespace。
Base19-1同一控制器可以讓主機存取兩個 namespace。
來源:NVME-BASE-2.4, Rev. 2.4, §2.4.1, Figure 19, 文件頁 35, PDF 頁 61
Base19-2Read 的命令機制相同,但 NSID 不同會選到不同容量與格式;不能沿用另一個 namespace 的 LBA 大小。
Base20-1兩個控制器可以共用一個連接埠。
來源:NVME-BASE-2.4, Rev. 2.4, §2.4.1, Figure 20, 文件頁 35, PDF 頁 61
Base20-2主機看到兩個控制器時,不應直接推論存在兩條實體連線;圖將介面物件數與 port 數分開。
Base21-1兩個連接埠提供與單一 port 不同的連接關係。
來源:NVME-BASE-2.4, Rev. 2.4, §2.4.1, Figure 21, 文件頁 36, PDF 頁 62
Base21-2與 Figure 20 比較時,先保留控制器數相同,再觀察 port 由 1 變 2,理解路徑結構到底改變在哪裡。
Base22-1SR-IOV 把 PCIe Function 與控制器介面對應起來。
來源:NVME-BASE-2.4, Rev. 2.4, §2.4.1, Figure 22, 文件頁 37, PDF 頁 63
Base22-2作業系統使用不同 Function 時,仍需辨識各自的控制器與資源關係;多個 Function 不表示有多套獨立 NAND。
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 才不會配錯。 |
來源: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
Base6-1一對一佇列映射讓一個 SQ 的結果送到指定 CQ。
來源:NVME-BASE-2.4, Rev. 2.4, §2.1, Figure 6, 文件頁 22, PDF 頁 48
Base6-2SQ1 送出的兩筆命令都回到 CQ1;結果出現順序仍不一定等於提交順序,需要用識別資訊配對。
Base7-1多個 SQ 可以把完成結果送到同一個 CQ。
來源:NVME-BASE-2.4, Rev. 2.4, §2.1, Figure 7, 文件頁 22, PDF 頁 48
Base7-2SQ1 與 SQ2 的 CID 都可有值 5;共用 CQ 收到結果時,必須連同 SQID 判斷結果屬於哪一筆。
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 只選一個項目。 |
來源: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
Base2-1十進位與二進位容量前綴使用不同倍率。
來源: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,容量仍不相同。
Base3-1Byte、Word、Dword 是不同大小的單位。
來源: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。
05.11.規格的 mandatory、may、optional、reserved、shall、should 各有固定語氣;引用時保留英文 keyword,不能把 may 或 should 翻成 shall。
來源:NVME-BASE-2.4, Rev. 2.4, §1.4.1, 文件頁 2-3, PDF 頁 28-29
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
06.02.命令已放在 Submission Queue 的 entry 中。Doorbell 更新 queue 的進度資訊,讓 controller 知道可處理的範圍;它不是整筆命令的承載位置。
來源:NVME-BASE-2.4, Rev. 2.4, §2.1, 文件頁 21-23, PDF 頁 47-49
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