SRB Extension ADMA2 方案分析结果

SRB Extension ADMA2 方案分析结果

日期: 2026-03-06
状态: ❌ 方案失败 - SrbExtension 不返回 IOVA


📋 结论

StorPortGetPhysicalAddress(Srb, SrbExtension_member) 不返回 IOVA!

Storport 的 DMA remapping 支持仅针对 DataBuffer,不针对 SrbExtension 内部成员。


1️⃣ 测试结果

日志证据

1
2
3
4
SG[0].Addr=0x00000000FEC002F0   ← IOVA (高地址,来自 DataBuffer)
desc_tbl PA=0x000000007361D5B0 ← PA (低地址,来自 SrbExtension)

DMA Error! Status=0x01 State=ST_FDS ← 硬件无法读取描述符表

地址对比

地址类型 地址值 特征 是否 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
┌─────────────────────────────────────────────────────┐
│ 短期 (当前) │
│ → PIO 模式作为 DMAR 环境的 fallback │
│ 已验证可工作,性能有限但功能正常 │
└─────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────┐
│ 中期 │
│ → 尝试 StorPortAllocateDmaMemory API │
│ 专为 DMA remapping 设计 │
│ 需要 Windows 10 version 1803 (RS4) 或更高 │
└─────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────┐
│ 长期 │
│ → OEM BIOS/SSDT Patch │
│ 将 Bayhub SD Controller 标记为 internal device │
│ 完全绕过 Kernel DMA Protection │
└─────────────────────────────────────────────────────┘

5️⃣ 切换到 PIO 模式

INF 配置

1
2
3
; DMA Remapping 环境下使用 PIO 模式
; 0x8000000F = bit31 valid + mode 0xF = PIO
HKR,"Parameters\GG8", "test_dma_mode_setting",0x00010001, 0x8000000F

已验证功能

  • ✅ 卡识别
  • ✅ 读操作
  • ✅ 写操作
  • ✅ 格式化

6️⃣ 后续调查

StorPortAllocateDmaMemory API

1
2
3
4
5
6
7
8
9
// 专门为 DMA remapping 设计的内存分配 API
// 需要 STOR_FEATURE_FULL_DMA_API 支持
STOR_PHYSICAL_ADDRESS StorPortAllocateDmaMemory(
PVOID HwDeviceExtension,
ULONG NumberOfBytes,
PVOID *VirtualAddress,
STOR_PHYSICAL_ADDRESS *PhysicalAddress,
ULONG Flags
);

如果此 API 可用,可以尝试用它分配 ADMA2 描述符表内存。


7️⃣ 总结

问题 结论
SRB Extension 方案能否解决 DMAR 问题? ❌ 否
原因 Storport 不为 SrbExtension 成员提供 IOVA 映射
短期解决方案 PIO 模式
中期解决方案 尝试 StorPortAllocateDmaMemory
长期解决方案 OEM SSDT Patch

文档生成日期: 2026-03-06