根据 NVMe 规范,BAR 对每个队列都有尾部和头部字段。例如:
- 提交队列
y
尾门铃(SQyTDBL
):- 开始:
1000h + (2y * (4 << CAP.DSTRD))
- 结尾:
1003h + (2y * (4 << CAP.DSTRD))
- 开始:
- 提交队列
y
头门铃(SQyHDBL
):- 开始:
1000h + ((2y + 1) * (4 << CAP.DSTRD))
- 结尾:
1003h + ((2y + 1) * (4 << CAP.DSTRD))
- 开始:
有队列本身还是仅仅是指针?它是否正确?如果是队列,我会假设 DSTRD 表示所有队列的最大长度。
此外,该规范还讨论了两个可选区域:主机内存缓冲区 (HMB) 和控制器内存缓冲区 (CMB)。
- HMB:主机 DRAM 中的一个区域(PCIe 根)
- CMB:NVMe 控制器的 DRAM 内的一个区域(SSD 内)
如果两者都是可选的,那么它位于哪里?由于端点 PCIe 仅适用于 BAR 和 PCI 标头,因此除了 BAR 之外,我看不到它们可能位于的任何其他位置。