gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 14:36:39 24 4
gpt4 key购买 nike

我正在评估将几年前编写的设备驱动程序从 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 页面)?

非常感谢!

最佳答案

这是一个旧帖子,我希望答案仍然相关...

这里有两部分,PCI target和PCI master access。

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

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

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

关于windows - 为 32 位 PCI 设备编写 Windows 64 位设备驱动程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13865910/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com