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