Hotdry.
systems-engineering

Windows 2000 的 NVMe 块设备驱动:支持 x86 与 Alpha AXP 的跨平台实现

剖析 nvme2k 开源驱动,为 Windows 2000 工程 NVMe 块设备支持,提供 x86/Alpha AXP 跨平台协议栈逆向、中断处理与块 IO 配置参数。

在现代存储技术迅猛发展的当下,重温 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。

构建清单

  1. setenv.bat C:\NTDDK free(checked 为调试)。
  2. build -cZ → obj\i386\nvme2k.sys 或 obj\alpha\nvme2k.sys。
  3. 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 相关讨论。

查看归档