NVMe架构与操作原理 - ✅ 一、ASCII 字符串与十六进制 ASCII 字符串 (第16页)
在 NVM Express® Base Specification, revision 2.0b 第 1.4 节中,接下来的这部分讲述了 数值表示法的规范约定。虽然这些内容看起来是格式问题,但对我们准确解析字段数值、命令参数、寄存器位值等是至关重要的基础知识。接下来我会结合具体示例,为你深入讲解这段内容。
✅ 一、ASCII 字符串与十六进制 ASCII 字符串
🔹 普通 ASCII 字符串(回顾)
- 字符码范围:
20h
到7Eh
,即可显示字符。 - 常见用途:
Model Number (MN)
、Serial Number (SN)
、NQN
、Firmware Revision
等字段。
🔹 十六进制 ASCII 字符串(Hexadecimal ASCII string)
仅允许包含以下字符: -
0
~9
-A
~F
(大写) -a
~f
(小写)
🧩 例子:
- ✅ 合法的十六进制 ASCII 字符串:"1F2a9B"
- ❌ 非法示例:"1G23"
(含非法字符 G)
✅ 常见用途:如表示 命名空间 UUID、认证 token、密钥摘要值(hash digest)等字段。
✅ 二、数值进制及其写法规范
📍 1. 十六进制(Hexadecimal)
- 格式:后缀小写
h
- 示例:
0FFFh
,80h
📘 多于 8 位的十六进制数:
- 使用下划线
_
每 8 位分组: - 示例:
1E_DEADBEEFh
✅ 实际应用: 在协议中常见于长地址字段、大容量寄存器值,如:
128-bit UUID
,128-bit hash key
📍 2. 二进制(Binary)
- 格式:后缀小写
b
- 示例:
1001b
,10b
📘 多于 4 位的二进制数:
- 使用下划线
_
每 4 位分组: - 示例:
1000_0101_0010b
✅ 实际应用: 常用于字段位域(bitfield)结构解析,如:
Controller Capabilities Register(CAP):
Bits [0:0] – MQES (Max Queue Entries Supported)
Bits [1:1] – CQR (Contiguous Queues Required)
📍 3. 十进制(Decimal)
- 格式:仅数字,不带后缀(不能跟
b
或h
) - 示例:
175
,1024
,32768
✨ 十进制表示法的格式约定:
规则 | 举例 |
---|---|
a. 小数点使用 . |
3.1415 |
b. 千位分隔符使用 , |
1,000 , 2,048,000 |
c. 小数部分不使用逗号 | 1,024.512 ✅(不是 1,024.512,000 ) |
d. 年份不使用逗号 | 2023 ✅(不是 2,023 ) |
✅ 三、典型应用示例对比
类型 | 示例 | 用途 |
---|---|---|
十进制(无后缀) | 1024 |
常用于容量、计数值 |
十六进制(加 h) | FFh , 1E_DEAD_BEE1h |
控制器寄存器值、标识符 |
二进制(加 b) | 1010b , 0011_1100b |
位标志、寄存器位图 |
十六进制 ASCII 字符串 | "A5f9" |
表示 UUID、身份令牌等 |
🧠 补充技巧:如何判断某字段是 hex、binary 还是 decimal?
当你在阅读 NVMe 结构表时,如果看到如下情形,可以这样判断:
- 字段默认数值如
0
,1
,255
→ 默认十进制; - 若有后缀
h
→ 十六进制; - 若有后缀
b
→ 二进制; - 长字符串包含
a-f
,0-9
,且被称为 "hex ASCII" → 十六进制 ASCII 字符串;
✅ 总结记忆口诀:
"十六后 h,二进后 b,分组用下划,不带后缀是十进。"
"ASCII 定长填空格,hex 字符需合法。"
你现在已经掌握了 NVMe 协议中字段数值和字符串表示的标准语法。这些知识会频繁出现在控制器寄存器(如 CAP、VS、CC)、命令字段(如 CDW10~15)、日志条目、Identify 数据结构等部分。
是否希望我结合具体结构(如 Identify Controller 或 Log Page)来演示如何解读这些字段?我们可以立即开始做字段级位图还原!