【问题标题】:Why would a device driver cause page faults?为什么设备驱动程序会导致页面错误?
【发布时间】: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


    【解决方案1】:

    所以您的应用程序向驱动程序请求内存缓冲区,然后您将发送数据复制到该缓冲区中?这是一个很奇怪的模型,通常你让应用程序管理缓冲区。

    如果您的故障页数为 6K/秒,而您仅传输 30MB/秒,那么您传输的每一页几乎都会发生页故障。当您从驱动程序获取数据缓冲区时,它是否总是填零?我想知道您是否在每次传输中都获得了零故障需求。

    -斯科特

    【讨论】:

    • 手册说,出于 DMA 性能原因,使用 IO 缓冲区允许它分配在物理内存中连续的内存块。
    猜你喜欢
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多