高级特性 - 🧱 主机元数据结构(Host Metadata Data Structure)详解(图 360) (第323页)
我们继续深入学习 NVMe 2.0b 规范中 Host Metadata 特性的结构和解析机制,从你提供的内容来看,我们已经进入 元数据数据结构定义(Host Metadata Data Structure) 的核心部分。
🧱 主机元数据结构(Host Metadata Data Structure)详解(图 360)
这是 NVMe Host Metadata 功能的核心结构,总大小为 4 KiB(4096 字节),承载多个 Host Metadata Element(元数据元素)。
📘 结构布局:
| 字节范围 | 字段名 | 含义 |
|---|---|---|
00h |
Number of Metadata Element Descriptors | 当前数据结构中元数据条目的个数(元素个数) |
01h |
Reserved | 保留 |
02h:x |
Metadata Element Descriptor 0 | 第一个元素条目的内容 |
x+1:y |
Metadata Element Descriptor 1 | 第二个条目 |
| ... | ... | 最多可填满 4KiB 空间 |
🧩 元数据元素条目结构:Metadata Element Descriptor(图 361)
这是每一个 Host Metadata 元素的单条数据描述结构,包含类型、长度、版本和实际值。
📘 字段解释:
| 位段 | 字段名 | 含义 |
|---|---|---|
04:00 |
Element Type (ET) | 指明这个元数据的类型,例如平台名称、BIOS 版本等 |
11:08 |
Element Revision (ER) | 元数据版本,当前规范统一为 0h |
15:12 |
Reserved | 保留位 |
31:16 |
Element Length (ELEN) | 元数据值 Element Value (EVAL) 的字节长度 |
31 + (ELEN*8) : 32 |
Element Value (EVAL) | 元数据的实际值,可以是字符串或其他编码内容 |
✅ 插入或替换元素时的约束:
- 如果 ELEN = 0h 而你是想插入或更新(EA=00b),则行为未定义(可能出错!)。
- 如果是 删除操作(EA=01b),则
ELEN必须设为0h。
🔎 Metadata Element Type 的分类
✔ 支持的 Element Type 类型(图 361 末尾 + 图 362):
| 值范围 | 含义 |
|---|---|
01h ~ 17h |
由规范定义的类型,具体见图 362 和图 363 |
18h ~ 1Fh |
厂商自定义类型(Vendor Specific) |
00h |
保留,不可用 |
🔖 实战教学:一次写入 Platform Name 示例
假设你要写入一条记录到 Enhanced Controller Metadata (FID = 7Dh) 中,Element Type 是 01h(平台名),内容为字符串 "ThinkStation-P620",则步骤如下:
- 构造一个
Set Features命令,FID 设置为7Dh。 - Command Dword 11 的 EA 设为
10b(Add Entry Multiple)。 - 构造 Metadata Element Descriptor:
- ET =
01h - ER =
00h - ELEN =
0Fh(字符串 15 字节) - EVAL =
"ThinkStation-P620"(ASCII 编码) - 数据结构打包成总共 4KiB(补 0 填充)
💡 小结:
| 项 | 要点 |
|---|---|
| 数据结构大小 | 固定 4 KiB |
| 可否重复类型 | 仅 Enhanced Controller Metadata 支持同一 Element Type 多条 |
| 插入/删除规则 | 用 EA 控制增删,ELEN 控制是否有效 |
| 值的类型 | EVAL 通常为字符串,视 Element Type 而定 |
| 厂商定制空间 | 允许 8 个 Vendor Specific 类型 (18h~1Fh) |
如果你需要,我可以:
- 为你写出这个 Host Metadata 结构的 十六进制表示
- 提供一个完整的 JSON 示例结构
- 帮你画图或生成填充脚本(Python/C)
需要哪一个?我可以接着继续讲图 362 的 Controller Metadata Element Types 定义。