SRB Extension ADMA2 方案分析结果
日期: 2026-03-06
状态: ❌ 方案失败 - SrbExtension 不返回 IOVA
📋 结论
StorPortGetPhysicalAddress(Srb, SrbExtension_member) 不返回 IOVA!
Storport 的 DMA remapping 支持仅针对 DataBuffer,不针对 SrbExtension 内部成员。
1️⃣ 测试结果
日志证据
1 | SG[0].Addr=0x00000000FEC002F0 ← IOVA (高地址,来自 DataBuffer) |
地址对比
| 地址类型 | 地址值 | 特征 | 是否 IOVA |
|---|---|---|---|
| DataBuffer | 0xFEC002F0 |
高位地址 (~4GB) | ✅ IOVA |
| SrbExtension | 0x7361D5B0 |
低位地址 (~1.8GB) | ❌ PA |
2️⃣ 与 Microsoft 文档的对比
文档说明
StorPortGetPhysicalAddress: If the Srb parameter is not NULL, StorPort assumes the VA belongs to the SRB’s DataBuffer, SenseInfoBuffer, or SrbExtension member.
实际行为
| 成员 | 文档预期 | 实际测试结果 |
|---|---|---|
| DataBuffer | IOVA | ✅ IOVA |
| SenseInfoBuffer | IOVA | 未测试 |
| SrbExtension | IOVA | ❌ PA |
3️⃣ 可能原因分析
假设 1: SD Host Controller 特殊处理
AHCI 设备(硬盘)通常被认为是 “internal” 设备,可能有完整的 IOMMU 支持。
SD 卡读卡器可能被认为是 “external” 设备,Kernel DMA Protection 对其有不同处理。
假设 2: SrbExtension 内存来源不同
Storport 分配的 SrbExtension 内存可能不经过 IOMMU 映射,只有 DataBuffer 经过映射。
假设 3: Storport 版本差异
不同 Windows 版本的 Storport 可能有不同的 DMA remapping 实现。
4️⃣ 可行方案
方案对比
| 方案 | 可行性 | 性能 | 复杂度 | 说明 |
|---|---|---|---|---|
| PIO 模式 | ✅ 已验证 | 低 (5-15 MB/s) | 低 | 立即可用,无 DMA |
| StorPortAllocateDmaMemory | ⚠️ 待验证 | 高 | 中 | 专为 DMAR 设计,Win10 RS4+ |
| OEM SSDT Patch | ⚠️ 需 OEM | 高 | 高 | 将设备标记为 internal |
建议路线
1 | ┌─────────────────────────────────────────────────────┐ |
5️⃣ 切换到 PIO 模式
INF 配置
1 | ; DMA Remapping 环境下使用 PIO 模式 |
已验证功能
- ✅ 卡识别
- ✅ 读操作
- ✅ 写操作
- ✅ 格式化
6️⃣ 后续调查
StorPortAllocateDmaMemory API
1 | // 专门为 DMA remapping 设计的内存分配 API |
如果此 API 可用,可以尝试用它分配 ADMA2 描述符表内存。
7️⃣ 总结
| 问题 | 结论 |
|---|---|
| SRB Extension 方案能否解决 DMAR 问题? | ❌ 否 |
| 原因 | Storport 不为 SrbExtension 成员提供 IOVA 映射 |
| 短期解决方案 | PIO 模式 |
| 中期解决方案 | 尝试 StorPortAllocateDmaMemory |
| 长期解决方案 | OEM SSDT Patch |
文档生成日期: 2026-03-06