为 32 位 PCI 设备编写 Windows 64 位设备驱动程序

Mik*_*ike 5 windows 64-bit driver dma pci

我正在评估将我几年前编写的设备驱动程序从 32 位移植到 64 位。物理设备是 32 位 PCI 卡。也就是说,设备是 32 位的,但我需要从 Win7x64 访问它。该设备向 Windows 世界提供一些寄存器,然后将大量总线主数据传输到驱动程序分配的内存块中。

我在 Microsoft 文档中读到过,您可以表明驱动程序是否支持 64 位 DMA。如果不是,则 DMA 是双缓冲的。但是,我不确定是否是这种情况。我的驱动程序将/可能是一个完整的 64 位驱动程序,因此它可以支持处理器地址空间中的 64 位地址,但实际的物理设备不会支持它。实际上,设备 BAR 必须映射到 4 GB 以下,并且设备必须获得 PC RAM 地址才能执行 4 GB 以下的总线主控。这是否意味着我的驱动程序将始终通过双缓冲?这是一个对性能非常敏感的过程,双缓冲可能会阻止整个系统工作。

当然,设计新的 64 位 PCI(或 PCI-E)板是没有问题的。

任何人都可以为我提供此过程的一些资源(除了 MS 页面)?

非常感谢!

Ale*_*sky 0

这是一篇旧帖子,我希望答案仍然有用......

这里有两部分,PCI目标和PCI主访问。

PCI目标访问:驱动程序将PCI BAR映射到64位虚拟地址空间,驱动程序仅通过指针进行读/写。

PCI 主设备访问:您需要通过调用IoGetDmaAdapter()创建一个 DmaAdapter 对象。创建时,您还描述您的设备是32位的(参见DEVICE_DESCRIPTION参数)。然后调用DmaAdapter::AllocateCommonBuffer()方法在 PC RAM 中分配连续的 DMA 缓冲区。

但我不确定双缓冲。根据我的经验,不使用双缓冲,相反,如果无法分配满足 DEVICE_DESCRIPTION 的缓冲区(在您的情况下 - 32 位 dma 寻址),DmaAdapter::AllocateCommonBuffer() 就会失败。