【发布时间】:2011-08-10 13:03:31
【问题描述】:
我有一个 Windows 控制台应用程序,它使用并行 IO 卡进行高速数据传输。 (通用标准HPDI32ALT)
我的进程在用户模式下运行,但是,我确信在设备 API 后面的某个地方存在一些内核模式驱动程序活动(PCI DMA 传输、读取设备状态寄存器等)。工作模型大致是这样的:
- 在启动时:我从 API 请求一个指向 IO 缓冲区的指针。
- 在我的主循环中:
- 阻止 API 等待设备缓冲区中的空间(低水位线)
- 用传输数据填充 IO 缓冲区
- 通过将指针传递给 IO 缓冲区开始向设备传输(在此期间,API 使用 PCI 总线上的 DMA 将数据移动到卡中)
- 阻塞等待 IO 完成的 API
应用程序似乎在适当的数据速率和长时间的持续吞吐量下正常工作,但是,当我在 sys internals 工具进程资源管理器中查看进程时,我看到大量页面错误(每秒约 6k )。我正在向卡移动 ~30MB/s。
我有足够的 RAM,并且有理由确定页面错误与磁盘 IO 无关。
对导致页面错误的原因有什么想法吗?我也有这个应用程序的接收端,它在接收模式下使用相同的 IO 卡。 API的接收模式使用不会导致大量页面错误。
将 IO 缓冲区移动到内核模式会导致页面错误吗?
【问题讨论】:
标签: windows driver page-fault