在 64 位 Windows 中执行 DMA

向驱动程序添加 64 位寻址支持可以显著提高整体系统性能。 对于 (DMA) 执行直接内存访问的设备驱动程序来说,这一点尤其重要。 在 64 位 Microsoft Windows 中,执行 DMA 但不支持 64 位寻址的设备驱动程序是双缓冲的,这会导致相对性能降低。

尽管双缓冲通常 (8 GB 系统上) 单个百分点的影响相对较小,但这足以影响 I/O 密集型任务,例如数据库活动。 随着物理内存量的增加,这种负面的性能影响也会增加。

若要支持 64 位 DMA,驱动程序应遵循以下准则:

  1. 使用 PHYSICAL_ADDRESS 结构进行物理地址计算。

  2. 将整个 64 位地址视为有效的物理地址。 例如,驱动程序不应在锁定的缓冲区上调用 MmGetPhysicalAddress 、放弃高 32 位,并将截断的地址传递给 32 位组件适配器。 这会导致内存损坏、I/O 丢失和系统故障。

  3. 使用在 Windows 2000 中添加 (GetScatterGatherListPutScatterGatherList) 的高性能散点/收集例程。

  4. 检查 Mm64BitPhysicalAddress 全局系统变量的值。 如果为 TRUE,则系统支持 64 位物理寻址。

  5. DEVICE_DESCRIPTION 结构的 Dma64BitAddresses 成员设置为 TRUE 以指示驱动程序支持 64 位 DMA 地址。

32 位 Windows 中的 DMA 例程是 64 位就绪的。 如果设备驱动程序正确使用这些例程,则 DMA 代码应在 64 位 Windows 上无需修改即可正常工作。