在现代存储技术迅猛发展的当下,重温 Windows 2000 时代 NVMe 驱动的工程实现,仍具启发意义。nvme2k 项目作为一款针对 Windows 2000 的 NVMe 块设备驱动,不仅逆向实现了 NVMe 1.0 协议栈,还跨平台支持 x86(Pentium 及以上)和 Alpha AXP 架构。这种遗产级工程,融合了 SCSI 翻译层、中断处理优化与跨平台块 IO 适配,适用于虚拟化测试或复古系统扩展。本文聚焦其核心技术栈,提供可落地参数与监控清单,帮助开发者复现或扩展类似驱动。
NVMe 协议栈逆向与 SCSI 翻译层
nvme2k 采用 SCSI miniport 驱动模式,通过 ScsiPort.sys 框架桥接 NVMe 控制器与 Windows 2000 存储栈。核心在于协议栈逆向:驱动扫描 PCI 总线,识别类代码 01-08-02(Mass Storage - NVMe)的设备,初始化 Admin 队列(4KB 提交 + 4KB 完成)和单 I/O 队列对(同上尺寸)。
关键证据:驱动使用 PRP(Physical Region Page)机制处理数据传输,支持最大 2MB 块大小,通过 PRP 列表扩展 Scatter-Gather。SCSI 命令翻译层将 READ/WRITE/FLUSH/INQUIRY/READ_CAPACITY 映射为 NVMe Admin/I/O 命令。例如,READ(10) 转换为 NVMe Read 命令,带标签队列支持(Tagged Command Queuing),有序队列标签自动 Flush。
跨平台适配是亮点:Alpha AXP 需要严格 8 字节对齐(#pragma pack(8)),x86 则宽松。命令 ID 编码统一:Bit 15 标记非标签请求,Bit 14 标记有序 Flush,0-13 位为队列标签或序列号,避免 SRB 泄漏。
落地参数:
- 队列深度:NumberOfRequests=32,MaxQueueDepth=32(注册表 via INF)。
- SG 列表上限:MaximumSGList=512。
- 传输块:PRP 列表池 40KB(10 页),限 10 并发大传输。
中断处理与完成队列机制
中断处理绕过 MSI/MSI-X(Win2k 无原生支持), fallback 到传统 INTx。驱动分配非缓存扩展内存(64KB DMA 可达),提交命令至 NVMe doorbell 寄存器,轮询完成队列(CQ)处理中断。
证据:nvme2k_cpl.c 实现完成处理,NonTaggedInFlight 互斥确保单非标签请求序列化。Alpha AXP 的 64 位 PALcode 中断需额外对齐,驱动通过 KeAcquireSpinLock 同步。
监控要点:
- 队列统计:启用 NVME2K_DBG 宏,ScsiDebugPrint 输出队列深度、CID 泄漏。
- 中断延迟:WinDbg !scsiport.miniport ,检查 CQ 尾指针。
- 阈值警报:队列满 >80% 时日志 Flush;PRP 耗尽率 >50% 触发回滚。
风险:单队列架构限并发,虚拟化下(QEMU/VirtualBox)INTx 易丢中断。限值:无电源管理,Namespace 固定 1。
跨平台块 IO 适配清单
构建与部署跨平台需 Windows 2000 DDK(x86: 5.00.2195.1;Alpha: RC1)和 VC++6.0。
构建清单:
- setenv.bat C:\NTDDK free(checked 为调试)。
- build -cZ → obj\i386\nvme2k.sys 或 obj\alpha\nvme2k.sys。
- INF 配置:nvme2k.inf 指定多架构路径(i386/alpha)。
安装参数:
DriverDisk/
├── nvme2k.inf
├── i386/nvme2k.sys
└── alpha/nvme2k.sys
设备管理器 → 指定位置 → “NVMe Storage Controller (Windows 2000)”。
回滚策略:
- 测试前备份 storport.sys。
- 蓝屏(0x7B)时,IDE 兼容模式 + 移除 INF。
- 性能阈值:IOPS < 10k → 降 QueueDepth=16,重启验证。
优化清单:
| 参数 |
默认 |
调优建议 |
场景 |
| MaxQueueDepth |
32 |
16 (低端硬件) |
Alpha AXP |
| MaximumSGList |
512 |
256 |
内存紧张 |
| NVME2K_DBG_CMD |
Off |
On (调试) |
开发 |
| PRP Pool |
10 pages |
+20 (高负载) |
x86 服务器 |
此驱动虽实验性(BSD-3-Clause,无保修),在 Win2k RC2 Alpha 上验证通过,虚拟化下读写速度接近原生。扩展方向:多队列、MSI-X。
资料来源:https://github.com/techomancer/nvme2k(README 与源码);Hacker News 相关讨论。