NVMe Base 2.4:HMB、Doorbell Emulation 與 Vendor Commands
00.01.這篇說明主機如何把記憶體提供給控制器,以及如何理解 doorbell 位址與廠商命令長度。共同問題是:哪一方可以使用這塊記憶體、何時可以收回,以及欄位中的數值究竟用什麼單位。
這篇的主軸
把主機記憶體借給控制器
01-01HMB 的重點是記憶體使用權:如何提供、允許使用,以及何時能收回。
- HMB
- Host Memory Buffer,由 host 配置並在 enable 期間交由 controller 專用的 volatile memory ranges。
處理容量與生命週期
02-01用容量換算理解描述項,再比較電源轉換和重設對記憶體使用的影響。
讀懂另兩種編碼
03-01Doorbell Emulation 與廠商命令分別用位址和長度算例說明;它們是另外的介面機制。
把主軸連起來
00.02.HMB 的提供、使用與收回形成一個完整流程;電源轉換與 reset 會影響這個流程。Doorbell Emulation 與 Vendor Commands 另以位址和長度算例說明,不把它們當成 HMB 的必要步驟。
01 HMB 記憶體的提供、使用與收回
01.01.HMB 的 value 不在『給 controller 一塊 cache』這句話,而在 ownership protocol。Host 配置 pages 與 descriptor list,enable 成功後停止寫入;controller 使用並初始化;host 要回收時先 disable,直到 CQE posted 才重新取得修改權。
- controller
- controller,實作 NVMe 介面、取走 command 並回報 completion 的控制實體。
- Host
- 主機;執行作業系統並送出 NVMe 命令的一端。
- CQE
- Completion Queue Entry,CQ 中的一筆完成結果資料結構。
- Host 配置記憶體,建立 descriptor list。
- Host 透過 HMB Feature 將記憶體範圍提供給 controller。
- 啟用期間,host 維持描述的記憶體範圍有效。
- 停用並完成規格要求的交接後,host 才能回收記憶體。
01.02.HMPRE=0 表示 HMB 不支援;非零時以 4 KiB units 表示 preferred size,HMMIN 表示 minimum request。HMMINDS 與 HMMAXD 是 descriptor 限制。即使 host 無法提供 HMB,controller 仍必須(shall)正常運作。
- HMMINDS
- Host Memory Buffer Minimum Descriptor Entry Size,每個可用 descriptor 的最低 4 KiB-unit 大小。
- HMMAXD
- Host Memory Maximum Descriptor Entries,controller 可使用的 descriptor entry 上限。
- HMMIN
- Host Memory Buffer Minimum Size,以 4 KiB units 回報 controller 要求的最低大小。
- HMPRE
- Host Memory Buffer Preferred Size,以 4 KiB units 回報 controller 偏好的配置大小。
來源:Base 2.4 §5.2.14.2.1, 8.2.4
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.14.2.1, 8.2.4, 文件頁 357, 362, 744, PDF 頁 383, 388, 770
| HMB 使用階段 | 哪一方可以使用記憶體 | 進入下一階段的條件 |
|---|---|---|
| 啟用之前 | 主機配置記憶體並初始化描述子 | 先核對位址對齊和描述子數量 |
| 啟用命令完成後 | 控制器專用;主機不得修改 | host shall not write |
| 停用命令尚未完成 | 控制器仍可取回必要資料 | 主機仍須等停用完成 |
| 停用命令完成後 | 主機可修改或收回記憶體 | 停用完成後才可修改或回收 |
02 HMB 的描述子、大小與位址
02.01.HSIZE、BSIZE 與 BADD 都依 CC.MPS;HMPRE/HMMIN/HMMINDS 則依 4 KiB units。兩套 unit 不能混用。HMDL 本身要 16-byte aligned,entries 固定 16 bytes;HMDLEC 是 entry count,不是 0's-based,也不是 byte length。
- 0's-based
- 0's-based encoding,以 0 表示實際數量 1;依欄位換算公式通常是欄位值加 1。
- HMDLEC
- Host Memory Descriptor List Entry Count,HMDL 中有效 entries 的數量。
- BSIZE
- Buffer Size,HMB descriptor 中以 CC.MPS pages 表示的連續範圍長度。
- HSIZE
- Host Memory Buffer Size,以 CC.MPS memory-page units 表示的 HMB 總大小。
- BADD
- Buffer Address,HMB descriptor 中依 CC.MPS 對齊的 memory-page address。
- HMDL
- Host Memory Descriptor List,連續存放 16-byte HMB descriptors 的 host-memory array。
- MPS
- Memory Page Size,controller 使用的 memory page 大小設定;影響 queue address 與 PRP 對齊。
- CC
- Controller Configuration,host 用來選擇設定並啟用或停用 controller 的 property。
02.02.Set Features 使用 FID=0Dh;CDW11 放 EHM、MR、HMNARE,CDW12 放 HSIZE,CDW13/14 組成 64-bit HMDL address,CDW15 是 HMDLEC。HMDL address 必須 16-byte aligned;HMDLEC=0 必須回 Invalid Field in Command。
- HMNARE
- Host Memory Non-operational Access Restriction Enable,配置 non-operational HMB access policy 的 bit。
- CDW
- CDW(Command Dword);命令中的 32-bit 欄位單位,例如 CDW10 的 10 是欄位 index,不是 byte offset。
- FID
- Feature Identifier;指定要讀取或設定哪一項 Feature 的編號。
- MR
- Memory Return,表示 host 歸還完全相同的舊 HMB size、addresses、descriptors 與 contents。
來源:Base 2.4 §5.2.30, 5.2.30.2.3
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30, 5.2.30.2.3, 文件頁 456-459, 516-518, PDF 頁 482-485, 542-544
| 大小或位址欄位 | 使用的單位或對齊 | 描述的資源 |
|---|---|---|
| HMPRE/HMMIN | 4 KiB units | capability request |
| HSIZE/BSIZE | CC.MPS units | configured memory |
| HMDL address | 16-byte aligned | CDW13 low + CDW14 high |
| BADD | CC.MPS aligned | BSIZE=0 entry ignored |
03 HMB 在電源轉換與 Reset 後的狀態
03.01.HMNARE 是 access policy,HMNAR 是此刻 state;MR 則描述 reset/RTD3 後是否歸還完全相同的舊內容。這三者不能互換。Controller Level Reset 會讓 controller 丟失 HMB assignment,RTD3 前應先 release,而 non-operational restriction 只限制特定 state 下的 access。
- HMNAR
- Host Memory Non-operational Access Restricted,回報 restriction 此刻是否實際生效的 state bit。
03.02.HMNARE 只有 Identify.CTRATT.HMBR=1 時可啟用。HMNARE 是 policy,HMNAR 是 controller 此刻是否真的因 non-operational state 而被限制;Admin commands 與其啟動的 background operations 有明文例外。NOPPME 不改變這項 HMB restriction。
- NOPPME
- Non-Operational Power State Permissive Mode Enable,控制 controller background work 能否暫時超過 non-operational power limit。
- Admin
- Administrative,建立、設定、查詢或管理 controller 與 queue 的控制路徑。
來源:Base 2.4 §5.2.30.2.3
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.2.3, 文件頁 516-519, PDF 頁 542-545
| HMB 狀態或設定 | 描述的限制或記憶體來源 | 何時可以採用這個值 |
|---|---|---|
| HMNARE | 設定的使用政策 | 需要 CTRATT.HMBR |
| HMNAR | 目前生效的限制狀態 | 可能因 operational state 而為 0 |
| MR=1 | 交回符合相同條件的原有 HMB | size/address/list/content 全相同 |
| MR=0 | 新提供的記憶體,內容尚未初始化 | controller 重新初始化 |
04 DSTRD、NDT 與 NDM 的單位
04.01.software emulator 與 vendor command passthrough 都在處理 untrusted encoded values。DSTRD 要套 2^(2+x) 才是 bytes;NDT/NDM 已是實際 dword count,要乘 4、不能再加 1。正確公式不同,但目的相同:在 MMIO 或 DMA 前先證明 address 與 length。
- DSTRD
- Doorbell Stride,CAP 中決定相鄰 doorbell register 間距的欄位。
- Dword
- Dword(Double word);32 bits,也就是 4 bytes。對比 word=16 bits;例如 zero-based dword count=3 代表 4 個 Dwords,也就是 16 bytes。
- MMIO
- Memory-Mapped I/O,以 CPU memory access 形式讀寫裝置 register。
- NDM
- Number of Dwords in Metadata Transfer,standard vendor-specific format 中的實際 metadata dword 數。
- NDT
- Number of Dwords in Data Transfer,standard vendor-specific format 中的實際 data dword 數。
04.02.CAP.DSTRD 的實際間距是 2^(2+DSTRD) bytes。DSTRD=0/2/4 分別得到 4/16/64 bytes;software emulation 可用 64-byte stride 把 doorbells 分散到 cacheline,硬體 NVMe interface 的 expected value 是 0h。
- NVMe
- Non-Volatile Memory Express,主機與非揮發性記憶體子系統之間的介面規範家族。
- CAP
- Controller Capabilities,offset 00h 的 controller property,回報 queue、page size、timeout 與其他能力。
來源:Base 2.4 §3.1.4.1, 8.2.3
來源:NVME-BASE-2.4, Rev. 2.4, §3.1.4.1, 8.2.3, 文件頁 56, 744, PDF 頁 82, 770
| 位址或長度欄位 | 換算公式 | 該值作用於哪個對象 |
|---|---|---|
| DSTRD | 2^(2+x) bytes | 0→4 B;4→64 B |
| NDT | value×4 data bytes | 不是 0's-based |
| NDM | value×4 metadata bytes | 獨立 buffer bound |
| VSCF/SNVSCF | 格式選用條件 | Admin 與 I/O 分開 |
- metadata
- 隨 logical block 儲存的附加資料,可包含資料保護資訊,也可有其他用途。
- SNVSCF
- Same NVM Vendor Specific Command Format,ICSVSCC 中表示 I/O commands 是否使用 Figure 94 的 bit。
- VSCF
- Vendor Specific Command Format,AVSCC 中表示 Admin commands 是否使用 Figure 94 的 bit。
- I/O
- Input/Output,對 namespace 執行資料輸入與輸出的操作類別。
接著打開 Spec 看什麼
05.01.以下按概念列出閱讀位置。報告時先用上面的流程說明問題,再打開對應章節看欄位與完整條件。中文教學 HTML 另有本篇全部圖表的逐圖重點、案例與細節。
| 要說明的觀念 | Spec 閱讀位置 |
|---|---|
| HMB 記憶體的提供、使用與收回 | Base 2.4 §5.2.14.2.1, 8.2.4 · Base 2.4 §5.2.30.2.3, 8.2.4 · Base 2.4 §5.2.30.2.3 · Base 2.4 §8.2.4 |
| HMB 的描述子、大小與位址 | Base 2.4 §5.2.30, 5.2.30.2.3 · Base 2.4 §5.2.30.2.3 · Base 2.4 §5.2.12, 5.2.30.2.3 |
| HMB 在電源轉換與 Reset 後的狀態 | Base 2.4 §5.2.30.2.3 · Base 2.4 §8.2.4 |
| DSTRD、NDT 與 NDM 的單位 | Base 2.4 §3.1.4.1, 8.2.3 · Base 2.4 §5.2.14.2.1, 8.1.29 · Base 2.4 §4.1.1, 8.1.29 |
學完後想一想
1. HMB 記憶體原本由 host 配置,host 是否能在 controller 使用時直接重用?
06.01.不能。提供給 controller 的期間必須維持記憶體與描述資訊有效;應完成規定的停用及交還程序後才回收。實體配置者與目前可使用者是不同概念。
來源
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.2.3, 8.2.4, 文件頁 515-516, 744, PDF 頁 541-542, 770
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.2.3, 文件頁 515-516, PDF 頁 541-542
2. 知道 HMB descriptor 有 4 筆,就知道總容量了嗎?
06.02.還需要每筆 buffer size 和 page size。Descriptor 數只計算分段數;總容量是各段 page 數乘 page size 後加總,並需符合 HSIZE 與能力限制。
來源
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.2.3, 文件頁 517-518, PDF 頁 543-544
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.2.3, 文件頁 516-518, PDF 頁 542-544


Comments